如何为 mysql 快速导入一个巨大的 sql 脚本?

how to FAST import a giant sql script for mysql?

目前我有一种情况需要将一个巨大的 sql 脚本导入 mysql。 sql脚本内容主要是INSERT操作。但是那边的记录太多了,文件大小在80GB左右。

机器有 8 个 CPU,20GB 内存。我做了类似的事情:

mysql -h [*host_ip_address*] -u *username* -px xxxxxxx -D *databaseName* < giant.sql

但是整个过程需要 几天,这与 long.Is 将 sql 文件导入数据库有什么其他选择吗?

非常感谢。

我建议你试试LOAD DATA INFILE. It is extremely fast. I've not used it for loading to remote server, but there is mysqlimport utility. See a comparison of different approaches: https://dev.mysql.com/doc/refman/5.5/en/insert-speed.html

您还需要将 sql 脚本转换为适合 LOAD DATA INFILE 子句的格式。

您可以使用shell脚本将sql文件拆分成几个文件(根据表格)然后准备一个shell脚本一个一个导入文件.这将快速插入而不是一次性插入。

原因是插入的记录占用了space单个进程的内存,并没有被移除。可以看到5小时后导入脚本时查询执行速度会变慢。

感谢大家的帮助。

我已经采纳了您的一些建议并对此做了一些比较,现在是 post 结果的时候了。目标单个sql脚本15GB.

总的来说,我尝试了:

  1. 将数据导入为带有索引的单个 sql 脚本; (花了 ,最后我杀了它。不要自己尝试,你会生气的。)
  2. 将数据导入为单个 sql 没有索引的脚本; (同上)
  3. 将数据导入为带有索引的拆分 sql 脚本(以单个 sql 为例,我将大文件拆分为每个 41MB 左右的小主干。每个主干大约需要 2m19.586s,总计约 );
  4. 将数据导入为没有索引的拆分 sql 脚本; (每个行李箱需要 2m9.326s。)

(遗憾的是我没有尝试此数据集的加载数据方法)

结论:

如果您不想在必须将巨型 sql 导入 mysql 时使用加载数据方法。最好是:

  1. 分成小脚本;
  2. 删除索引

您可以在导入后重新添加索引。干杯

谢谢@btilly @Hitesh Mundra

将以下命令放在giant.sql文件的开头

SET AUTOCOMMIT = 0;
SET FOREIGN_KEY_CHECKS=0;

最后跟进

SET FOREIGN_KEY_CHECKS = 1;
COMMIT;
SET AUTOCOMMIT = 1;