Забележка:Следното е тествано само грубо, може да има повече неща, които да вземете предвид при изхвърляне, в зависимост от вашата база данни.
Това е възможно само при определени обстоятелства.
Първият неуспех е, че транзакцията е обвързана със сесия. Тъй като се свързвате отново, за да издадете rollback
, rollback
няма полза, тъй като няма транзакция за връщане назад. Това беше в другата сесия.
Вторият неуспех е, че обикновено mysqldump има няколко оператора, които хвърлят имплицитно commit
и следователно да прекрати транзакцията. Това включва всички DDL изрази (език за дефиниране на данни, това включва drop
, alter
, create
и така нататък), както и (un)lock tables
.
Така че, за да изпълните вашия dumpfile в една единствена транзакция, дъмпът трябва да е създаден нещо подобно:
mysqldump -uuser -ppw database --no-create-info --skip-add-locks --skip-disable-keys --skip-triggers >dumpfiles
--no-create-info
позволява на mysqldump да пропусне всички drop table ...; create table ...;
изявления.
--skip-add-locks
позволява на mysqldump да пропусне цялата lock table ...; unlock table ...;
изявления.
--skip-disable-keys
позволява на mysqldump да пропусне всички alter table ... disable keys; alter table ...enable keys;
изявления.
--skip-triggers
позволява на mysqldump да пропусне всички create trigger ...;
изявления.
Има и --single-transaction
опция, но тази опция ще бъде приложена само към единични таблици.
Третият (възможен) неуспех е, че дадена транзакция може да бъде върната напълно, само ако всички включени таблици са способни на транзакции, като InnoDB или BDB. Ако имате например MyISAM таблици там, insert
изразите няма да бъдат върнати назад.
Следното е неуспешно, предизвика source
командата не е разрешена в съхранена процедура, тя е по-скоро част от mysql клиента.
Ако всичко това е взето предвид, можете да го направите по следния начин:
Първо създайте процедура като тази:
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 ;
След това го изпълнете по този начин във вашия скрипт:
mysql -uuser -ppw -hhost databasename -e "CALL sp_exec_dump()"
Или, разбира се, параметризирате процедурата с името на dumpfile.