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
我想这代码它不工作的任何帮助或建议请朋友
注意:以下是只能大致检验,可能会有更多的东西倾倒时,根据您的数据库来考虑。
在某些情况下是唯一的可能。
第一次失败是,该交易被绑定到会话。 既然你再次连接发出rollback
时, rollback
有没有用,因为没有事务回滚。 这是在其他会议。
第二次失败是,这通常是一个mysqldump的有几个报表时投下一个隐含的commit
,并因此结束事务。 这包括所有DDL语句(数据定义语言,这包括drop
, alter
, create
等),以及(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()"
或者,你当然参数与转储文件名的程序。