Observação:o seguinte é apenas testado aproximadamente, pode haver mais coisas a serem consideradas ao despejar, dependendo do seu banco de dados.
Isso só é possível em determinadas circunstâncias.
A primeira falha é que uma transação está vinculada a uma sessão. Desde que você se conecte novamente para emitir o
rollback
, o rollback
não tem utilidade, pois não há transação para reverter. Isso foi na outra sessão. A segunda falha é que geralmente um mysqldump tem várias instruções que lançam um
commit
implícito e, portanto, encerrar a transação. Isso inclui todas as instruções DDL (linguagem de definição de dados, isso inclui drop
, alter
, create
e assim por diante), bem como (un)lock tables
.Então, para executar seu dumpfile em uma única transação, o dump deveria ter sido criado mais ou menos assim:
mysqldump -uuser -ppw database --no-create-info --skip-add-locks --skip-disable-keys --skip-triggers >dumpfiles
--no-create-info
permite que o mysqldump pule todas as tabelas drop table ...; create table ...;
declarações. --skip-add-locks
permite que o mysqldump pule toda a tabela de lock table ...; unlock table ...;
declarações. --skip-disable-keys
permite que o mysqldump pule todos os alter table ... disable keys; alter table ...enable keys;
declarações. --skip-triggers
permite que o mysqldump pule todos os create trigger ...;
declarações. Há também uma
--single-transaction
opção, mas esta opção só seria aplicada a tabelas únicas. A terceira (possível) falha é que uma transação só pode ser revertida completamente, se todas as tabelas envolvidas forem capazes de transações, como InnoDB ou BDB. Se você tiver, por exemplo, tabelas MyISAM, o
insert
instruções não serão revertidas. O seguinte falha, faz com que o
source
O comando não é permitido em um procedimento armazenado, ele faz parte do cliente mysql. Primeiro crie um procedimento como este:
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 ;
Em seguida, execute-o assim em seu script:
mysql -uuser -ppw -hhost databasename -e "CALL sp_exec_dump()"
Ou é claro que você parametriza o procedimento com o nome do arquivo dump.