如何快速为 mysql 导入一个巨大的 sql 脚本?
Posted
技术标签:
【中文标题】如何快速为 mysql 导入一个巨大的 sql 脚本?【英文标题】:how to FAST import a giant sql script for mysql? 【发布时间】:2015-04-24 05:04:26 【问题描述】:目前我有一种情况需要将一个巨大的 sql 脚本导入 mysql。 sql脚本内容主要是INSERT操作。但是那里的记录太多了,文件大小在80GB左右。
这台机器有 8 个 CPU,20GB 内存。我做了类似的事情:
mysql -h [*host_ip_address*] -u *username* -px xxxxxxx -D *databaseName* < giant.sql
但是整个过程需要几天,相当长。还有其他选项可以将sql文件导入数据库吗?
非常感谢。
【问题讨论】:
在这个阶段,我认为问题在于您的互联网连接,而不是您解决问题的方式。 80GB 相当重要。 你在运行什么项目? @utility 一些人类基因组数据。你知道,它们是巨大的东西。 :) @Marty 实际上,两台机器都在同一个局域网内。据我所知,互联网速度非常快。我在想我的方法有什么问题。即mysql会缓存整个giant.sql吗? 这么多数据的天数表明您正在进行大量随机写入。一个经常有帮助的老把戏。删除所有索引。导入数据。重新创建索引。 【参考方案1】:我建议你试试LOAD DATA INFILE。它非常快。我没有用它来加载到远程服务器,但是有mysqlimport 实用程序。查看不同方法的比较:https://dev.mysql.com/doc/refman/5.5/en/insert-speed.html。
您还需要将您的 sql 脚本转换为适合LOAD DATA INFILE
子句的格式。
【讨论】:
【参考方案2】:您可以使用shell脚本将sql文件分成几个文件(基于表),然后一个一个地准备一个shell脚本来导入文件。这将快速插入而不是一次性插入。
原因是插入的记录占用了单个进程的内存空间而不是删除。可以看到,5小时后导入脚本时查询执行速度会变慢。
【讨论】:
【参考方案3】:感谢大家的帮助。
我已经听取了您的一些建议并对此进行了一些比较,现在是时候发布结果了。目标单条sql脚本15GB。
总的来说,我试过了:
-
将数据作为带索引的单个 sql 脚本导入; (花了 几天,最后我杀了它。不要自己尝试,你会生气的。)
将数据导入为没有索引的单个 sql 脚本; (同上)
将数据导入为带索引的拆分sql脚本(以单个sql为例,我将大文件拆分为每个41MB左右的小trunk。每个trunk大约需要2m19.586s,总共大约) ;
将数据作为没有索引的分割sql脚本导入; (每个树干需要 2m9.326s。)
(很遗憾我没有尝试这个数据集的加载数据方法)
结论:
如果你不想在你必须将一个巨大的 sql 导入 mysql 时使用 Load Data 方法。最好是:
-
分成小脚本;
删除索引
您可以在导入后重新添加索引。干杯
感谢@btilly @Hitesh Mundra
【讨论】:
【参考方案4】:将以下命令放在 Giant.sql 文件的头部
SET AUTOCOMMIT = 0;
SET FOREIGN_KEY_CHECKS=0;
并在最后跟进
SET FOREIGN_KEY_CHECKS = 1;
COMMIT;
SET AUTOCOMMIT = 1;
【讨论】:
以上是关于如何快速为 mysql 导入一个巨大的 sql 脚本?的主要内容,如果未能解决你的问题,请参考以下文章