我的公司收到了一个超过 20 GB 的 .sql 文件,以响应来自政府的数据请求。我没有很多选项可以获取不同格式的数据,因此我需要如何在合理的时间内导入数据的选项。我正在使用 Navicat 的批处理执行工具在高端服务器(Win 2008 64bit,MySQL 5.1)上运行它。它已经运行了 14 个小时,并且没有显示接近完成的迹象。
有谁知道这种交易的任何更高速度的选择?或者这是我应该期待的大文件大小?
谢谢
我的公司收到了一个超过 20 GB 的 .sql 文件,以响应来自政府的数据请求。我没有很多选项可以获取不同格式的数据,因此我需要如何在合理的时间内导入数据的选项。我正在使用 Navicat 的批处理执行工具在高端服务器(Win 2008 64bit,MySQL 5.1)上运行它。它已经运行了 14 个小时,并且没有显示接近完成的迹象。
有谁知道这种交易的任何更高速度的选择?或者这是我应该期待的大文件大小?
谢谢
我猜你的意思是它是mysqldump
作为数据库备份生成的文件,所以它主要包含CREATE TABLE
和INSERT
语句。
(但严格来说,SQL 脚本可以包含任何内容,例如定义和执行长时间运行的存储过程、导致死锁的查询等。我假设情况并非如此。)
鉴于您拥有备份文件并且无法更改其文件类型,您可以执行以下操作来加快恢复速度:
禁用外键检查:(SET FOREIGN_KEY_CHECKS=0
记得之后重新启用)。也禁用唯一检查:SET UNIQUE_CHECKS=0
如果您使用 MyISAM 表,请确保您key_buffer_size
的设置尽可能大。默认为 8MB,最大为 4GB。我会尝试1GB。
这些最初的提示来自 Baron Schwartz 的一篇文章:http: //lists.mysql.com/mysql/206866
如果您使用 InnoDB 表,请确保您innodb_buffer_pool_size
的设置尽可能大。默认为 8MB,最大为 4GB。我会尝试1GB。
innodb_flush_log_at_trx_commit = 2
如果您使用 InnoDB 表,请在还原期间设置。
@Mark B 在下面添加了一个很好的建议,以在还原期间禁用密钥。这就是你的做法:
ALTER TABLE <table-name> DISABLE KEYS;
...run your restore...
ALTER TABLE <table-name> ENABLE KEYS;
但是该命令一次只影响一个表。您必须为每个表发出单独的命令。也就是说,通常情况下一个表比其他表大得多,因此您可能只需要禁用该大表的键。
此外,如果包含您的还原的 SQL 脚本删除并重新创建表,这将绕过禁用键。在创建表之后和插入行之前,您必须找到某种方法来插入命令以禁用键。sed
在将 SQL 脚本提供给 mysql 客户端之前,您可能需要创造性地预处理 SQL 脚本。
使用带有--innodb-optimize-keys选项的 Percona Server 版本的 mysqldump 。
周围有很多工具,但我建议使用 Navicat GUI 来执行此操作。根据我的经验,它可以在 8GB RAM 的主机上在 6 小时内运行 48GB *.sql 文件。
这里的解释(有点): 二次点击选择的数据库,选择“执行SQL文件”,选择文件,如果你想选择“错误继续”,最后运行它。我知道它显示了一个 MySQL DB,但适用于大多数使用/流行的 DBMS。
我真的不建议在他们的 sql 查询生成器中“打开”这样比例的文件,它会阻塞机器,因为 RAM 会一次又一次地满负荷运行。
这也适用于 Macintosh OS 作为 Navicat 应用程序的主机,一旦你连接到给定的 DB 服务器,你就可以在任何你想要的地方运行它,直到现在在 RHEL、Ubuntu 服务器、Debian 和 Windows 服务器上运行良好。
为此,请在 MySQL 中使用 BULK Import。
仅请求表定义和 .csv 中的数据。然后进行批量导入。