Come gestite le distribuzioni del cambio di database?

11

Abbiamo discusso delle tecniche di distribuzione dei database oggi, avendo avuto un paio di recenti fallimenti nel nostro processo attuale e avendo visto situazioni in cui vorremmo ripristinare una distribuzione, ma la vecchia versione dell'applicazione non era mai stata testata contro il nuovo versione del database.

Da un lato, esistono distribuzioni in stile Migrazione, in cui si dispone di un'istruzione di versione e di un'istruzione di versione down (indipendentemente dal fatto che siano scritte in SQL o nella lingua dell'applicazione) e l'app conosce la versione di cui ha bisogno arrivare a.

Sono semplici, e poiché non eseguiremo il rollback spesso, gli sviluppatori sono desiderosi di semplicità. Tuttavia, ci sono dei rischi quando si aggiunge un campo / tabella e tale campo viene popolato prima del rollback. O peggio, dove si rilasciano dati rilevanti per la versione precedente.

D'altra parte, possiamo considerare un approccio di aggiornamento, rollback, rollforward in cui il rollback non è così drastico come con le Migrazioni. Ad esempio, l'aggiornamento può aggiungere un campo non annullabile; il rollback lo rende annullabile, quindi la vecchia app non interessa; rollforward popola i campi nulli e lo rende nuovamente non annullabile.

Conserva i dati ma è complicato sia per codificare che per testare (purtroppo i nostri test di integrazione automatizzati sono praticamente inesistenti e, mentre stiamo correggendo, abbiamo un problema nel frattempo).

Esistono metodi sicuri per mitigare i problemi con questi? Ci sono altre opzioni che dovrei prendere in considerazione? Hai avuto brutte esperienze che ti piacerebbe condividere, cosa che mi può far risparmiare tempo dopo?

    
posta pdr 13.04.2011 - 21:43
fonte

2 risposte

9

Le modifiche al database devono essere gestite come tutte le altre modifiche e distribuite come script come parte della distribuzione (e, naturalmente, salvate nel controllo del codice sorgente). Dal momento che sono distribuiti con il codice per la stessa versione dell'applicazione, sai esattamente cosa deve essere ripristinato. Puoi avere fantasia e scrivere uno script per annullare ogni modifica nel momento in cui scrivi lo script del database, ma se i rollback non sono comuni, potresti non volerlo fare. Se una nuova colonna viene popolata, perderai i dati se ritorni al database originale.

In SQL Server è possibile effettuare uno snapshot appena prima di una distribuzione e quindi tornare immediatamente se la distribuzione non riesce. Ciò presuppone che la distribuzione NON stia accadendo quando gli utenti sono nel sistema (non si vogliono perdere le loro modifiche ai dati). Questo è più utile durante una release principale quando potresti dover rallentare l'intero sistema per eseguire l'aggiornamento. Oppure puoi ancora scattare l'istantanea e fare un confronto tra lo snapshot e il database per vedere le differenze se hai bisogno di eseguire il rollback. Uno strumento come SQLCompare può anche generare il codice per tornare alla struttura dello snapshot. Non so cosa sia disponibile per altri database.

    
risposta data 13.04.2011 - 22:04
fonte
3

Le modifiche a una struttura di database dovrebbero essere automatizzate / programmate e testate utilizzando un ambiente di test. Le modifiche manuali sono troppo rischiose in un ambiente di produzione

L'unica strategia di rollback ragionevole (quella con la minore probabilità di peggiorare le cose) è quella di tornare a uno snapshot pre-aggiornamento. Se qualcosa andrà storto, ciò avverrà rapidamente, abbastanza da renderlo gestibile per tornare all'istantanea o troppo tardi per un rollback (il prossimo rapporto di fine settimana fallirà a causa di problemi nel database). / p>

Le modifiche possono essere apportate in modo incrementale (come l'aggiunta di un campo) e quindi testate dal vivo con meno rischi rispetto a quando vengono eseguite tutte in un solo passaggio.

Con la pianificazione, puoi apportare modifiche al database per supportare diverse versioni imminenti, invece di dover confrontare l'aggiornamento del database e con ogni versione.

Preparati a essere in modalità di emergenza i giorni successivi all'upgrade del database, proprio come faresti se si trattasse di un aggiornamento del software.

Resistere all'impulso di correggere i problemi manualmente. Usa la tua strategia di emergenza (rollback, istantanea) e poi pensa al motivo per cui le cose sono andate storte prima di provare di nuovo l'aggiornamento.

    
risposta data 14.04.2011 - 05:44
fonte

Leggi altre domande sui tag