Opmerking:het volgende is slechts globaal getest, er kunnen meer dingen zijn waarmee u rekening moet houden bij het dumpen, afhankelijk van uw database.
Dat is alleen mogelijk onder bepaalde omstandigheden.
De eerste fout is dat een transactie aan een sessie is gebonden. Aangezien u opnieuw verbinding maakt om de rollback
uit te voeren , de rollback
heeft geen zin omdat er geen transactie is om terug te draaien. Dat was in de andere sessie.
De tweede fout is dat een mysqldump meestal meerdere statements heeft die een impliciete commit
opleveren en beëindig daarom de transactie. Dit omvat alle DDL-instructies (taal voor gegevensdefinitie, inclusief drop
, alter
, create
enzovoort) evenals (un)lock tables
.
Dus, om je dumpfile in één enkele transactie uit te voeren, zou de dump ongeveer als volgt moeten zijn gemaakt:
mysqldump -uuser -ppw database --no-create-info --skip-add-locks --skip-disable-keys --skip-triggers >dumpfiles
--no-create-info
laat mysqldump alle drop table ...; create table ...;
verklaringen.
--skip-add-locks
laat mysqldump alle lock table ...; unlock table ...;
verklaringen.
--skip-disable-keys
laat mysqldump alle alter table ... disable keys; alter table ...enable keys;
verklaringen.
--skip-triggers
laat mysqldump alles overslaan create trigger ...;
verklaringen.
Er is ook een --single-transaction
optie, maar deze optie zou alleen worden toegepast op enkele tabellen.
Derde (mogelijke) fout is dat een transactie alleen volledig kan worden teruggedraaid als alle betrokken tabellen in staat zijn tot transacties, zoals InnoDB of BDB. Als je bijv. MyISAM-tabellen hebt, de insert
uitspraken worden niet teruggedraaid.
Het volgende mislukt, veroorzaakt de source
commando is niet toegestaan in een opgeslagen procedure, het maakt eerder deel uit van de mysql-client.
Als dat allemaal is overwogen, kun je het als volgt doen:
Maak eerst een procedure zoals deze:
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 ;
Voer het dan als volgt uit in je script:
mysql -uuser -ppw -hhost databasename -e "CALL sp_exec_dump()"
Of je parametreert de procedure natuurlijk met de dumpfile-naam.