Nota:il seguente viene testato solo approssimativamente, potrebbero esserci più cose da considerare durante il dump, a seconda del database.
Questo è possibile solo in determinate circostanze.
Il primo errore è che una transazione è legata a una sessione. Poiché ti connetti di nuovo per emettere il rollback
, il rollback
non ha alcuna utilità poiché non c'è alcuna transazione di cui eseguire il rollback. Quello era nell'altra sessione.
Il secondo errore è che di solito un mysqldump ha diverse istruzioni che lanciano un commit
implicito e quindi terminare la transazione. Ciò include tutte le istruzioni DDL (linguaggio di definizione dei dati, incluso drop
, alter
, create
e così via) nonché (un)lock tables
.
Quindi, per eseguire il tuo dumpfile in una singola transazione, il dump dovrebbe essere stato creato in questo modo:
mysqldump -uuser -ppw database --no-create-info --skip-add-locks --skip-disable-keys --skip-triggers >dumpfiles
--no-create-info
lascia che mysqldump salti tutti i drop table ...; create table ...;
dichiarazioni.
--skip-add-locks
permette a mysqldump di saltare tutti i lock table ...; unlock table ...;
dichiarazioni.
--skip-disable-keys
lascia che mysqldump salti tutto alter table ... disable keys; alter table ...enable keys;
dichiarazioni.
--skip-triggers
consente a mysqldump di saltare tutto create trigger ...;
dichiarazioni.
C'è anche un --single-transaction
opzione, ma questa opzione verrebbe applicata solo a singole tabelle.
Il terzo (possibile) errore è che una transazione può essere ripristinata completamente solo se tutte le tabelle coinvolte sono in grado di eseguire transazioni, come InnoDB o BDB. Se hai ad esempio tabelle MyISAM lì dentro, il insert
le dichiarazioni non verranno annullate.
Quanto segue non riesce, causa il source
comando non è consentito in una procedura memorizzata, è piuttosto parte del client mysql.
Se tutto ciò è stato considerato, puoi farlo in questo modo:
Per prima cosa crea una procedura come questa:
DELIMITER $$
CREATE PROCEDURE sp_exec_dumpfile()
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
END ;
START TRANSACTION;
SOURCE '/path/to/dumpfile.sql';
COMMIT;
END $$
DELIMITER ;
Quindi eseguilo in questo modo nel tuo script:
mysql -uuser -ppw -hhost databasename -e "CALL sp_exec_dump()"
O ovviamente parametrizzi la procedura con il nome del file dump.