Poznámka:Následující text je testován pouze hrubě, v závislosti na vaší databázi může být při ukládání zvažováno více věcí.
To je možné pouze za určitých okolností.
První selhání je, že transakce je vázána na relaci. Protože se znovu připojíte a vydáte rollback
, rollback
nemá využití, protože neexistuje žádná transakce, kterou by bylo možné vrátit zpět. To bylo na druhém zasedání.
Druhým selháním je, že obvykle má mysqldump několik příkazů, které vrhají implicitní commit
a proto transakci ukončit. To zahrnuje všechny příkazy DDL (jazyk pro definici dat, to zahrnuje drop
, alter
, create
a tak dále) a také (un)lock tables
.
Pro spuštění souboru výpisu v jedné transakci by měl být výpis vytvořen přibližně takto:
mysqldump -uuser -ppw database --no-create-info --skip-add-locks --skip-disable-keys --skip-triggers >dumpfiles
--no-create-info
umožňuje mysqldump přeskočit všechny drop table ...; create table ...;
prohlášení.
--skip-add-locks
umožňuje mysqldump přeskočit všechny lock table ...; unlock table ...;
prohlášení.
--skip-disable-keys
umožňuje mysqldump přeskočit všechny alter table ... disable keys; alter table ...enable keys;
prohlášení.
--skip-triggers
umožňuje mysqldump přeskočit vše create trigger ...;
prohlášení.
Existuje také --single-transaction
možnost, ale tato možnost by byla aplikována pouze na jednotlivé tabulky.
Třetím (možným) selháním je, že transakci lze úplně vrátit zpět pouze tehdy, pokud jsou všechny zahrnuté tabulky schopné transakcí, jako je InnoDB nebo BDB. Pokud tam máte např. tabulky MyISAM, insert
příkazy nebudou vráceny zpět.
Následující selže, protože source
příkaz není v uložené proceduře povolen, je spíše součástí klienta mysql.
Pokud bylo zváženo vše, můžete to udělat takto:
Nejprve vytvořte postup, jako je tento:
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 ;
Poté jej spusťte takto ve svém skriptu:
mysql -uuser -ppw -hhost databasename -e "CALL sp_exec_dump()"
Nebo samozřejmě parametrizujete proceduru s názvem dumpfile.