Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MYSQL replay dumpfile tudo ou nada em uma transação


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.

Se tudo isso foi considerado, você pode fazer assim:

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.