Domanda

Ho avuto un momento difficile cercando di trovare buoni esempi di come gestire gli schemi di database e dati tra ambienti di sviluppo, collaudo e produzione di server.

Ecco il nostro programma di installazione.Ogni sviluppatore ha una macchina virtuale in esecuzione della nostra applicazione e il database MySQL.È il loro personale sandbox per fare quello che vogliono.Attualmente, gli sviluppatori di modificare lo schema SQL e fare un dump del database in un file di testo che si impegnano in SVN.

Abbiamo intenzione di distribuire un continuous integration server di sviluppo che sarà sempre l'ultima impegnata codice.Se lo facciamo adesso, è ricaricare il database da SVN per ogni generazione.

Abbiamo un test (virtuale) del server che viene eseguito "release candidate." La distribuzione per il test server è attualmente un processo manuale, e di solito mi coinvolge in carico il più recente di SQL da SVN e la messa a punto.Inoltre, i dati sul server di test è incoerente.Si finisce con qualunque dei dati del test la scorsa sviluppatore di commit sul suo sandbox server.

Dove tutto si rompe è la distribuzione e la produzione.Dal momento che non siamo in grado di sovrascrivere i dati in tempo reale con i dati del test, questo comporta manualmente la ri-creazione di tutte le modifiche dello schema.Se ci sono stati un gran numero di modifiche dello schema o gli script di conversione per manipolare i dati, questo può ottenere molto peloso.

Se il problema è solo lo schema, potrebbe essere un semplice problema, ma non c'è "di base" dei dati nel database che viene aggiornato durante lo sviluppo, come i meta-dati in materia di sicurezza e di autorizzazioni tabelle.

Questo è il più grande ostacolo vedo in movimento verso l'integrazione continua e one-step-costruisce.Come fare si a risolvere il problema?


Una domanda:come si fa a tenere traccia di database di versioni in modo da sapete che l'esecuzione di script per l'aggiornamento di un dato istanza di database?È una tabella di versione come la Lancia cita di seguito la procedura standard?


Grazie per il riferimento alla Tarantino.Io non sono in .Ambiente di rete, ma ho trovato il loro DataBaseChangeMangement pagina wiki per essere molto utile.In particolare questo Presentazione Di Powerpoint (.ppt)

Ho intenzione di scrivere uno script Python che controlla i nomi di *.sql script in una directory a fronte di una tabella nel database e corre quelli che non ci sono in ordine basato su un numero intero che forma la prima parte del nome del file.Se si tratta di una soluzione abbastanza semplice, come ho il sospetto che sarà, poi ve lo posto qui.


Ho uno script funzionante per questo.Gestisce inizializzazione del DB, se non esiste, e l'esecuzione di script di aggiornamento necessari.Ci sono anche opzioni per la cancellazione di un database esistente e che l'importazione di dati di test da un file.Si tratta di 200 linee, in modo da non postare (anche se potrei metterlo su pastebin, se c'e ' interesse).

È stato utile?

Soluzione

Ci sono un paio di buone opzioni.Non vorrei usare il "ripristino di un backup" strategia.

  1. Script tutte le tue modifiche dello schema, e avere il vostro server CI eseguire questi script sul database.Dispone di una versione di tabella per tenere traccia della versione attuale del database, e solo eseguire gli script se sono per una versione più recente.

  2. Utilizzare una soluzione di migrazione.Queste soluzioni variano da lingua a lingua, ma per .NET io uso Migrator.NET.Questo consente di versione del database e muoversi su e giù tra le versioni.Il tuo schema è specificato nel codice C#.

Altri suggerimenti

Gli sviluppatori hanno bisogno di scrivere modificare gli script (schema e dati modifica) per ogni bug/feature di lavoro e, non basta semplicemente scaricare l'intero database nel controllo del codice sorgente.Questi script per aggiornare l'attuale database di produzione per la nuova versione in fase di sviluppo.

Il processo di generazione in grado di ripristinare una copia del database di produzione in un ambiente appropriato ed eseguire tutti gli script dal controllo del codice sorgente su di esso, che consente di aggiornare il database alla versione corrente.Fare questo su una base quotidiana per assicurarsi che tutti gli script vengono eseguiti correttamente.

Guarda come Ruby on Rails fa questo.

Prima ci sono i cosiddetti file di migrazione, che fondamentalmente trasformare lo schema del database e dei dati dalla versione N a N+1 (o in caso di downgrade dalla versione N+1 a N).Database la tabella che indica la versione corrente.

I database di Test sono sempre puliti prima unit-test e popolata con dati fissi da file.

Il libro Refactoring Del Database:Evolutivo Di Progettazione Di Database potrebbe darvi alcune idee su come gestire il database.Una versione breve è leggibile anche in http://martinfowler.com/articles/evodb.html

In uno di PHP+MySQL progetto a cui ho avuto il database di revisione numero memorizzato nel database, e quando il programma si connette al database, è innanzitutto la revisione.Se il programma richiede una revisione diversa, si aprirà una pagina per l'aggiornamento del database.Ogni aggiornamento è specificato nel codice PHP, che cambierà lo schema del database e la migrazione di tutti i dati esistenti.

  • Il nome del tuo database come indicato di seguito - db_dev , db_test , db_qa , db_prod (Ovviamente non si dovrebbe codificare db nomi
  • Così si sarebbe in grado di distribuire anche il diverso tipo di db sullo stesso server fisico ( non ho chiesto di che , ma potrebbe essere ...se le risorse sono poche )
  • Assicurarsi che si sarebbe in grado di spostare i dati tra coloro automaticamente
  • Separare gli script di creazione del db da parte della popolazione = dovrebbe essere sempre possibile ricreare il db da zero e popolarlo ( dalla vecchia versione di db o di origine dati esterna
  • non utilizzare codificare le stringhe di connessione nel codice ( anche non nel file di configurazione) nel file di configurazione stringa di connessione modelli , che si fa popolare dinamicamente , ogni riconfigurazione del application_layer che ha bisogno di ricompilare è MALE
  • fare uso di database di versioni e oggetti di database di versioning - se si può permettere di utilizzare prodotti già pronti , se non sviluppare qualcosa per conto tuo
  • tenere traccia di ogni modifica DDL e salvarlo in un po ' di storia la tabella ( esempio qui )
  • Backup GIORNALIERI !Prova di quanto velocemente si sarebbe in grado di ripristinare qualcosa di perso da un backup (utilizzare automatica degli script ripristino
  • anche il DEV database e PROD hanno esattamente lo stesso script di creazione si avranno problemi con i dati, in modo da consentire agli sviluppatori di creare l'esatta copia di prod e giocare con lui ( so che riceverò svantaggi per questo , ma cambiare la mentalità e il business process vi costerà molto meno quando la merda colpisce il ventilatore - costringere così i programmatori a pedice legalmente qualunque cosa si fa , ma fate in modo che questo

Questa è una cosa che mi sono sempre insoddisfatto con - la nostra soluzione a questo problema.Per diversi anni abbiamo mantenuto separato modificare lo script per ogni release.Questo script dovrebbe contenere il delta dall'ultima versione di produzione.Con ogni versione di applicazione, il numero di versione di incremento, dando qualcosa di simile al seguente:

  • dbChanges_1.sql
  • dbChanges_2.sql
  • ...
  • dbChanges_n.sql

Questo ha funzionato abbastanza bene fino a quando abbiamo iniziato il mantenimento di due linee di sviluppo:Tronco/Mainline per un nuovo sviluppo e un ramo di manutenzione per correzioni di bug, miglioramenti a breve termine, etc.Inevitabilmente, è nata l'esigenza di apportare modifiche allo schema del ramo.A questo punto, abbiamo già avuto dbChanges_n+1.sql nel Bagagliaio, così abbiamo finito per andare con uno schema come il seguente:

  • dbChanges_n.1.sql
  • dbChanges_n.2.sql
  • ...
  • dbChanges_n.3.sql

Di nuovo, questo ha funzionato abbastanza bene, fino a quando un giorno abbiamo guardato in alto e ho visto il 42 delta script in vena e 10 del ramo.ARGH!

In questi giorni abbiamo semplicemente mantenere un delta di script e lasciare versione SVN è - cioèabbiamo sovrascrivere lo script ad ogni release.E rifuggire dal fare modifiche dello schema in rami.

Quindi, io non sono soddisfatti con tutto ciò.Mi piace molto il concetto di migrazioni da Guide.Sono diventato molto affascinato con LiquiBase.Supporta il concetto di incrementale di database rifattorizzazione.Merita un'occhiata e vedo in dettaglio a breve.Qualcuno ha esperienza con esso?Sarei molto curioso di ascoltare i tuoi risultati.

Si potrebbe anche guardare utilizzando uno strumento come SQL compare script per la differenza tra le varie versioni di un database, consentendo di eseguire la migrazione tra le versioni

Abbiamo una configurazione simile alla OP.

Gli sviluppatori di sviluppare in VM privato con il DB.

[Gli sviluppatori saranno presto commettere in privato rami]

Il test viene eseguito su macchine diverse ( in realtà in VM ospitato su un server) [Presto sarà gestito da Hudson CI server]

Prova caricando il riferimento dump nel db.Applicare gli sviluppatori schema patch quindi applicare gli sviluppatori di dati di patch

Quindi eseguire l'unità e test di sistema.

La produzione è distribuita ai clienti installatori.

Cosa facciamo:

Prendiamo uno schema di dump della nostra sandbox DB.Poi un sql dump dei dati.Abbiamo diff che la precedente linea di base.che coppia di delta è a aggiornamento n-1 a n.

abbiamo configurare le discariche e delta.

Quindi, per installare la versione N CLEAN siamo eseguire il dump di un db vuoto.Per la patch, applicare la intervenendo patch.

( Juha menzionato il trasporto Ferroviario idea di avere una tabella di registrazione l'attuale versione di DB è buono e dovrebbe fare l'installazione degli aggiornamenti meno tesa.)

Delta e delle discariche devono essere rivisto prima di beta test.Non riesco a vedere alcun modo per aggirare questo, come ho visto gli sviluppatori di inserire gli account di prova nel DB per se stessi.

Controllare il dbdeploy, ci sono Java e .net strumenti già disponibili, si possono seguire i loro standard per il file SQL layout e schema di tabella di versione e scrivere la tua versione di python.

Temo di essere d'accordo con gli altri manifesti.Gli sviluppatori hanno bisogno di uno script le modifiche.

In molti casi un semplice ALTER TABLE non funziona, è necessario modificare i dati esistenti troppo - gli sviluppatori hanno bisogno per cosa su ciò che le migrazioni sono necessari e assicurarsi che stanno script correttamente (ovviamente è necessario verificare con attenzione questo a un certo punto del ciclo di rilascio).

Inoltre, se si dispone di alcun senso, avrai il tuo sviluppatori di script rollback dei loro cambiamenti in modo che possano essere ripristinati in caso di necessità.Questo dovrebbe essere testati per assicurare che i loro rollback non solo viene eseguito senza errori, ma lascia il DB lo stesso stato, come era in precedenza (questo non è sempre possibile o auspicabile, ma è una buona regola per la maggior parte del tempo).

Come hook che in un server CI, non so.Forse il tuo server CI deve disporre di un noto costruire snapshot, che torna ogni notte e quindi si applica a tutti i cambiamenti da allora.Che probabilmente è meglio, altrimenti è rotto lo script di migrazione si rompono, non solo di quella notte di costruire, ma di tutti quelli successivi.

Se siete in .Ambiente di rete, quindi la soluzione è Tarantino.Si gestisce tutto questo (tra cui sql script per installare) in un NANT costruire.

Ho scritto uno strumento che (con aggancio in Aprire DBDiff confronta gli schemi di database, e suggerisce script di migrazione per voi.Se si apporta una modifica che elimina o modifica dei dati, si genererà un errore, ma di fornire un suggerimento per lo script (ad es.quando una colonna mancante nel nuovo schema, verifica se la colonna è stata rinominata e creare xx - script generato.sql.suggerimento contenente un rinominare istruzione).

http://code.google.com/p/migrationscriptgenerator/ SQL Server solo che ho paura :( e ' anche abbastanza alpha, ma è MOLTO basso attrito (in particolare se si combinano con Tarantino o http://code.google.com/p/simplescriptrunner/)

Il modo in cui lo uso è quello di avere un script SQL progetto .sln.Hai anche un db_next database locale che si apportano le modifiche (utilizzando Management Studio o NHibernate Esportazione Dello Schema o LinqToSql CreateDatabase o qualcosa del genere).Quindi si esegue migrationscriptgenerator con il _dev e _next DBs, che crea.SQL script di aggiornamento per la migrazione di tutto.

Stiamo utilizzando la linea di comando mysql-diff.:e ' in uscita una differenza tra i due schemi di database (dal vivo DB o script) come MODIFICARE lo script.mysql-diff viene eseguito all'avvio dell'applicazione, e se lo schema modificato, i rapporti con gli sviluppatori.Quindi gli sviluppatori non hanno bisogno di scrivere Altera manualmente gli aggiornamenti dello schema accadere in modo semi-automatico.

Per oracle database usiamo oracle-ddl2svn strumenti.

Questo strumento automatizzato il processo successivo

  1. per ogni db schema di ottenere schema di ddls
  2. mettere la versione di controllo

modifiche tra le istanze risolto manualmente

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top