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

ise*_*rds 5 mysql windows mariadb

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

我无法编辑这些文件以SET autocommit=0;在文件开头添加文本(这是缩短导入时间所必需的)。

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

mysql> CREATE DATABASE IF NOT EXISTS dbname;
mysql> USE dbname;
mysql> SET autocommit=0;
mysql> source file.sql;
mysql> COMMIT;
Run Code Online (Sandbox Code Playgroud)

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

mysql -u username -p -e "SET autocommit=0;" dbname < file.sql
Run Code Online (Sandbox Code Playgroud)

或者,

mysql -u username -p < initial_commands.sql < file.sql
Run Code Online (Sandbox Code Playgroud)

如果可能的话,我不想在autocommit每次执行此操作时更改全局设置,然后必须记住将其更改回来(我也不确定在没有 final 的情况下这是否有效COMMIT;)。

也许有一种方法可以使用BEGIN ... COMMIT;而不是关闭自动提交?

我很乐意接受必须做这种事情的人的任何建议!

小智 5

我的回答晚了,但它可能对未来的读者有所帮助。

我有同样的问题。在阅读有关 MySQL 命令选项的 MySQL 文档时,我发现您可以使用--init-command参数。

所以你的命令行将很简单:(-v对于详细并且是可选的)

mysql --init-command="SET autocommit=0;" -v < sql_file.sql
Run Code Online (Sandbox Code Playgroud)


Vla*_*oub 3

(echo set autocommit=0; && type file.sql && echo. && echo commit;) | mysql -u username -p passwd
Run Code Online (Sandbox Code Playgroud)

只需使用管道而不是输入重定向,对命令使用echo ,然后echo. 对于换行符