Obs:Följande testas endast grovt, det kan finnas fler saker att tänka på när du dumpar, beroende på din databas.
Det är bara möjligt under vissa omständigheter.
Det första misslyckandet är att en transaktion är bunden till en session. Eftersom du ansluter igen för att utfärda rollback
, rollback
har ingen användning eftersom det inte finns någon transaktion att återställa. Det var i den andra sessionen.
Det andra misslyckandet är att en mysqldump vanligtvis har flera uttalanden som avger en implicit commit
och därför avsluta transaktionen. Detta inkluderar alla DDL-satser (datadefinitionsspråk, detta inkluderar drop
). , alter
, create
och så vidare) samt (un)lock tables
.
Så, för att köra din dumpfil i en enda transaktion, borde dumpen ha skapats ungefär så här:
mysqldump -uuser -ppw database --no-create-info --skip-add-locks --skip-disable-keys --skip-triggers >dumpfiles
--no-create-info
låter mysqldump hoppa över alla drop table ...; create table ...;
uttalanden.
--skip-add-locks
låter mysqldump hoppa över alla lock table ...; unlock table ...;
uttalanden.
--skip-disable-keys
låter mysqldump hoppa över alla alter table ... disable keys; alter table ...enable keys;
uttalanden.
--skip-triggers
låter mysqldump hoppa över alla create trigger ...;
uttalanden.
Det finns också en --single-transaction
alternativet, men det här alternativet skulle bara tillämpas på enstaka tabeller.
Det tredje (möjliga) felet är att en transaktion endast kan återställas helt om alla inblandade tabeller kan utföra transaktioner, som InnoDB eller BDB. Om du har d.v.s. MyISAM-tabeller där, insert
uttalanden kommer inte att återställas.
Följande misslyckas, orsaka source
kommandot är inte tillåtet i en lagrad procedur, det är snarare en del av mysql-klienten.
Om allt detta har övervägts kan du göra det så här:
Skapa först en procedur så här:
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 ;
Kör sedan så här i ditt skript:
mysql -uuser -ppw -hhost databasename -e "CALL sp_exec_dump()"
Eller självklart parametrerar du proceduren med dumpfilens namn.