sql >> Base de Datos >  >> RDS >> Mysql

Archivo de volcado de reproducción MYSQL todo o nada en una transacción

Nota:lo siguiente solo se prueba de manera aproximada, puede haber más cosas a considerar al descargar, dependiendo de su base de datos.

Eso solo es posible bajo ciertas circunstancias.

El primer error es que una transacción está vinculada a una sesión. Desde que te conectas de nuevo para emitir el rollback , el rollback no tiene uso ya que no hay transacción para revertir. Eso fue en la otra sesión.

La segunda falla es que, por lo general, mysqldump tiene varias declaraciones que emiten un commit implícito y por lo tanto finalizar la transacción. Esto incluye todas las declaraciones DDL (lenguaje de definición de datos, esto incluye drop , alter , create y así sucesivamente) así como (un)lock tables .
Entonces, para ejecutar su archivo de volcado en una sola transacción, el volcado debería haber sido creado de la siguiente manera:

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

--no-create-info permite que mysqldump omita todas las drop table ...; create table ...; declaraciones.

--skip-add-locks permite que mysqldump salte toda la tabla de bloqueo lock table ...; unlock table ...; declaraciones.

--skip-disable-keys permite que mysqldump omita todo alter table ... disable keys; alter table ...enable keys; declaraciones.

--skip-triggers permite que mysqldump omita todo create trigger ...; declaraciones.

También hay una --single-transaction opción, pero esta opción solo se aplicaría a tablas individuales.

El tercer (posible) error es que una transacción solo se puede revertir por completo si todas las tablas involucradas son capaces de realizar transacciones, como InnoDB o BDB. Si tiene, por ejemplo, tablas MyISAM allí, insert las declaraciones no se revertirán.

Lo siguiente falla, causa el source El comando no está permitido en un procedimiento almacenado, es más bien parte del cliente mysql.

Si se ha considerado todo eso, puedes hacerlo así:

Primero cree un procedimiento 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 ;

Luego ejecútelo así en su script:

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

O, por supuesto, parametriza el procedimiento con el nombre del archivo de volcado.