sql >> Databasteknik >  >> RDS >> Mysql

MYSQL spela upp dumpfilen allt eller inget i en transaktion

Obs:Följande testas endast grovt, det kan finnas fler saker att tänka på när du dumpar, beroende på din databas.

Det är bara möjligt under vissa omständigheter.

Det första misslyckandet är att en transaktion är bunden till en session. Eftersom du ansluter igen för att utfärda rollback , rollback har ingen användning eftersom det inte finns någon transaktion att återställa. Det var i den andra sessionen.

Det andra misslyckandet är att en mysqldump vanligtvis har flera uttalanden som avger en implicit commit och därför avsluta transaktionen. Detta inkluderar alla DDL-satser (datadefinitionsspråk, detta inkluderar drop). , alter , create och så vidare) samt (un)lock tables .
Så, för att köra din dumpfil i en enda transaktion, borde dumpen ha skapats ungefär så här:

mysqldump -uuser -ppw database --no-create-info --skip-add-locks --skip-disable-keys --skip-triggers >dumpfiles

--no-create-info låter mysqldump hoppa över alla drop table ...; create table ...; uttalanden.

--skip-add-locks låter mysqldump hoppa över alla lock table ...; unlock table ...; uttalanden.

--skip-disable-keys låter mysqldump hoppa över alla alter table ... disable keys; alter table ...enable keys; uttalanden.

--skip-triggers låter mysqldump hoppa över alla create trigger ...; uttalanden.

Det finns också en --single-transaction alternativet, men det här alternativet skulle bara tillämpas på enstaka tabeller.

Det tredje (möjliga) felet är att en transaktion endast kan återställas helt om alla inblandade tabeller kan utföra transaktioner, som InnoDB eller BDB. Om du har d.v.s. MyISAM-tabeller där, insert uttalanden kommer inte att återställas.

Följande misslyckas, orsaka source kommandot är inte tillåtet i en lagrad procedur, det är snarare en del av mysql-klienten.

Om allt detta har övervägts kan du göra det så här:

Skapa först en procedur så här:

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 ;

Kör sedan så här i ditt skript:

mysql -uuser -ppw -hhost databasename -e "CALL sp_exec_dump()"

Eller självklart parametrerar du proceduren med dumpfilens namn.




  1. Hämta arrayfunktions dubbla värden i varje position i arrayen?

  2. Mellanslag i ett databasfält tas inte bort av trim()

  3. Ajax delete fungerar inte i laravel 5.2

  4. Hur beställer man efter max två kolumner som kan vara null i MySQL?