Bemærk:Følgende er kun testet groft, der kan være flere ting at overveje, når du dumper, afhængigt af din database.
Det er kun muligt under visse omstændigheder.
Første fejl er, at en transaktion er bundet til en session. Siden du opretter forbindelse igen for at udstede rollback
, rollback
har ingen nytte, da der ikke er nogen transaktion, der kan rulles tilbage. Det var i den anden session.
Anden fejl er, at en mysqldump normalt har flere sætninger, som afgiver en implicit commit
og derfor afslutte transaktionen. Dette inkluderer alle DDL-sætninger (datadefinitionssprog, dette inkluderer drop
, alter
, create
og så videre) samt (un)lock tables
.
Så, for at udføre din dumpfil i én enkelt transaktion, skulle dumpet være blevet oprettet sådan her:
mysqldump -uuser -ppw database --no-create-info --skip-add-locks --skip-disable-keys --skip-triggers >dumpfiles
--no-create-info
lader mysqldump springe alle drop table ...; create table ...;
udsagn.
--skip-add-locks
lader mysqldump springe alle lock table ...; unlock table ...;
udsagn.
--skip-disable-keys
lader mysqldump springe alle alter table ... disable keys; alter table ...enable keys;
udsagn.
--skip-triggers
lader mysqldump springe alle over create trigger ...;
udsagn.
Der er også en --single-transaction
mulighed, men denne mulighed vil kun blive anvendt på enkelte tabeller.
Tredje (mulig) fejl er, at en transaktion kun kan rulles tilbage fuldstændigt, hvis alle involverede tabeller er i stand til transaktioner, såsom InnoDB eller BDB. Hvis du har MyISAM-tabeller derinde, skal insert
Udsagn vil ikke blive rullet tilbage.
Følgende fejler, forårsager source
kommandoen er ikke tilladt i en lagret procedure, den er snarere en del af mysql-klienten.
Hvis alt det er blevet overvejet, kan du gøre det sådan her:
Opret først en procedure som denne:
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 ;
Udfør det derefter sådan i dit script:
mysql -uuser -ppw -hhost databasename -e "CALL sp_exec_dump()"
Eller selvfølgelig parametrerer du proceduren med dumpfilnavnet.