gpt4 book ai didi

shell - MYSQL 在一个事务中重放转储文件全部或全部

转载 作者:行者123 更新时间:2023-11-29 05:23:29 24 4
gpt4 key购买 nike

MYSQL 从 log.sql 全部或全部重新转储

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

如果此 log.sql 文件在中间包含错误,则错误之前的事务完成,错误之后的事务未完成..

但我希望要么重新转储整个 sql 文件显示,要么不重新转储文件中的任何内容我正在使用 MySQL 数据库和 Debian(6.0.1) 操作系统

日志.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

我试过这段代码,它不起作用请 friend 们提供任何帮助或建议

最佳答案

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

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

第一个失败是事务绑定(bind)到 session 。由于您再次连接以发出 rollback,因此 rollback 没有用处,因为没有要回滚的事务。那是在另一届 session 上。

第二个失败是,通常 mysqldump 有几个语句,这些语句转换隐式 commit 并因此结束事务。这包括所有 DDL 语句(数据定义语言,这包括 dropaltercreate 等)以及 (un )锁表
因此,要在单个事务中执行您的转储文件,转储应该像这样创建:

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

--no-create-info 让 mysqldump 跳过所有 drop table ...;创建表 ...; 语句。

--skip-add-locks 让 mysqldump 跳过所有 lock table ...;解锁表 ...; 语句。

--skip-disable-keys 让 mysqldump 跳过所有 alter table ... 禁用键; 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()"

或者您当然可以使用转储文件名称对过程进行参数化。

关于shell - MYSQL 在一个事务中重放转储文件全部或全部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22909215/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com