Usiamo qualcosa di simile a bcwoord per mantenere sincronizzati i nostri schemi di database su 5 diverse installazioni (produzione, gestione temporanea e alcune installazioni di sviluppo) e sottoposti a backup nel controllo della versione, e funziona abbastanza bene. Elaborerò un po ':
Per sincronizzare la struttura del database, abbiamo un singolo script, update.php e un numero di file numerati 1.sql, 2.sql, 3.sql, ecc. Lo script utilizza una tabella aggiuntiva per memorizzare il numero di versione corrente del Banca dati. I file N.sql sono creati a mano, per passare dalla versione (N-1) alla versione N del database.
Possono essere utilizzati per aggiungere tabelle, aggiungere colonne, migrare i dati da un vecchio a un nuovo formato di colonna, quindi rilasciare la colonna, inserire righe di dati "master" come tipi di utenti, ecc. Fondamentalmente, può fare qualsiasi cosa e con dati adeguati script di migrazione che non perderai mai dati.
Lo script di aggiornamento funziona in questo modo:
- Connettiti al database.
- Eseguire un backup del database corrente (perché roba sarà andare male) [mysqldump].
- Creare una tabella di contabilità (chiamata _meta) se non esiste.
- Leggi la VERSIONE corrente dalla tabella _meta. Supponi 0 se non trovato.
- Per tutti i file .sql con un numero maggiore di VERSION, eseguili in ordine
- Se uno dei file ha generato un errore: ripristinare il backup
- Altrimenti, aggiorna la versione nella tabella di contabilità al file .sql più alto eseguito.
Tutto passa al controllo del codice sorgente e ogni installazione ha uno script da aggiornare all'ultima versione con una singola esecuzione dello script (chiamando update.php con la password del database corretta ecc.). SVN aggiorna gli ambienti di gestione temporanea e di produzione tramite uno script che chiama automaticamente lo script di aggiornamento del database, quindi un aggiornamento del codice viene fornito con gli aggiornamenti del database necessari.
Possiamo anche usare lo stesso script per ricreare l'intero database da zero; semplicemente rilasciamo e ricreamo il database, quindi eseguiamo lo script che ripopolerà completamente il database. Possiamo anche usare lo script per popolare un database vuoto per i test automatizzati.
Ci sono volute solo poche ore per configurare questo sistema, è concettualmente semplice e tutti ottengono lo schema di numerazione delle versioni, ed è stato prezioso avere la capacità di andare avanti ed evolvere il design del database, senza dover comunicare o eseguire manualmente le modifiche su tutti i database.
Fai attenzione quando incolli le query da phpMyAdmin! Quelle query generate di solito includono il nome del database, che sicuramente non si desidera poiché interromperà i tuoi script! Qualcosa come CREATE TABLE mydb
. newtable
(...) fallirà se il database sul sistema non si chiama mydb. Abbiamo creato un hook SVN pre-commento che non consentirà i file .sql contenenti la mydb
stringa, che è un segno sicuro che qualcuno copia / incolla da phpMyAdmin senza un controllo adeguato.