Domanda

Qual è il modo migliore per salvare il mio modello di dati MySQL e applicare le modifiche al mio server di database di sviluppo automaticamente come sono fatti (o almeno di notte)?

Per esempio, oggi sto lavorando sul mio progetto e creare questa tabella nel mio database, e salvare l'istruzione per file SQL per distribuire alla produzione in seguito:

create table dog (
  uid int,
  name varchar(50)
);

E domani, decido che voglio registrare la razza di ogni cane troppo. Così ho cambiato il file SQL per leggere:

create table dog (
  uid int,
  name varchar(50),
  breed varchar(30)
);

Questo script funziona in produzione per la prima release, ma non mi aiuterà a aggiornare il mio database di sviluppo perché ERROR 1050 (42S01): Table 'dog' already exists. Inoltre, non funzionerà nella produzione se questo cambiamento è stato fatto dopo il primo rilascio. Così ho davvero bisogno di ALTER il tavolo ora.

Così ora ho due preoccupazioni:

  1. E 'questo come dovrei stato per i miei modello di dati (un po 'di creare dichiarazioni in un file SQL), e
  2. Come dovrei essere l'applicazione delle modifiche come questo al mio database?

Il mio obiettivo è quello di rilasciare le modifiche in modo accurato e consentire l'integrazione continua. Io uso uno strumento chiamato DDLSYNC non trovare e applicare la differenza in un database Oracle, ma non sono sicuro di quello che esistano strumenti analoghi per MySQL.

È stato utile?

Soluzione

Al lavoro, abbiamo sviluppato un piccolo script per gestire il nostro controllo delle versioni del database. Ogni cambiamento a qualsiasi tavolo o insieme di dati ottiene un proprio file SQL.

I file sono numerati in sequenza. Teniamo traccia di quali file di aggiornamento sono stati eseguiti memorizzando le informazioni nel database. Lo script inserisce una riga con il nome del file quando il file è in procinto di essere giustiziato, e aggiorna la riga con un timestamp di completamento quando termina di esecuzione. Questo è avvolto all'interno di una transazione. (Vale la pena ricordare che i comandi DDL in MySQL non può avvenire all'interno di una transazione. Qualsiasi tentativo di eseguire DDL in una transazione causa un implicito commit.)

Poiché i file SQL sono parte del nostro repository di codice sorgente, possiamo fare in esecuzione la parte script di aggiornamento del normale processo di implementazione. Questo rende facile mantenere il database e il codice in sincronia come torta. Onestamente, la parte più difficile è fare in modo un altro dev non ha afferrato il numero successivo in una attesa di commit.

combinare questo sistema di aggiornamento con una (opzionale) notturno wipe del nostro database dev, sostituendo il contenuto con il sistema di backup in diretta di ieri sera. Dopo il backup viene ripristinato, l'aggiornamento viene eseguito, con qualsiasi file di aggiornamento in sospeso sempre eseguiti nel processo.

Il restauro avviene in modo tale che solo le tabelle che erano nel database dal vivo vengono sovrascritti. Qualsiasi aggiornamento che aggiunge una tabella quindi anche deve essere responsabile solo aggiungere se non esiste. DROP TABLE IF EXISTS è a portata di mano. Purtroppo non tutti i database supportano che, in modo che il sistema di aggiornamento consente inoltre di esecuzione di script scritto nella nostra lingua di scelta, non solo SQL.

Il tutto in circa 150 linee di codice. E 'facile come la lettura di una directory, confrontando il contenuto ad un tavolo, e l'esecuzione di qualsiasi cosa che non sia già stato eseguito, in un ordine determinato.

Altri suggerimenti

Non ci sono strumenti standard per questo in molti quadri: Rails ha qualcosa chiamato Migrazioni , qualcosa che è facilmente replicato in PHP o qualsiasi altro linguaggio simile.

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