Mysql
 sql >> Database >  >> RDS >> Mysql

MYSQL riproduce il file di dump tutto o niente in una transazione

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.