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.