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.