sql >> Databáze >  >> RDS >> Mysql

MYSQL replay dumpfile vše nebo nic v transakci

Poznámka:Následující text je testován pouze hrubě, v závislosti na vaší databázi může být při ukládání zvažováno více věcí.

To je možné pouze za určitých okolností.

První selhání je, že transakce je vázána na relaci. Protože se znovu připojíte a vydáte rollback , rollback nemá využití, protože neexistuje žádná transakce, kterou by bylo možné vrátit zpět. To bylo na druhém zasedání.

Druhým selháním je, že obvykle má mysqldump několik příkazů, které vrhají implicitní commit a proto transakci ukončit. To zahrnuje všechny příkazy DDL (jazyk pro definici dat, to zahrnuje drop , alter , create a tak dále) a také (un)lock tables .
Pro spuštění souboru výpisu v jedné transakci by měl být výpis vytvořen přibližně takto:

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

--no-create-info umožňuje mysqldump přeskočit všechny drop table ...; create table ...; prohlášení.

--skip-add-locks umožňuje mysqldump přeskočit všechny lock table ...; unlock table ...; prohlášení.

--skip-disable-keys umožňuje mysqldump přeskočit všechny alter table ... disable keys; alter table ...enable keys; prohlášení.

--skip-triggers umožňuje mysqldump přeskočit vše create trigger ...; prohlášení.

Existuje také --single-transaction možnost, ale tato možnost by byla aplikována pouze na jednotlivé tabulky.

Třetím (možným) selháním je, že transakci lze úplně vrátit zpět pouze tehdy, pokud jsou všechny zahrnuté tabulky schopné transakcí, jako je InnoDB nebo BDB. Pokud tam máte např. tabulky MyISAM, insert příkazy nebudou vráceny zpět.

Následující selže, protože source příkaz není v uložené proceduře povolen, je spíše součástí klienta mysql.

Pokud bylo zváženo vše, můžete to udělat takto:

Nejprve vytvořte postup, jako je tento:

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 ;

Poté jej spusťte takto ve svém skriptu:

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

Nebo samozřejmě parametrizujete proceduru s názvem dumpfile.




  1. KLÍČE SQL

  2. Optimalizace odstranění na SQL Server

  3. Mám indexovat bitové pole na serveru SQL Server?

  4. MySQL:Jaký je rozdíl mezi float a double?