Domanda:
Come posso evitare il rischio di cancellare erroneamente i dati da un ambiente di produzione senza backup?
Jude Niroshan
2015-04-16 11:43:51 UTC
view on stackexchange narkive permalink

Sono uno sviluppatore junior che non è ancora sicuro del mio ruolo. Ho a che fare con dati molto sensibili e irrecuperabili nel nostro ambiente di produzione. Gran parte del mio carico di lavoro implica attività diverse nel nostro ambiente live. Se ho cancellato per errore alcuni dati importanti, cosa dovrei fare? Io manualmente (usando gli script SQL) sposto le cose nel database qua e là.

Dovrei chiedere ai miei anziani di non affidarmi questo tipo di compiti rischiosi? Sarebbe come dire che non posso gestire alcun lavoro rischioso. Voglio dire loro di non sovraccaricarmi di lavori rischiosi. Qual è l'approccio migliore per chiederlo?

Non è possibile ripristinare i dati dai backup poiché i dati che gestisco cambiano frequentemente. In realtà, non ho ancora cancellato nulla per sbaglio. È una situazione ipotetica.

Dato che ti consideri inesperto, sei sicuro che queste modifiche ai dati non siano recuperabili? Forse hai bisogno di chiedere cosa fare per ogni evenienza.
I commenti non sono per discussioni estese; questa conversazione è stata [spostata in chat] (http://chat.stackexchange.com/rooms/22931/discussion-on-question-by-jude-niroshan-if-i-mistakenly-delete-some-data-from- pr).
non puoi implementare almeno gli script di backup di base
La soluzione ai dati altamente dinamici non è "non avere backup", ma piuttosto avere il mirroring / replica dei dati in tempo reale oltre ai backup periodici.
@LindaJeanne sì. Abbiamo diversi database slave e ho a che fare con il database master.
Nove risposte:
user8036
2015-04-16 12:25:03 UTC
view on stackexchange narkive permalink

Una cosa che puoi fare ora è verificare quali misure di sicurezza sono in atto. Questo mostra l'assunzione di responsabilità. La tua azienda dispone di backup recenti nel caso qualcosa vada storto? Puoi tu eseguire backup ad-hoc prima di modificare le parti critiche? Stai lavorando su sistemi di test e disponi di una buona procedura per implementare le modifiche nei sistemi live? Ecc.

Se mancano queste misure di sicurezza, richiedi di averle a disposizione.

A proposito, sono sorpreso che tu dica che stai lavorando con dati non recuperabili . Se è davvero così, è una bandiera rossa per l'azienda nel suo insieme. Niente (beh, il meno possibile) dovrebbe essere "irrecuperabile".

"fare una richiesta per averli a disposizione"? Sono sicuro al 90% che la risposta sarà "no". Le aziende che sanno che sono necessari i fail-safe li hanno già installati prima che uno sviluppatore junior li richieda. Quelli che non li hanno sono quelli che credono che "Non ho bisogno di rinforzi puzzolenti, è tua responsabilità essere infallibile, e la paura che ti spari se succede qualcosa ti assicurerà che non commetti errori mai". Non cambiano i loro modi solo perché un nuovo sviluppatore junior lo ha chiesto. Quindi, in realtà, questa risposta è un vicolo cieco. \
@rumtscho La richiesta va fatta comunque, con lo 0,2% di possibilità che abbia un capo che effettivamente capisca quanto sia importante questo, e in modo che la richiesta possa essere documentata per evitare future puntate.
@rumtscho O forse nessuno ha mai portato l'idea a qualcuno che può spendere i soldi per la soluzione ... Mi sono stati consegnati set di dati mal gestiti in passato e ho avuto un buon successo con la richiesta di un aggiornamento dell'infrastruttura per gestirli meglio.
Hai bisogno di backup, non solo per proteggere i dati dei clienti, ma per rendere il lavoro ragionevolmente efficiente. Ad esempio, se sai che non ci sono backup, probabilmente lavorerai in un modo troppo cauto, ad es. ricontrollare ogni singolo comando sulla macchina locale utilizzando alcuni dati di test, rallentando anche le attività di routine. Se è necessario eseguire un hotfix sulla macchina live, farlo in modo efficiente ma avere un piano di rollback nel caso in cui l'hotfix interrompa qualcos'altro in modo imprevisto.
PointlessSpike
2015-04-16 17:29:29 UTC
view on stackexchange narkive permalink

Non dovresti mai e poi mai modificare i dati di produzione irrecuperabili.

Non lo sottolineerò mai abbastanza. Dovresti essere disposto a prendere una posizione su questo. Se fossi in me, farei due richieste.

  1. Che ci sono backup frequenti (idealmente, più di un set) eseguiti automaticamente. La frequenza dipende dalla sensibilità dei dati, ma direi almeno una volta al giorno. Il cliente sarà disposto ad accettare una settimana di dati persi se qualcosa va storto?

  2. Che non sei tu a farlo. Questo è in realtà più importante, ma il primo dovrebbe essere ancora il caso. Tu, uno sviluppatore di software, non dovresti scherzare con i dati in tempo reale. Non conosco le dimensioni della tua azienda, ma lavoro in un'azienda di cinquanta e gli sviluppatori vengono rimproverati se interagiscono con il sistema live. Se hai un reparto di supporto, questo è il loro lavoro e dovresti, anche con i backup, sentirti a disagio nel toccare i dati in tempo reale. Il lavoro di sviluppo dovrebbe essere svolto solo su un sistema di sviluppo. Se è necessario fare qualcosa al sistema live, convincili a farlo, anche a costo dell'efficienza. Se necessario, fornire uno script ben collaudato. In genere, tuttavia, qualsiasi modifica dovrebbe avvenire solo quando tutti sono consapevoli che il sistema potrebbe non funzionare, quindi i clienti devono essere consapevoli di questa possibilità. Se è necessario che tu tocchi i dati in tempo reale come sviluppatore, non farlo senza backup, nemmeno qualcosa di piccolo.

Queste cose sono piuttosto semplici. Dovresti sempre considerare i potenziali effetti degli errori e fare tutto il possibile per ridurre al minimo tali rischi. Potrebbero sembrare eccessivamente cauti, ma se non prendi precauzioni, le conseguenze personali saranno molto maggiori se qualcosa va storto.

Nessuno sviluppatore dovrebbe mai eseguire script su un database di produzione. Non dovrebbero nemmeno avere i diritti per farlo. Solo un DBA o un membro del team Build dovrebbe farlo o nel peggiore dei casi solo i manager dovrebbero farlo. Una società che consente agli sviluppatori junior l'accesso alla produzione merita ciò che ottengono.
@HLGEM D'accordo, purtroppo la realtà è che così tante aziende hanno sviluppatori, bravi, che sono praticamente costretti a fare questo tipo di schifezze rischiose tutto il tempo. "Ehi Jim! Kim ha appena caricato i nuovi lead per la produzione tramite il portale, l'ufficio legale vuole che cambiamo la loro fonte in modo che la contabilità possa fatturarli correttamente, ce ne sono 60.000, oh e la contabilità deve essere in grado di iniziare a fatturare in un'ora, quindi noi non hai tempo per copiare i dati nel database dev, fallo accadere! conta su di te campione! " * facepalm * (vorrei che fosse uno scherzo)
@HLGEM: Non tutte le aziende sono abbastanza grandi per _avere_ un "DBA" o "Build team". E di certo non ho mai incontrato un manager che abbia la prima idea di come fare una cosa del genere.
Ci dovrebbe sempre essere qualcuno il cui compito è supportare i sistemi attualmente attivi e i clienti che li utilizzano. Ecco chi fa queste cose.
@PointlessSpike A volte una persona svolge due ruoli. Forse lo sviluppatore è anche lo staff di supporto. Sono stato impiegato come ingegnere del software, ma ho anche svolto attività di build, test engineering e assistenza clienti nell'ambito dello stesso ruolo. Lavori con il personale che hai.
@Lightning Ci sono stato: nelle micro-startup le persone devono indossare molti cappelli. Ma anche lì le uniche persone che dovrebbero avere accesso agli aggiornamenti a un server di produzione sono persone che sanno esattamente cosa stanno facendo, che sanno come provare in anticipo anche la più piccola modifica in un ambiente di test e che sono fidate dall'azienda per farlo. Preferibilmente il meno possibile.
In tal caso, backup e qualcuno che sa come fare tutte queste cose. Se hai qualcuno che svolge più ruoli come quello, probabilmente dovrebbe essere sperimentato.
Se la seconda persona che assumi non è uno specialista di database quando hai un'applicazione incentrata sui dati, sei già nei guai. Se hai un database di produzione e nessun dba, sei nei guai. Non importa le dimensioni dell'azienda, è importante assumere le persone giuste per le attività che devono essere svolte. Se hai più di uno sviluppatore di applicazioni, dovresti aver già assunto un dba. Se hai un solo sviluppatore di applicazioni, non dovresti aver assunto qualcuno junior. Se hai fatto un lavoro sbagliato non assumendo le specialità corrette, allora sei troppo biasimevole quando le cose non vanno bene.
@HLGEM Mi dispiace, ma la tua insistenza sul fatto che nessuno "sviluppatori" abbia accesso a prod non ha senso. A volte, uno sviluppatore (anche se probabilmente non è un junior) è la persona più qualificata per eseguire un'attività. Comunque, dipendere ciecamente da qualche tipo di silo non ti salverà. Il modo per ridurre il rischio è con una buona strategia di recupero e test approfonditi. Non importa se lo fa uno sviluppatore, un DBA o un ingegnere di sistema; hai solo bisogno di qualcuno competente nel compito.
rdab
2015-04-16 13:34:39 UTC
view on stackexchange narkive permalink

Prima di eseguire qualsiasi operazione che potrebbe causare la perdita di dati, è necessario assicurarsi di disporre di un piano di ripristino. Questo di solito significa eseguire un backup manuale del database prima di eseguire qualsiasi script SQL che modifica i dati. Ciò fa parte della tua responsabilità in quanto persona che esegue il lavoro.

La prossima volta che ti viene chiesto di svolgere tale lavoro, fai sapere al tuo manager di linea che farai un backup immediatamente prima di eseguire il modifica.

Nota a margine: è sempre utile racchiudere i tuoi script sql in BEGIN TRANSACTION .. ROLLBACK TRANSACTION per la prima volta che li esegui sui dati di produzione. Questo esegue lo script e mostra l'output, senza applicare effettivamente le modifiche. Questo fornisce una buona indicazione su quanti record verranno modificati e se ci saranno errori.

Sì, pensa a "Cosa hai sbagliato?" * prima * va storto. Tuttavia, il consiglio su "BEGIN TRANSACTION ..." mi sembra un po 'pericoloso: anche con quello applicato, la query potrebbe comunque mettere fuori servizio un sistema di produzione, ad esempio causando un carico eccessivo. Queste cose dipendono troppo dalla situazione specifica, non esiste un modo "sicuro" universale per eseguire le cose su un sistema di produzione.
@sleske se dovesse causare un carico eccessivo e arrestare il server, lo farebbe con o senza la transazione di inizio / rollback, quindi non vedo lo svantaggio di usarlo rispetto alla semplice esecuzione dello script
Sì, certo, e scusa, non è quello che intendevo. Volevo dire: anche con ROLLBACK alla fine, l'esecuzione dello script può * ancora * causare problemi. Ovviamente aggiungere il ROLLBACK è molto meglio che correre senza di esso subito. Volevo solo avvisare le persone che questo poteva ancora essere pericoloso.
Non dimenticare di verificare che puoi ripristinare (o almeno recuperare i tuoi dati) dal backup prima che tu abbia effettivamente bisogno di farlo per davvero!
CodeGnome
2015-04-17 22:21:11 UTC
view on stackexchange narkive permalink

Rischio organizzativo e due diligence individuale

Se ho cancellato per errore alcuni dati importanti, cosa dovrei fare? Io sposto manualmente (utilizzando script SQL) le cose nel database qua e là.

La questione se l'azienda sta facendo la cosa giusta ™ apportando modifiche ai dati di produzione che non ha backup è davvero una decisione aziendale che è al di sopra del tuo paygrade. Sebbene tu possa certamente raccomandare di non farlo a causa dei rischi, sarei molto sorpreso se non fossero già consapevoli dei rischi e li considerassero rischi accettabili per l'azienda rispetto ai costi di fare qualcosa di sistemico al riguardo .

Da parte tua, dovresti eseguire i tuoi backup completi o parziali prima di apportare modifiche. Anche se potrebbe essere poco pratico eseguire il backup dell'intero sistema, puoi sicuramente eseguire il dump dei record che intendi modificare o dei file di configurazione che intendi modificare in modo da poterli ripristinare in caso di errore.

Questo non proteggerà da errori catastrofici (ad esempio, l'eliminazione dell'intero database, ad esempio), ma sicuramente assicurerebbe che se apporti modifiche al record 12345 puoi ripristinare quel record dopo aver apportato le modifiche se risultano le tue modifiche erano errati.

Ricorda solo che, sebbene tu abbia una responsabilità professionale di portare i rischi all'attenzione della tua direzione e di mitigarli così come sei in grado di lavoro, il team di gestione della tua organizzazione possiede effettivamente il 100% del rischio aziendale. Se hai svolto la dovuta diligenza al meglio delle tue capacità, qualsiasi rischio residuo ricade sull'organizzazione piuttosto che su di te.

In caso di incidente ...

Nel caso in cui qualcosa fa vada storto, la tua responsabilità professionale è informare immediatamente qualcuno che ha autorità. Dovresti far loro sapere cosa è successo, quali dati sono stati persi, cosa (se non altro) sei in grado di recuperare e offriti di aiutarti con eventuali sforzi di recupero aggiuntivi che potrebbero essere necessari.

Questi tipi di errori non dovrebbe essere coperto. Tuttavia, mentre dovresti essere responsabile di eventuali errori o errori che hai commesso, ricorda che la responsabilità di avere un sistema senza adeguate protezioni è un rischio che appartiene all'organizzazione, non a te. Assumiti la responsabilità della tua parte nell'incidente, ma non assumerti la colpa del fallimento di un sistema senza adeguate garanzie.

C'è una grande differenza tra assumersi la responsabilità e assumersi la colpa. Assicurati di accettare solo il primo e non il secondo, a meno che tu non abbia fatto veramente qualcosa di negligente.

Matthieu M.
2015-04-17 17:42:23 UTC
view on stackexchange narkive permalink

In realtà ci sono due domande in una:

  • chi dovrebbe essere responsabile delle modifiche nei dati di produzione?
  • qual è il modo migliore per eseguire tali modifiche?

Consentitemi di affrontarli separatamente.


Chi dovrebbe essere responsabile delle modifiche ai dati di produzione?

Nessuna singola persona.

Qual è il modo in cui stai eseguendo il cambiamento; un cambiamento nella produzione (o in qualsiasi sistema sensibile) dovrebbe essere esaminato da almeno un'altra persona (esperta) e approvato da qualche manager.

Questo è lavoro di squadra e obbedisce alla catena di responsabilità. Quindi a questo punto, non importa se fai un errore:

  1. Verrà applicato solo se qualcun altro lo ha esaminato (e non ha notato il problema)
  2. Verrà applicato solo se un manager l'ha approvato (e se ne è assunto la responsabilità)

Se nessun manager è disposto ad assumersi la responsabilità del cambiamento, non eseguirlo.

Se le persone discutono sulla sensibilità temporale del cambiamento, dì loro che non si dovrebbe mai confondere essere veloci per correre . In realtà, vorrei sostenere la extra cura in caso di urgenza (un altro revisore, ad esempio), in particolare perché la pressione aumenta la possibilità di errori. È molto più veloce avere ragione la prima volta, piuttosto che fare confusione, ripulire il casino e infine eseguire la modifica.


Qual è il modo migliore per eseguire queste modifiche?

Idealmente :

  • è disponibile un backup e c'è una procedura di ripristino
  • la modifica viene eseguita tramite uno script, che è accompagnato da uno script di fallback controllato (*)

Ora, sfortunatamente, le condizioni non sono sempre ideali.

I backup sono buoni, ma in un ambiente live in cui i dati cambiano ogni secondo non è possibile mantenerli esattamente aggiornati; i backup possono essere utilizzati solo in caso di errori massicci e accettando che le ultime modifiche andranno perse. Questo è il motivo per cui non posso insistere abbastanza sullo scripting delle modifiche e sul controllo che lo script di fallback funzioni come previsto.

Alcune modifiche non possono essere annullate. Ad esempio, quando si rimuove una colonna, i dati in questa colonna non possono essere ripristinati in caso di problemi. Tali modifiche dovrebbero essere eseguite in due passaggi:

  • in un primo passaggio, disabilitare l'accesso alla parte di dati che verrà eliminata, senza eliminarla effettivamente; nel caso della colonna, rinominala ad esempio. Questo passaggio può essere annullato.
  • quindi, quando è stato accertato che la modifica era valida (diversi giorni o settimane sono trascorsi senza problemi), esegui la modifica non di riserva in uno script monouso

(*) Per controllare uno script di fallback, devi eseguire lo script su una copia del database reale, quindi applicare lo script di fallback e controllare che i dati siano tornati alla normalità.

(*) Ho visto il suggerimento di fare la modifica in una transazione; questo è insufficiente (cosa succede se ti rendi conto del tuo errore dopo il commit?), soggetto a contese (stai bloccando tutte le righe modificate finché non effettui il commit) e non sempre possibile (set di modifiche troppo grande / rischi di deadlock). Tuttavia, se possibile, utilizza le transazioni all'interno dello script poiché le modifiche eseguite a metà sono più difficili da ripiegare.

HLGEM
2015-04-16 18:55:47 UTC
view on stackexchange narkive permalink

Se sei bloccato con questo sistema (e lo respingerei seriamente perché è estremamente rischioso e una cattiva pratica), questo è quello che farei.

Per prima cosa crea una tabella di backup per il dati che influenzerai (abbiamo un database zero per cose che possono essere utilizzate solo una volta). A seconda della dimensione dei dati, potresti voler creare un indice su questo)

Una volta che hai la tabella di backup, metti tutto in una transazione. Quindi, quando esegui la query per influenzare il join dei dati nella tabella di backup che hai creato.

Quando esegui, esegui un passaggio alla volta e prendi nota di quanti record ci sono nella tabella di staging, se i dati sono interessati nella query di azione non corrisponde al numero di record nella tabella, ti consigliamo di eseguire il rollback e poi capire perché.

Questo approccio ti offre anche la massima flessibilità per ripristinare se la modifica è stata negativa in quanto è più facile e generalmente più veloce aggiornare una tabella ai vecchi valori piuttosto che ripristinare l'intero database. E se solo pochi record sono stati modificati per errore, hai la possibilità di riportare solo quelli ai vecchi valori.

Un'alternativa a tutto questo è avere tabelle di audit che registrano tutte le modifiche. Tuttavia, è improbabile che tu abbia quelli se gli sviluppatori eseguono le cose direttamente in produzione. Personalmente non prenderò mai in considerazione la possibilità di avere un database senza l'audit perché è ottimo per correggere gli errori provenienti dall'interfaccia utente, nonché le importazioni di dati e gli script di azioni ad hoc che vengono eseguiti sul database, incluso il punto in cui i dati vengono modificati in modo dannoso. ma lavoro in un ambiente normativo in cui è un requisito.

Aggiunto in seguito Mi sono dimenticato di menzionare, chiedi a qualcun altro di rivedere il codice cosa stai facendo prima di farlo.

Edwin Lambregts
2015-04-16 12:25:11 UTC
view on stackexchange narkive permalink

Sono abbastanza sicuro che tu ne sia consapevole, ma sottolineerò comunque l'ovvio: prova, prova e fai altri test. Ci sono così tante cose che possono andare storte se non si eseguono test adeguati, uno dei tanti è la rimozione accidentale dei dati. Imitando l'ambiente di produzione con dati effettivi, puoi eseguire test in un ambiente realistico e ridurre al minimo errori e bug.

Tieni presente che, anche dopo ore di test approfonditi, gli errori e accadrà . In tal caso, riferisci al tuo supervisore / manager e spiega. Se con qualsiasi mezzo il tuo codice interrompe una connessione al database, milioni di record che avrebbero dovuto essere inseriti andranno persi (solo un esempio, però). Se trovi un errore o sospetti un errore: fallo sapere alle persone .

Tim
2015-04-16 23:24:35 UTC
view on stackexchange narkive permalink

Se devi fare QUALSIASI COSA in un sistema di produzione, fallo in una transazione. (Oppure lascia che sia un amministratore di database a farlo se ne hai uno)

Alcuni anni fa ho visto l'aspetto di orrore del mio capo mentre eseguiva un "semplice" aggiornamento su un database di produzione, senza un WHERE clausola.

Se avesse utilizzato una transazione, avrebbe potuto emettere un ROLLBACK e salvarsi una notte di panico nel recupero dei dati da un backup a un sistema di produzione ancora in esecuzione. (Il rollback avrebbe richiesto due secondi, non quattro ore ...)

(Sembra un cartone animato di Scott Adams, ma sì, l'ho visto accadere ...)

Il mio capo ci racconta regolarmente della volta in cui ha lasciato cadere un intero database mentre faceva un corso di formazione. È stato preso dal panico per un minuto perché lo aveva fatto in produzione, ma ha avuto la fortuna di averlo fatto sul nostro database del server di prova.
Doug Krugman
2015-04-18 00:40:00 UTC
view on stackexchange narkive permalink

Un altro modo semplice per prevenire errori catastrofici è prendere l'abitudine di aggiungere un'istruzione limite (ad es. limite 1; se stai cambiando solo un record).

Quindi, se stai modificando qualcosa come una tabella utente, anche se hai dimenticato una clausola WHERE come ha fatto il capo di @ tim, sbaglieresti solo un record utente e non ogni singolo record utente.



Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...