Mysql
 sql >> Base de données >  >> RDS >> Mysql

MYSQL replay dumpfile tout ou rien dans une transaction

Remarque :La suite n'est testée qu'approximativement, il peut y avoir d'autres éléments à prendre en compte lors du vidage, en fonction de votre base de données.

Cela n'est possible que dans certaines circonstances.

Le premier échec est qu'une transaction est liée à une session. Puisque vous vous reconnectez pour émettre le rollback , le rollback n'a aucune utilité car il n'y a pas de transaction à annuler. C'était à l'autre séance.

Le deuxième échec est que, généralement, un mysqldump a plusieurs instructions qui lancent un commit implicite et donc mettre fin à la transaction. Cela inclut toutes les instructions DDL (langage de définition de données, cela inclut drop , alter , create et ainsi de suite) ainsi que (un)lock tables .
Ainsi, pour exécuter votre fichier de vidage en une seule transaction, le vidage doit avoir été créé quelque chose comme ceci :

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

--no-create-info permet à mysqldump d'ignorer toutes les tables drop table ...; create table ...; déclarations.

--skip-add-locks permet à mysqldump d'ignorer toutes les tables de verrouillage lock table ...; unlock table ...; déclarations.

--skip-disable-keys permet à mysqldump d'ignorer toutes les alter table ... disable keys; alter table ...enable keys; déclarations.

--skip-triggers laisse mysqldump ignorer tout create trigger ...; déclarations.

Il y a aussi un --single-transaction option, mais cette option ne s'appliquerait qu'aux tables uniques.

Le troisième échec (possible) est qu'une transaction ne peut être annulée complètement que si toutes les tables impliquées sont capables de transactions, comme InnoDB ou BDB. Si vous avez par exemple des tables MyISAM là-dedans, le insert les instructions ne seront pas annulées.

Ce qui suit échoue, cause le source La commande n'est pas autorisée dans une procédure stockée, elle fait plutôt partie du client mysql.

Si tout cela a été pris en compte, vous pouvez le faire comme ceci :

Créez d'abord une procédure comme celle-ci :

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 ;

Ensuite, exécutez-le comme ceci dans votre script :

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

Ou bien sûr vous paramétrez la procédure avec le nom du fichier de vidage.