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.