Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MYSQL重播转储文件事务中的全部或无_Mysql_Shell_Mysqldump - Fatal编程技术网

MYSQL重播转储文件事务中的全部或无

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从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" -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
命令。