导入大型sql文件(> 20GB)

时间:2013-03-01 19:04:43

标签: mysql sql import

我正在尝试将非常大的.sql文件导入我的数据库。该文件目前是20GB大。我尝试使用控制台mysql数据库< backup.sql但现在需要超过24小时,而mysql服务器不再做出任何反应。

如何导入这么大的文件?我认为拆分它是要走的路,但我怎样才能正确拆分?它只有一个包含多个插入语句的表。

4 个答案:

答案 0 :(得分:1)

MySQL具有内置于该语言中的api驱动表插入。见下文。 使用此:http://dev.mysql.com/doc/refman/5.1/en/load-data.html

您需要将文件从插入语句重新格式化为某种形式的csv等,但这应该比单个语句更快的顺序,因为它是一种与RDBMS通信的方式“我即将上传一个大量的数据,保存重新设置和簿记的开销直到最后,确保你有足够的空间并抓住那个空间而不是每次填满,确保你使用适当的锁等等,等等。“ / p>

答案 1 :(得分:0)

只需锁定表格,然后复制此表格数据文件(.frm,.MYI,.MYD)。
您可以立即获得可以导入任何数据库的现成数据文件。

这种方法对myisam非常有效。 不确定innodb。

答案 2 :(得分:0)

您可以拆分sql文件并将其导入数据库。

拆分sqldump文件的最简单方法是使用sqldumpsplitter软件,下载link

或者使用此终端命令拆分

split -l 5000 ./path/to/mysqldump.sql ./mysqldump/dbpart-

这里5000是sql命令的行数,你更喜欢拆分。接下来的两个参数分别是源路径和目标路径。将为单个拆分文件指定一个名称,并在其末尾附加字母。

希望它可以帮助有这个问题的其他人。

答案 3 :(得分:0)

我建议您在尝试跨分割文件保留SQL查询时考虑以下情况:

  • 单个SQL查询可以跨多行拆分,因此您不能逐行拆分
  • 有效的SQL查询将以分号(;)结束,大多数情况下,这将是行的结尾。

有了这两种情况的知识,您可以编写一个简单的脚本,逐行处理您的SQL转储,并在找到以分号(;)结尾的行或者500行这样的行时将其拆分。

我为类似的问题编写了这样一个脚本:https://gist.github.com/pratikone/0a8d503ffe893b2111f5a1d70d3999b7

它只检查行中的分号(;)而不是行的末尾,但是我没有查询中有分号(;)的任何SQL查询,所以它工作得非常好。鉴于此,如果您的数据在查询之间可以有分号,那么这是一个很小的变化。