我正在尝试将一个非常大的 .sql 文件导入我的数据库。该文件目前为 20GB 大。我尝试使用控制台 mysql database < backup.sql 但这需要超过 24 小时,并且 mysql 服务器不再有任何反应。
如何导入这么大的文件?我认为拆分它是要走的路,但是我怎样才能正确拆分它呢?它只是一个带有多个插入语句的表。
MySQL 在语言中内置了 api 驱动的表插入。见下文。使用这个:http ://dev.mysql.com/doc/refman/5.1/en/load-data.html
您需要将文件从插入语句重新格式化为某种形式的 csv 等,但这应该比单个语句更快,因为它是与 RDBMS 通信的一种方式“我即将上传大量数据,将重新索引和簿记开销保存到最后,确保您有足够的空间并抓住该空间一次而不是每次填满,确保使用适当的锁等,等等,等等”。
您可以拆分sql文件并将其导入数据库。
分割sqldump文件最简单的方法是使用sqldumpsplitter
软件,下载链接
否则使用此终端命令拆分
split -l 5000 ./path/to/mysqldump.sql ./mysqldump/dbpart-
这里 5000 是 sql 命令的行数,你喜欢拆分。接下来的两个参数分别是源路径和目标路径。单独的拆分文件将被分配一个名称,并在其末尾附加一个字母。
希望它可以帮助其他有这个问题的人。
只需锁定表,然后复制此表数据文件(.frm、.MYI、.MYD)。
您立即获得可以导入任何数据库的现成数据文件。
这种方法对 myisam 非常有效。不确定innodb。
我建议您在尝试跨拆分文件保留 SQL 查询时考虑以下情况:
掌握这两种情况的知识后,您可以编写一个简单的脚本,该脚本逐行处理您的 SQL 转储,并在找到以分号 (;) 结尾的行或 500 行这样的行时将其拆分为块。
我已经为我遇到的类似问题编写了这样一个脚本:https ://gist.github.com/pratikone/0a8d503ffe893b2111f5a1d70d3999b7
它只检查行中的分号(;)而不是行尾,但我没有任何 SQL 查询在查询中包含分号(;),所以它工作得很好。鉴于此,如果您的数据在查询之间可以有分号,则需要做一个小改动。