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.