MYSQL重播转储文件在一个事务中全有或全无(MYSQL replay dumpfile all o

2019-10-19 19:16发布

MYSQL从log.sql全有或全无重新转储

mysql -h "$databaseHost" -u "$username" --password="$password" "$databaseName" <                      /path/to/project/log.sql

如果此log.sql文件包含在中间的一个错误,那么错误之前交易完成和错误后都没有做..

但我想,要么整个的SQL文件显示重新转储或没有从文件中我使用MySQL数据库和Debian(6.0.1)操作系统应重新倾倒

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

我想这代码它不工作的任何帮助或建议请朋友

Answer 1:

注意:以下是只能大致检验,可能会有更多的东西倾倒时,根据您的数据库来考虑。

在某些情况下是唯一的可能。

第一次失败是,该交易被绑定到会话。 既然你再次连接发出rollback时, rollback有没有用,因为没有事务回滚。 这是在其他会议。

第二次失败是,这通常是一个mysqldump的有几个报表时投下一个隐含的commit ,并因此结束事务。 这包括所有DDL语句(数据定义语言,这包括dropaltercreate等),以及(un)lock tables
因此,在一个单一的交易执行你的转储文件,转储应该已经创造了这样的事情:

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

--no-create-info让mysqldump的跳过所有drop table ...; create table ...; drop table ...; create table ...; 声明。

--skip-add-locks让mysqldump的跳过所有lock table ...; unlock table ...; lock table ...; unlock table ...; 声明。

--skip-disable-keys允许的mysqldump跳过所有alter table ... disable keys; alter table ...enable keys; alter table ... disable keys; alter table ...enable keys; 声明。

--skip-triggers让mysqldump的跳过所有create trigger ...; 声明。

还有一个--single-transaction选项,但该选项将只适用于单个表。

第三个(可能的)失败,一个交易只可以完全rollbacked,如果所涉及的所有表都可以交易,比如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()"

或者,你当然参数与转储文件名的程序。



文章来源: MYSQL replay dumpfile all or nothing in a transaction