Mysql
 sql >> база данни >  >> RDS >> Mysql

MYSQL възпроизвеждане на dumpfile всичко или нищо в транзакция

Забележка:Следното е тествано само грубо, може да има повече неща, които да вземете предвид при изхвърляне, в зависимост от вашата база данни.

Това е възможно само при определени обстоятелства.

Първият неуспех е, че транзакцията е обвързана със сесия. Тъй като се свързвате отново, за да издадете rollback , rollback няма полза, тъй като няма транзакция за връщане назад. Това беше в другата сесия.

Вторият неуспех е, че обикновено mysqldump има няколко оператора, които хвърлят имплицитно commit и следователно да прекрати транзакцията. Това включва всички DDL изрази (език за дефиниране на данни, това включва drop , alter , create и така нататък), както и (un)lock tables .
Така че, за да изпълните вашия dumpfile в една единствена транзакция, дъмпът трябва да е създаден нещо подобно:

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

--no-create-info позволява на mysqldump да пропусне всички drop table ...; create table ...; изявления.

--skip-add-locks позволява на mysqldump да пропусне цялата lock table ...; unlock table ...; изявления.

--skip-disable-keys позволява на mysqldump да пропусне всички alter table ... disable keys; alter table ...enable keys; изявления.

--skip-triggers позволява на mysqldump да пропусне всички create trigger ...; изявления.

Има и --single-transaction опция, но тази опция ще бъде приложена само към единични таблици.

Третият (възможен) неуспех е, че дадена транзакция може да бъде върната напълно, само ако всички включени таблици са способни на транзакции, като InnoDB или BDB. Ако имате например MyISAM таблици там, insert изразите няма да бъдат върнати назад.

Следното е неуспешно, предизвика source командата не е разрешена в съхранена процедура, тя е по-скоро част от mysql клиента.

Ако всичко това е взето предвид, можете да го направите по следния начин:

Първо създайте процедура като тази:

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 ;

След това го изпълнете по този начин във вашия скрипт:

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

Или, разбира се, параметризирате процедурата с името на dumpfile.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да намерите дубликати в 2 колони, а не в 1

  2. Има ли начин да се извлече текст, съответстващ на регулярен израз от колона в MySQL?

  3. MySQL Insert:Тестване първо?

  4. Как да шифровате трафика от хибридна облачна база данни

  5. Предотвратяване на влизане на няколко едни и същи потребители в настолно приложение