sql >> Database >  >> RDS >> Mysql

MYSQL herhaal dumpfile alles of niets in een transactie

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.




  1. Het opslaan van de uitvoer van een dynamische query die gebruikmaakt van de instructie voorbereiden in een tabel

  2. Meerdere rijen samenvoegen tot één kolom in MySQL

  3. Hoe bepaal ik de maximale transactiegrootte in MySQL?

  4. Hoe installeer ik de pg gem van PostgreSQL op Ubuntu?