我正在尝试将大型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密码
只需使用管道而不是输入重定向,对命令使用echo和echo。 换行
你的目标可能会适得其反。 也就是说,将整个负载转换为单个事务可能比增量式地执行慢。
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'