Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MYSQL-Wiedergabe-Dumpfile alles oder nichts in einer Transaktion

Hinweis:Das Folgende wurde nur grob getestet, je nach Datenbank müssen beim Sichern möglicherweise weitere Dinge berücksichtigt werden.

Das ist nur unter bestimmten Umständen möglich.

Der erste Fehler ist, dass eine Transaktion an eine Sitzung gebunden ist. Da verbinden Sie sich erneut, um den rollback auszugeben , das rollback hat keinen Nutzen, da es keine rückgängig zu machende Transaktion gibt. Das war in der anderen Sitzung.

Der zweite Fehler ist, dass ein mysqldump normalerweise mehrere Anweisungen hat, die ein implizites commit umwandeln und somit die Transaktion beenden. Dazu gehören alle DDL-Anweisungen (Datendefinitionssprache, dazu gehört drop , alter , create und so weiter) sowie (un)lock tables .
Um Ihr Dumpfile also in einer einzigen Transaktion auszuführen, sollte das Dump in etwa so erstellt worden sein:

mysqldump -uuser -ppw database --no-create-info --skip-add-locks --skip-disable-keys --skip-triggers >dumpfiles

--no-create-info lässt mysqldump alle drop table ...; create table ...; Aussagen.

--skip-add-locks lässt mysqldump alle lock table ...; unlock table ...; Aussagen.

--skip-disable-keys lässt mysqldump alle alter table ... disable keys; alter table ...enable keys; Aussagen.

--skip-triggers lässt mysqldump alle create trigger ...; überspringen Aussagen.

Es gibt auch eine --single-transaction Option, aber diese Option würde nur auf einzelne Tabellen angewendet werden.

Dritter (möglicher) Fehler ist, dass eine Transaktion nur dann vollständig rückgängig gemacht werden kann, wenn alle beteiligten Tabellen transaktionsfähig sind, wie InnoDB oder BDB. Wenn Sie z. B. MyISAM-Tabellen darin haben, wird insert Anweisungen werden nicht rückgängig gemacht.

Folgendes schlägt fehl, verursacht die source Der Befehl ist in einer gespeicherten Prozedur nicht erlaubt, er ist eher Teil des mysql-Clients.

Wenn das alles bedacht wurde, können Sie es so machen:

Erstellen Sie zuerst eine Prozedur wie diese:

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 ;

Führen Sie es dann wie folgt in Ihrem Skript aus:

mysql -uuser -ppw -hhost databasename -e "CALL sp_exec_dump()"

Oder Sie parametrieren die Prozedur natürlich mit dem Dumpfile-Namen.