MYSQL重播转储文件事务中的全部或无
MYSQL从log.sql全部或全部重新转储MYSQL重播转储文件事务中的全部或无,mysql,shell,mysqldump,Mysql,Shell,Mysqldump,MYSQL从log.sql全部或全部重新转储 mysql -h "$databaseHost" -u "$username" --password="$password" "$databaseName" < /path/to/project/log.sql 它的shell脚本: rollBack () { if [ $mysql_error -eq 1 ]; then mysql -h "$databaseHost
mysql -h "$databaseHost" -u "$username" --password="$password" "$databaseName" < /path/to/project/log.sql
它的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
回滚(){
如果[$mysql_error-eq 1];则
mysql-h“$databaseHost”-u“$username”-password=“$password”“$databaseName”-e”rollback;”;
出口0;
fi
}
mysql-h“$databaseHost”-u“$username”-password=“$password”“$databaseName”
我试过这个代码,没有任何帮助或建议请朋友们[P/P>
注:下面只粗略地测试,在倾倒时可能会考虑更多的事情,取决于你的数据库。
这只有在某些情况下才有可能 第一个失败是,事务绑定到会话。由于您再次连接以发出回滚
,因此回滚
没有用处,因为没有要回滚的事务。那是在另一次会议上
第二个失败是,mysqldump通常有几个语句,这些语句强制转换隐式的commit
,从而结束事务。这包括所有DDL语句(数据定义语言,包括drop
、alter
、create
等)以及(un)锁表
因此,要在一个事务中执行转储文件,应该创建如下转储:
mysqldump -uuser -ppw database --no-create-info --skip-add-locks --skip-disable-keys --skip-triggers >dumpfiles
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 ;
--no create info
允许mysqldump跳过所有删除表。。。;创建表代码>语句
——跳过添加锁
让mysqldump跳过所有锁表。。。;解锁表代码>语句
--跳过禁用键
允许mysqldump跳过所有更改表。。。禁用密钥;改变表…启用键代码>语句
--跳过触发器
允许mysqldump跳过所有创建触发器代码>语句
还有一个--singletransaction
选项,但该选项将仅应用于单个表
第三个(可能的)失败是,如果涉及的所有表都能够进行事务(如InnoDB或BDB),则只能完全回滚事务。如果其中有i.e.MyISAM表,则不会回滚insert
语句
以下操作失败,因为存储过程中不允许使用source
命令,它是mysql客户端的一部分
如果已经考虑了所有这些,您可以这样做:
mysqldump -uuser -ppw database --no-create-info --skip-add-locks --skip-disable-keys --skip-triggers >dumpfiles
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 ;
首先创建如下过程:
mysqldump -uuser -ppw database --no-create-info --skip-add-locks --skip-disable-keys --skip-triggers >dumpfiles
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名称参数化过程。
我在行中的SQLEXCEPTION的declare CONTINUE处理程序附近尝试了存储过程的give me语法错误。是否使用了分隔符$$
语句?@user310685更正了该错误。请重试。错误代码:1064。您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以了解在“/path/to/dumpfile.sql”附近使用的正确语法;犯罪在第13Ah行结束,很抱歉,似乎存储过程中不允许使用source
命令。