2015-01-28 26 views
12

Sono stato un po 'sorpreso di scoprire che le istruzioni DDL (alter table, create index ecc. Implicano implicitamente la transazione corrente in MySQL. Provenendo da MS SQL Server, la possibilità di eseguire modifiche al database in una transazione localmente (che è stata poi ripristinata) era una parte importante del mio flusso di lavoro. Per l'integrazione continua, il rollback è stato utilizzato se la migrazione si è interrotta per qualsiasi motivo, in modo tale che almeno non abbiamo lasciato il database in uno stato di metà migrazione.Flusso di lavoro DDL transazionale per MySQL

In che modo le persone risolvono questi due problemi quando utilizzano MySQL con migrazioni e integrazione continua?

+2

Croce postato su DBA: http://dba.stackexchange.com/q/90794/18273 – sennett

+2

Benvenuti nel meraviglioso mondo di MySQL :) –

+0

Sei sicuro che nel comando DDL di SQL Server non si impegni la transazione? perché nel comando DDL di Oracle esegui anche il commit della transazione. –

risposta

1

Le istruzioni DDL causano un commit implicito e non c'è nulla che tu possa fare al riguardo. Non c'è modo di fermare questo comportamento.

Quali istruzioni DDL modificano questo comportamento nel tempo, pertanto è necessario verificare la versione.

5.1 http://dev.mysql.com/doc/refman/5.1/en/implicit-commit.html 
5.5 http://dev.mysql.com/doc/refman/5.5/en/implicit-commit.html 
5.6 http://dev.mysql.com/doc/refman/5.6/en/implicit-commit.html 

Quando ci sono solo l'estensione dello schema, nuove tabelle/colonne/views/proc/etc, che non influirà codice esistente quindi di automazione è OK, basta controllare per gli errori e correggerli.

Quando influenzano il codice esistente, è necessario elaborare una strategia caso per caso. Dal momento che non è previsto il rollback, è necessario il proprio piano di backout ed è necessario testarlo a fondo.

Dal momento che è caso per caso non c'è molto che posso offrire in termini di aiuto per la tua situazione particolare.

1

Una possibilità sta facendo modifiche DDL in un non-distruttiva-maniera, che includerebbe:

  • logica divisi nel DDL/DCL (+1 per invertire tutti) e DML
  • periodo solo il DDL/script DCL l'aggiunta di colonne, nuove tabelle, ..
  • seconda conseguenza:
    • in caso di successo, applicare le modifiche DML,
    • su falliscono, si applicano invertire script DDL/DCL rimuovere la roba si wan ted per aggiungere in seconda fase (ovviamente con alcuni errori "non esiste" a seconda di quanto la fase 1 ha)
  • rimuovere ciò che non è più necessario, far cadere le vecchie colonne/tavoli