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:
- Verrà applicato solo se qualcun altro lo ha esaminato (e non ha notato il problema)
- 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.