MYSQL在事务中全部或全部重放dumpfile

时间:2014-04-07 10:01:31

标签: mysql shell mysqldump

从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

我尝试了这段代码,但没有任何帮助或建议请朋友们

1 个答案:

答案 0 :(得分:3)

注意:以下只是粗略测试,转储时可能需要考虑更多事项,具体取决于您的数据库。

这在某些情况下才有可能。

首先失败的是,事务绑定到会话。由于您再次连接以发出rollback,因此rollback没有用,因为没有要回滚的事务。那是在另一场会议上。

第二个失败是,通常mysqldump有几个语句会转换隐式commit,从而结束事务。这包括所有DDL语句(数据定义语言,包括dropaltercreate等)以及(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名称参数化该过程。