8

我正在尝试将一个非常大的 .sql 文件导入我的数据库。该文件目前为 20GB 大。我尝试使用控制台 mysql database < backup.sql 但这需要超过 24 小时,并且 mysql 服务器不再有任何反应。

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

4

4 回答 4

1

MySQL 在语言中内置了 api 驱动的表插入。见下文。使用这个:http ://dev.mysql.com/doc/refman/5.1/en/load-data.html

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

于 2013-03-01T19:11:26.680 回答
0

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

分割sqldump文件最简单的方法是使用sqldumpsplitter软件,下载链接

否则使用此终端命令拆分

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

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

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

于 2015-03-09T17:39:26.830 回答
0

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

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

于 2013-03-01T19:18:23.527 回答
0

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

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

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

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

它只检查行中的分号(;)而不是行尾,但我没有任何 SQL 查询在查询中包含分号(;),所以它工作得很好。鉴于此,如果您的数据在查询之间可以有分号,则需要做一个小改动。

于 2017-11-03T16:04:30.790 回答