Uwaga:poniższe są testowane tylko z grubsza, może być więcej rzeczy do rozważenia podczas zrzucania, w zależności od bazy danych.
Jest to możliwe tylko w określonych okolicznościach.
Pierwszym niepowodzeniem jest powiązanie transakcji z sesją. Ponieważ łączysz się ponownie, aby wydać rollback
, rollback
nie ma sensu, ponieważ nie ma transakcji do wycofania. To było podczas drugiej sesji.
Drugi błąd polega na tym, że zwykle mysqldump ma kilka instrukcji, które rzucają niejawne commit
i tym samym zakończyć transakcję. Obejmuje to wszystkie instrukcje DDL (język definicji danych, w tym drop
, alter
, create
i tak dalej) oraz (un)lock tables
.
Więc, aby wykonać plik zrzutu w jednej transakcji, zrzut powinien zostać utworzony mniej więcej tak:
mysqldump -uuser -ppw database --no-create-info --skip-add-locks --skip-disable-keys --skip-triggers >dumpfiles
--no-create-info
pozwala mysqldump pominąć wszystkie drop table ...; create table ...;
oświadczenia.
--skip-add-locks
pozwala mysqldump pominąć wszystkie lock table ...; unlock table ...;
oświadczenia.
--skip-disable-keys
pozwala mysqldump pominąć wszystkie alter table ... disable keys; alter table ...enable keys;
sprawozdania.
--skip-triggers
pozwala mysqldump pominąć wszystkie create trigger ...;
oświadczenia.
Istnieje również --single-transaction
opcja, ale ta opcja byłaby stosowana tylko do pojedynczych stołów.
Trzecim (możliwym) niepowodzeniem jest to, że transakcja może zostać całkowicie wycofana tylko wtedy, gdy wszystkie zaangażowane tabele są zdolne do przeprowadzania transakcji, takich jak InnoDB lub BDB. Jeśli masz tam np. tabele MyISAM, insert
oświadczenia nie zostaną wycofane.
Następujące błędy nie powiedzie się, ponieważ source
polecenie nie jest dozwolone w procedurze składowanej, jest raczej częścią klienta mysql.
Jeśli wszystko, co zostało brane pod uwagę, możesz to zrobić w ten sposób:
Najpierw utwórz taką procedurę:
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 ;
Następnie wykonaj to w swoim skrypcie w następujący sposób:
mysql -uuser -ppw -hhost databasename -e "CALL sp_exec_dump()"
Lub oczywiście sparametryzujesz procedurę nazwą pliku zrzutu.