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.