sql >> Database teknologi >  >> RDS >> Mysql

MYSQL genafspil dumpfil alt eller intet i en transaktion

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.




  1. Hvordan sætter man en streng foran en kolonneværdi i MySQL?

  2. Kolonne Butiksplaner

  3. Har problemer med en MySQL Join, der skal opfylde flere betingelser

  4. Brug af MySQL's TIMESTAMP vs lagring af tidsstempler direkte