用于在 MySQL 中执行非常大 (20 GB) .sql 文件的更高速度选项
为了响应政府的数据请求,我的公司收到了一个 20+ GB 的 .sql 文件。我没有太多选择来获取不同格式的数据,因此我需要选择如何在合理的时间内导入数据。我使用 Navicat 的批处理执行工具在高端服务器(Win 2008 64 位,MySQL 5.1)上运行它。它已经运行了 14 个小时,并且没有任何即将完成的迹象。
有谁知道此类交易有更高速度的选择吗?或者考虑到文件很大,这是我应该期待的吗?
谢谢
My firm was delivered a 20+ GB .sql file in reponse to a request for data from the gov't. I don't have many options for getting the data in a different format, so I need options for how to import it in a reasonable amount of time. I'm running it on a high end server (Win 2008 64bit, MySQL 5.1) using Navicat's batch execution tool. It's been running for 14 hours and shows no signs of being near completion.
Does anyone know of any higher speed options for such a transaction? Or is this what I should expect given the large file size?
Thanks
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
我猜你的意思是它是由
mysqldump
生成的文件作为数据库的备份,因此它主要包含CREATE TABLE
和INSERT
语句。(但严格来说,SQL 脚本可以包含任何内容,例如长时间运行的存储过程的定义和执行、导致死锁的查询等。我假设情况并非如此。)
鉴于您有备份文件并且无法更改文件类型,您可以采取以下措施来加快恢复速度:
禁用外键检查:
SET FOREIGN_KEY_CHECKS=0
(记住重新启用然后)。也禁用唯一检查:
SET UNIQUE_CHECKS =0
确保您的
key_buffer_size
设置得尽可能大。默认为 8MB,最大为 4GB。我会尝试 1GB。这些第一个提示来自 Baron Schwartz 的帖子:http://lists.mysql.com/ mysql/206866
确保您的
innodb_buffer_pool_size
设置得尽可能大。默认为 8MB,最大为 4GB。我会尝试 1GB。设置
innodb_flush_log_at_trx_commit = 2
@Mark B 在下面添加了一个很好的建议:禁用键 恢复期间。您可以这样做:
但是该命令一次仅影响一个表。您必须为每个表发出单独的命令。也就是说,通常情况下,一个表比其他表大得多,因此您可能只需要禁用该大表的键。
此外,如果包含还原的 SQL 脚本删除并重新创建表,这将避免禁用键。您必须找到某种方法来插入命令以在创建表之后和插入行之前禁用键。您可能需要创造性地使用
sed
来预处理 SQL 脚本,然后再将其提供给 mysql 客户端。使用 Percona Server 版本的 mysqldump,以及 - -innodb-optimize-keys 选项。
I guess you mean it's a file produced by
mysqldump
as a backup of a database, so it contains mostlyCREATE TABLE
andINSERT
statements.(But strictly speaking, an SQL script can contain anything, such as definition and execution of long-running stored procedures, queries that result in deadlocks, etc. I'll assume this is not the case.)
Here are some things you can do to speed up restore, given that you have the backup file and can't change the type of file it is:
Disable foreign key checks:
SET FOREIGN_KEY_CHECKS=0
(remember to re-enableafterwards). Disable unique checks too:
SET UNIQUE_CHECKS=0
Make sure your
key_buffer_size
is set as large as possible if you use MyISAM tables. The default is 8MB, and the max is 4GB. I'd try 1GB.These first tips come from a post by Baron Schwartz: http://lists.mysql.com/mysql/206866
Make sure your
innodb_buffer_pool_size
is set as large as possible if you use InnoDB tables. The default is 8MB, and the max is 4GB. I'd try 1GB.Set
innodb_flush_log_at_trx_commit = 2
during the restore if you use InnoDB tables.@Mark B adds a good suggestion below to disable keys during a restore. This is how you do it:
But that command affects only one table at a time. You'll have to issue a separate command for each table. That said, it's often the case that one table is much larger than the other tables, so you may need to disable keys only for that one large table.
Also, if the SQL script containing your restore drops and recreates tables, this would circumvent disabling keys. You'll have to find some way to insert the commands to disable keys after the table is created and before rows are inserted. You may need to get creative with
sed
to preprocess the SQL script before feeding it to the mysql client.Use the Percona Server version of mysqldump, with the --innodb-optimize-keys option.
周围有大量工具,但我建议使用 Navicat GUI 来完成此操作。
根据我的经验,它可以在 8GB RAM 的主机上在 6 小时内运行 48GB *.sql 文件。
解释(有点)在这里:
再次单击所选数据库,选择“执行 SQL 文件”,选择文件,如果需要,选择“出错时继续”,最后运行它。
我知道它显示了 MySQL 数据库,但适用于最常用/流行的 DBMS。
我真的不建议在他们的sql查询生成器中“打开”这样比例的文件,它会阻塞机器,因为RAM会一遍又一遍地满负荷。
这也适用于作为 Navicat 应用程序主机的 Macintosh 操作系统,一旦连接到给定的数据库服务器,您就可以在任何您想要的地方运行它,到目前为止,它在 RHEL、Ubuntu Server、Debian 和 Windows Server 上运行得很好。
There is a big amount of tools around, but I would recommend Navicat GUI to do that.
In my experience it could run 48GB *.sql files in 6 hours on a host with 8GB of RAM.
Explanation (sort of) here:
Secondary click on chosen DB, select "Execute SQL File", choose the file, choose "continue on error" if you want to and finally run it.
I know it shows a MySQL DB but works on most used/popular DBMS.
I seriously don't advise to "open" a file of such proportions in their sql query builder, it would block the machine as the RAM would be at full capacity over and over again.
This also works on Macintosh OS as host of Navicat application and once you are connected to a given DB Server you can run it wherever you want, working pretty well on RHEL, Ubuntu Server, Debian and Windows Server until now.
为此,请在 MySQL 中使用 BULK Import。
Use BULK Import in MySQL for this.
仅请求表定义和 .csv 中的数据。然后进行批量导入。
Request just the table definitions, and the data in a .csv. Then do a bulk-import.