Per molte persone, il tallone di MySQL Achille è un impegno implicito.
Secondo la pagina 418, paragrafo 3 del libro
i seguenti comandi possono e interromperanno una transazione
ALTER TABLE
BEGIN
CREATE INDEX
DROP DATABASE
DROP INDEX
DROP TABLE
RENAME TABLE
TRUNCATE TABLE
LOCK TABLES
UNLOCK TABLES
SET AUTOCOMMIT = 1
START TRANSACTION
SUGGERIMENTO
Quando si tratta di MySQL, qualsiasi lavoro ContinuousIntegration (CI) / SelfService che costruisci dovrebbe sempre rendere reciprocamente esclusivi i processi Transazionali e gli script DDL.
Questo ti dà l'opportunità di creare paradigmi che lo farebbero
- supportare transazioni che sono adeguatamente isolate con
START TRANSACTION/COMMIT
blocchi
- controllo del DDL tramite scripting del DDL, eseguendo tale DDL come costruttore o distruttore
- Costruttore: DDL per creare tavoli con un nuovo design
- Distruttore: DDL per riportare le tabelle al design precedente
- mai combinare queste operazioni in un unico lavoro
ATTENZIONE: se si utilizza MyISAM per questo, è possibile (un) gentilmente aggiungere MyISAM all'elenco di cose che possono interrompere una transazione, forse non in termini di impegno implicito, ma sicuramente in termini di coerenza dei dati nel caso in cui un rollback dovesse mai essere necessario.
PERCHÉ NON LVM?
Gli snapshot LVM sono fantastici e l'ideale è ripristinare intere istanze di database senza dover eseguire pesanti elaborazioni SQL. Tuttavia, quando si tratta di MySQL, è necessario tenere conto di due motori di archiviazione: InnoDB e MyISAM.
Database All-InnoDB
Guarda l'architettura di InnoDB (Immagine gentilmente concessa da Percona CTO Vadim Tkachenko)
InnoDB ha molte parti mobili
- Spazio tabelle di sistema
- Dizionario dei dati
- Double Write Buffer (supporto coerenza dei dati; utilizzato per Crash Recovery)
- Inserisci buffer (Buffer modifiche a indici secondari non univoci)
- Segmenti di rollback
- Annulla spazio (dove può verificarsi la crescita più incontrollata)
- Pool di buffer InnoDB
- Pagine di dati sporchi
- Pagine indice sporche
- Modifiche agli indici non unici
- Altre cache di memoria importanti
Realizzare un'istantanea LVM di un database all-InnoDB con modifiche senza commit fluttuanti nelle cache Buffer Pool e Memory produrrebbe un set di dati che richiederebbe il ripristino di crash di InnoDB una volta ripristinato il LUN e avviato mysqld.
SUGGERIMENTI PER ALL-InnoDB
Se riesci a spegnere MySQL prima di scattare un'istantanea
- Correre
SET GLOBAL innodb_fast_shutdown = 0;
- Correre
SET GLOBAL innodb_max_dirty_pages_pct = 0;
- Correre
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_dirty';
- Ripeti il passaggio 3 fino a quando Innodb_buffer_pool_pages_dirty è 0 o il più vicino possibile a 0
service mysql stop
- Scatta un'istantanea LVM
service mysql stop
Se non riesci a spegnere ma scatta un'istantanea con MySQL Live
- Correre
SET GLOBAL innodb_max_dirty_pages_pct = 0;
- Correre
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_dirty';
- Ripeti il passaggio 2 fino a quando Innodb_buffer_pool_pages_dirty è 0 o il più vicino possibile a 0
- Scatta un'istantanea LVM
- Correre
SET GLOBAL innodb_max_dirty_pages_pct = 75;
Database All-MyISAM o InnoDB / MyISAM Mix
MyISAM, quando vi si accede, mantiene un conteggio di handle di file aperti su di esso. Se MySQL si arresta in modo anomalo, qualsiasi tabella MyISAM con un numero di handle di file aperto> 0 verrà contrassegnata come crash e necessita di riparazione (anche se non c'è nulla di sbagliato nei dati).
Se si esegue un'istantanea LVM di un database con tabelle MyISAM in uso, una o più tabelle MyISAM devono essere riparate quando viene ripristinata l'istantanea e viene avviato mysqld.
SUGGERIMENTI PER All-MyISAM o InnoDB / MyISAM Mix
Se riesci a spegnere MySQL prima di scattare un'istantanea
- Correre
SET GLOBAL innodb_fast_shutdown = 0;
- Correre
SET GLOBAL innodb_max_dirty_pages_pct = 0;
- Correre
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_dirty';
- Ripeti il passaggio 3 fino a quando Innodb_buffer_pool_pages_dirty è 0 o il più vicino possibile a 0
service mysql stop
- Scatta un'istantanea LVM
service mysql stop
Se non riesci a spegnere ma scatta un'istantanea con MySQL Live
È possibile applicare un flushing di alcune tabelle InnoDB
- Correre
SET GLOBAL innodb_max_dirty_pages_pct = 0;
- Correre
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_dirty';
- Ripeti il passaggio 2 fino a quando Innodb_buffer_pool_pages_dirty è 0 o il più vicino possibile a 0
- Esegui
FLUSH TABLES innodb_tbl1,... FOR EXPORT;
su tabelle InnoDB critiche
- Correre
FLUSH TABLES WITH READ LOCK;
- Scatta un'istantanea LVM
- Correre
UNLOCK TABLES;
- Correre
SET GLOBAL innodb_max_dirty_pages_pct = 75;
La replica di MySQL potrebbe essere d'aiuto?
Mentre è possibile ripristinare un'istantanea LVM su due server e configurare MySQL Master / Slave Replication, che diventa una fonte aggiuntiva di pulizia della casa quando si ripristinano le istantanee.
Se si eseguono lavori CI su un master e quei lavori sono piccoli, la replica potrebbe essere un risparmio di tempo in determinate circostanze. Potresti semplicemente eseguire STOP SLAVE;
lo Slave, dare il via ai lavori CI sul Master ed eseguire START SLAVE;
sullo Slave quando i dati del Master sono certificati.
Se i lavori CI segnalano troppi dati, è possibile ripristinare da zero lo snapshot LVM e configurare la replica. Se ti ritrovi a farlo spesso, probabilmente potresti fare con l'impostazione di MySQL Replication.
PENSIERI FINALI
- È preferibile utilizzare più DB Server (3 o più) per eseguire ripristini e test di regressione.
- Converti le restanti tabelle MyISAM in InnoDB se tali tabelle non devono rimanere MyISAM.
- Se il contenuto dei dati è sensibile, è necessario eseguire un processo CI per cancellare i dati dopo aver ripristinato un'istantanea prima di iniziare qualsiasi test. In alternativa, potresti voler scattare istantanee di MySQL con i dati già cancellati.