Fissaggio sicuro dei dati del database di produzione

21

Si verificano errori e talvolta i dati devono essere corretti in produzione. Qual è il modo più sicuro per farlo da un punto di vista aziendale? Ci sono strumenti che possono aiutare? Ecco alcune considerazioni su questo requisito ...

  1. Dobbiamo registrare chi ha eseguito la query e cosa hanno eseguito
  2. Idealmente abbiamo bisogno di dare alla persona l'accesso per eseguire solo le query contro le tabelle di interesse e solo per un breve periodo
  3. Qualunque sia l'esecuzione delle query è necessario disporre di alcune informazioni su di esso per non consentire l'esecuzione prolungata e il blocco di SQL per l'esecuzione senza autorizzazione esplicita
  4. Questo processo deve essere indipendente dal DB o almeno comprendere DB2, Oracle e SQL Server.

Stiamo provando a ridurre il rischio che le domande di aggiustamento dei prodotti ad hoc eseguano la "cosa sbagliata" e allo stesso tempo aggiungano sicurezza / audtis al processo. Pensieri o idee?

    
posta Andrew White 12.08.2013 - 14:45
fonte

7 risposte

49

Non aggiornare mai i database di produzione manualmente.

Scrivi script.

Triplicalo e fallo fare a più persone, non solo a una persona che lo fa tre volte.

Includi query di convalida post-modifica in questi script.

Ogni volta che la situazione lo consente, prova l'intera modifica all'interno di una transazione che viene ripristinata alla fine, dopo che è stata eseguita la convalida successiva alla modifica. Quando sei sicuro dei risultati, cambia il rollback in un commit.

Esegui test di tali script su nauseam contro un database di test.

Crea un backup prima di eseguire lo script sul database di produzione.

Esegui gli script.

Verifica, convalida e verifica tre volte i dati modificati utilizzando gli script di convalida successivi alla modifica.

Fai comunque un controllo visivo.

Se qualcosa sembra spento, torna indietro e ripristina il backup.

Non procedere con i dati modificati come i dati di produzione fino a quando non sei assolutamente sicuro che tutto sia a posto e hai firmato dai gestori (aziendali) coinvolti.

    
risposta data 12.08.2013 - 14:51
fonte
16

La risposta di Marjan Venema è tecnicamente valida e dovrebbe essere seguita quando possibile. Purtroppo, Marjan risponde dal punto di vista di un teorico o di un purista amministratore di database a cui piace fare le cose in modo pulito. In pratica, a volte i vincoli aziendali rendono impossibile fare le cose in modo pulito.

Immagina il seguente caso:

  1. C'è un bug nel prodotto software che lo fa smettere di funzionare quando rileva quello che pensa essere una certa incoerenza dei dati nel database,

  2. Tutti gli sviluppatori che potrebbero potenzialmente correggere il bug nell'applicazione sono irraggiungibili,

  3. La società sta attualmente perdendo migliaia di dollari all'ora (diciamo $ 6 000, ovvero $ 100 al minuto),

  4. Il bug interessa diverse tabelle, una delle quali è enorme, e riguarda solo i dati stessi, non lo schema,

  5. Per aggirare il bug, dovresti sperimentare un po 'con i dati, il che implica sia la rimozione che la modifica,

  6. Il database è di grandi dimensioni e sarebbero necessarie tre ore per eseguire o ripristinare il backup,

  7. L'ultimo backup completo è stato preso tre settimane fa; ci sono anche backup incrementali giornalieri e l'ultimo backup incrementale giornaliero è stato fatto 14 ore fa,

  8. I backup del database sono considerati affidabili; sono stati severamente testati, incluso recentemente,

  9. Perdere 14 ore di dati non è accettabile, ma la perdita di una o due ore di dati è,

  10. L'ambiente di staging è stato infine utilizzato sei mesi fa; sembra che non sia aggiornato e potrebbe richiedere ore per configurarlo,

  11. Il database è Microsoft SQL Server 2008 Enterprise.

Il modo pulito di fare le cose è:

  1. Ripristina il backup nell'ambiente di staging,

  2. Esegui l'esperimento lì,

  3. Controlla lo script finale due volte,

  4. Esegui lo script sul server di produzione.

Il primo passaggio costerà $ 18.000 alla tua azienda. Il rischio è piuttosto basso se fai il terzo passo in modo impeccabile, ma dal momento che lavori con estrema pressione, il rischio sarebbe molto più alto. Potresti finire con uno script che ha funzionato perfettamente in scena, quindi avvita il database di produzione.

Invece, avresti potuto fare così:

  1. Creare uno snapshot (Microsoft SQL Server supporta questo e impiega pochi secondi per ripristinare (e nulla per creare) un'istantanea di un database che impiega un'ora per eseguire il backup; immagino che anche altri prodotti di database supportino istantanee ),

  2. Esegui l'esperimento direttamente nel database di produzione, tornando all'istantanea se qualcosa va storto.

Mentre un purista aggiusta il database in modo pulito e ha ancora il rischio di rovinare tutto visto la pressione del tempo mentre spreca più di $ 20.000 della sua azienda, un amministratore di database che tiene conto dei vincoli aziendali correggi il database in modo da minimizzare i rischi (grazie alle istantanee) mentre lo fai rapidamente.

Conclusione

Anch'io sono un purista e odio fare le cose in modo non pulito. Come sviluppatore, rifatto il codice che modifico, commento le parti difficili che non possono essere refactored, collaudo il codebase e faccio revisioni del codice. Ma prendo in considerazione anche le circostanze in cui o fai le cose in modo pulito e il giorno dopo sei licenziato, o minimizzi sia i rischi che l'impatto finanziario eseguendo un attacco rapido che funziona.

Se alcuni IT vogliono fare le cose in modo pulito solo per motivi di pulizia mentre causano migliaia di dollari di perdita per la società, questo tipo di IT ha un profondo fraintendimento del suo lavoro.

    
risposta data 12.08.2013 - 15:18
fonte
4

Safely fixing production database data. What is the safest way to go about this from a big company standpoint? Are there tools that can help?

È una cattiva pratica e un gate di invito per ulteriori problemi e problemi relativi ai dati. C'è anche una frase che descrive questo approccio come " Veloce e sporco ".

Le correzioni / aggiornamenti continui direttamente su un server di produzione sono molto pericolosi , poiché costano una fortuna alla tua azienda ( cause legali, dati brutti / sporchi, attività perse, ecc. )

Tuttavia, i bug saranno presenti e devono essere corretti. Lo standard industriale de-facto consiste nell'applicare patch / (script di implementazione) su Staging (ambiente di pre-produzione con l'ultima copia del database prod) e lasciare che l'analista di dati / QA per verificare la correzione. Lo stesso script dovrebbe essere controllato dalla versione e applicato all'ambiente Prod per evitare problemi.

Esistono numerose buone pratiche menzionate in questo post correlato - Buone pratiche del database di gestione temporanea

Un buon insieme di riferimenti per guardare sono:

risposta data 12.08.2013 - 17:55
fonte
2

Nella maggior parte delle organizzazioni ho lavorato all'aggiornamento dei dati nell'ambiente live sempre da un piccolo gruppo di persone con i diritti di accesso per farlo, in genere con un titolo di lavoro come DBA. Dato che gli aggiornamenti possono essere fatti solo dal piccolo numero di persone, c'è almeno una possibilità che acquisiscano familiarità con i dati e quindi riduca (ma non elimini) il rischio di problemi.

La persona che scrive lo script di aggiornamento lo farebbe nel test (come per le altre risposte) e otterrà un serio segnale da non-techies (coloro che conoscono il sistema, oltre a qualcuno con autorità senior) che le caratteristiche sembrano essere "giuste" di nuovo 'in aggiunta ai propri test paranoici. Gli script e i dati sarebbero stati verificati in modo indipendente da un altro tecnico (spesso il ruolo del DBA che ho menzionato) sul test prima di essere incanalato in produzione. I risultati verrebbero controllati rispetto ai valori previsti (unici per ogni scenario, ma spesso cose come i row account, ecc.)

In una società per cui ho lavorato, prendere i backup non era un'opzione realistica, ma tutte le righe da aggiornare sono state scritte su un file di testo per riferimento PRIMA dell'aggiornamento, e poi di nuovo DOPO l'aggiornamento se qualcuno dovesse mai aver bisogno di fare riferimento ad esso. Gli script e questi dati sono conservati in un registro delle modifiche dei dati correttamente organizzato.

Ogni azienda è unica e i rischi legati all'aggiornamento di alcuni dati sono chiaramente maggiori rispetto ad altri.

Avendo un processo che fa sì che le persone debbano saltare i cerchi per fare questi aggiornamenti, si spera che tu promuova una cultura che renda le persone vorrebbero trattarle come ultima risorsa, e creare un sano atteggiamento di "doppio controllo, triplo controllo" intorno questa roba.

    
risposta data 12.08.2013 - 18:27
fonte
2

Ci sono momenti in cui è necessario correggere i dati su Prod che non esistono su altri server. Questo non è solo da bug, ma potrebbe essere da un'importazione di dati da un file che un client ha inviato che non era corretto o da un problema causato da qualcuno che ha violato il sistema. O da un problema causato da una cattiva immissione dei dati. Se il tuo database è di grandi dimensioni o di importanza temporale, potresti non avere il tempo di ripristinare l'ultimo backup e correggere l'aggiornamento.

La tua prima difesa (e qualcosa che nessun database aziendale può permettersi di fare senza!) sono tabelle di controllo. Puoi usarli per annullare le modifiche ai dati errati. Inoltre, è possibile scrivere script per restituire i dati allo stato precedente e testarli su altri server molto prima che sia necessario ripristinare i dati controllati. Quindi l'unico rischio è che tu abbia identificato i record corretti da ripristinare.

Avanti tutti gli script per modificare i dati sulla produzione dovrebbero includere quanto segue:

Dovrebbero essere in transazioni esplicite e avere un blocco TRY Catch.

Dovrebbero avere una modalità di test che è possibile utilizzare per ripristinare le modifiche dopo aver visto quali sarebbero state. È necessario disporre di una selezione di stato prima che la modifica sia stata apportata e una eseguita dopo la modifica per garantire che la modifica fosse corretta. Lo script dovrebbe assicurarsi che il numero di righe elaborate sia mostrato. Abbiamo alcuni di questi pre-impostati in un modello che assicura che i pezzi vengano eseguiti. Modelli per le modifiche, aiuta a risparmiare tempo anche nella scrittura della correzione.

Se vi è una grande quantità di dati da modificare o aggiornare, quindi considerare di scrivere lo script per l'esecuzione in lotti con commit per ciascun batch. Non vuoi bloccare l'intero sistema mentre correggi un milione di record. Se disponi di grandi quantità di dati da correggere, assicurati che un dba o qualcuno che è abituato all'ottimizzazione delle prestazioni riveda lo script prima di eseguirlo ed eseguirlo durante l'orario di riposo, se possibile.

Avanti tutti gli script per modificare qualsiasi cosa sulla produzione sono riesaminati dal codice e inseriti nel controllo del codice sorgente. Tutti loro - senza eccezioni.

Infine gli sviluppatori non dovrebbero eseguire questi script. Dovrebbero essere eseguiti da dbas o un gruppo di gestione della configurazione. Se non possiedi nessuno di questi, solo le persone che sono lead tecnologici o superiori dovrebbero avere il diritto di eseguire le cose su prod. Il minor numero di persone che eseguono le cose su prod, più è facile rintracciare un problema. Gli script dovrebbero essere scritti in modo tale da essere semplicemente eseguiti, senza parti evidenziate e correndo un passo alla volta. È l'evidenza che spesso mette le persone in difficoltà quando si dimentica di evidenziare la clausola where.

    
risposta data 13.08.2013 - 16:59
fonte
0

Ho aggiornato i dati molte volte durante l'esecuzione di database di produzione. Sono d'accordo con la risposta sopra, che questa non sarebbe mai stata una procedura operativa standard.

Sarebbe anche costoso (daremmo un'occhiata alle spalle di eachothers e discuteremo 2 o 3 forse)

E la regola d'oro: fai sempre un'istruzione select per mostrare cosa si farebbe prima di fare un update / delete / insert statement

La regola d'oro viene applicata dalle altre due persone nella squadra!

    
risposta data 12.08.2013 - 22:50
fonte
-1

re: risposta di MainMa ...

There is a bug in the software product which causes it to stop working when it detects what it thinks being some data inconsistency in the database,

  • Come fai a sapere che è un "bug"? I dati sono incoerenti secondo le regole stabilite dallo sviluppatore del prodotto software.

All developers who could potentially fix the bug in the application are unreachable,

The company is currently losing thousands of dollars per hour (let's say $6 000, which means $100 per minute),

  • Apparentemente una perdita di $ 100 / minuto non è abbastanza importante per la gestione aziendale da consentire loro di localizzare e assicurare che gli sviluppatori competenti tornino per correggere l'errore e aiutarti a ripristinare il database.

The bug is affecting several tables, one of which is huge, and concerns only the data itself, not the schema,

  • Tutti i problemi del database "riguardano" lo schema. Lo schema progettato è ciò che determinerà il modo in cui risolvi questo problema.

In order to circumvent the bug, you should experiment a bit with the data, which involves both removing and changing it,

  • Ecco a cosa serve il tuo database di gestione temporanea. Potrebbe essere necessario ripopolarlo con dati "corrotti" dal database di produzione subito dopo aver eseguito un backup completo online della produzione.

The database is large and it would take three hours to take or restore the backup,

  • Quindi è meglio iniziare subito, in modo che possa essere eseguito mentre analizzi il problema, sviluppando gli script di correzione, testandoli e perfezionandoli insieme agli sviluppatori e ad altri DBA che ti aiutano.

The last full backup was taken three weeks ago; there are also daily incremental backups, and the last daily incremental backup was done 14 hours ago,

  • Non hai almeno un backup online completo giornaliero? Sei fregato. Ma probabilmente ci sei abituato. È bello che il backup completo che hai iniziato sopra sia in esecuzione. Assicurati che il management tratti ogni minuto dei costi che si sarebbero potuti evitare con i backup online giornalieri.

Database backups are assumed reliable; they were severely tested, including recently,

  • Eccellente! Quindi potresti non dover ripristinare il database più di una volta.

Losing 14 hours of data is not acceptable, but the loss of one to two hours of data is,

  • Nell'ambito dello scenario che hai descritto, tutte le scommesse sono disattivate. Questa è una situazione di "gestione dei disastri informativi". Una buona cosa da fare per la gestione durante tutto questo è documentare i costi che potrebbero essere evitati in futuro con i backup e le procedure di ripristino e le risorse di precessore.

The staging environment was lastly used six months ago; it seems it is not up to date, and it may take hours setting it up,

  • Se il tuo sistema di backup supporta i backup online (ovvero il database è pienamente operativo durante il backup), puoi eseguire l'estrazione per ripopolare il database di staging nello stesso momento se disponi di risorse hardware sufficienti per evitare il rallentamento del backup.

The database is Microsoft SQL Server 2008 Enterprise.

  • Più difficile da fare tutto questo ma non impossibile. Buona fortuna!
risposta data 19.08.2013 - 22:08
fonte

Leggi altre domande sui tag