从log.sql全部或全部重新转储MYSQL
mysql -h "$databaseHost" -u "$username" --password="$password" "$databaseName" < /path/to/project/log.sql
如果这个log.sql文件在中间包含错误,那么在错误完成之前和错误之后的事务都没有完成..
但我希望整个sql文件显示为重新转储或者文件中的任何内容都不应该被重新转储 我正在使用MySQL数据库和Debian(6.0.1)O.S
log.sql
start transaction;
insert into demo_table values('abc');
insert just for to create an error;
insert into demo_table values('xyz');
commit;
它的shell脚本:
rollBack () {
if [ $mysql_error -eq 1 ]; then
mysql -h "$databaseHost" -u "$username" --password="$password" "$databaseName" -e "rollback;";
exit 0;
fi
}
mysql -h "$databaseHost" -u "$username" --password="$password" "$databaseName" < /path/to/project/log.sql|| if [ "$?" -ne 0 ]; then mysql_error=1; rollBack; fi
我尝试了这段代码,但没有任何帮助或建议请朋友们
答案 0 :(得分:3)
注意:以下只是粗略测试,转储时可能需要考虑更多事项,具体取决于您的数据库。
这在某些情况下才有可能。
首先失败的是,事务绑定到会话。由于您再次连接以发出rollback
,因此rollback
没有用,因为没有要回滚的事务。那是在另一场会议上。
第二个失败是,通常mysqldump有几个语句会转换隐式commit
,从而结束事务。这包括所有DDL语句(数据定义语言,包括drop
,alter
,create
等)以及(un)lock tables
。
因此,要在一个事务中执行dumpfile,应该创建类似这样的转储:
mysqldump -uuser -ppw database --no-create-info --skip-add-locks --skip-disable-keys --skip-triggers >dumpfiles
--no-create-info
让mysqldump跳过所有drop table ...; create table ...;
语句。
--skip-add-locks
让mysqldump跳过所有lock table ...; unlock table ...;
语句。
--skip-disable-keys
让mysqldump跳过所有alter table ... disable keys; alter table ...enable keys;
语句。
--skip-triggers
让mysqldump跳过所有create trigger ...;
语句。
还有一个--single-transaction
选项,但此选项仅适用于单个表。
第三个(可能的)失败是,如果涉及的所有表都能够进行交易,例如InnoDB或BDB,则只能完全回滚事务。如果那里有MyISAM表,那么insert
语句将不会被回滚。
以下失败,因为存储过程中不允许source
命令,它是mysql客户端的一部分。
如果考虑到所有这些,你可以这样做:
首先创建一个这样的过程:
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 ;
然后在你的脚本中执行它:
mysql -uuser -ppw -hhost databasename -e "CALL sp_exec_dump()"
当然,您可以使用dumpfile名称参数化该过程。