导入非常大的SQL文件(MySQL)时的单一提交

我正在尝试将大型SQL文件(> 2.5 Gb)还原到Windows上的MySQL数据库中。

我无法编辑这些文件来添加文本,如SET autocommit=0; 在文件的开头(这是必要的,以提高import时间)。

我也无法使用source ,因为这会输出到屏幕(非常慢),即使文件中有任何错误,执行也会继续。 例如:

 mysql> CREATE DATABASE IF NOT EXISTS dbname; mysql> USE dbname; mysql> SET autocommit=0; mysql> source file.sql; mysql> COMMIT; 

在导入仅适用于当前会话的SQL文件之前和之后,是否可以运行任意命令? 我已经尝试了以下两种方法,并且都不能在Windows上工作(在这两种情况下,第二个操作都将被忽略):

 mysql -u username -p -e "SET autocommit=0;" dbname < file.sql 

要么,

 mysql -u username -p < initial_commands.sql < file.sql 

如果可能的话,我不想在每次这样做时更改全局autocommit设置,然后必须记住将其更改回来(同样我不确定没有最终的COMMIT; ,这将工作)。

也许有一种方法可以使用BEGIN ... COMMIT; 而不是closuresautocommit?

我会很高兴有人做任何build议这样的事情!

(echo set autocommit = 0; && type file.sql && echo。&& echo commit;)| mysql -u用户名-p密码

只需使用管道而不是输入重定向,对命令使用echoecho。 换行

你的目标可能会适得其反。 也就是说,将整个负载转换为单个事务可能比增量式地执行慢。

set autocommit=0意味着所有插入(和其他写入)因此(直到commit )需要记录潜在的ROLLBACK 。 起初,常规的日志机制可以写一堆。 但是,在某种程度上,一个更复杂的机制正在起作用。这涉及到更多的磁盘I / O,这是数据库中最慢的部分。

另一种方法是删除“提交”进程的重要部分 – 用于刷新提交事务的fsync。 innodb_flush_log_at_trx_commit控制这样的。 “安全”的默认值可能是=1 。 许多人跑=2 ,这是不太安全,但限制每秒一次fsyncs。 “不安全”的部分是,如果你有电源故障,任何在最后一秒运行的事务可能已经被确认到客户端,实际上被持久化到磁盘。

由于该设置可能需要在连接之前完成,请考虑一个简单的3行.bat脚本(文件):

 mysql -e 'SET GLOBAL innodb_flush_log_at_trx_commit = 2' mysql dbname < file.sql mysql -e 'SET GLOBAL innodb_flush_log_at_trx_commit = 1'