最近我不得不将一个 7 Gb MySQL 转储文件导入 MySQL 5.6 服务器。在具有 1 Gb RAM 的单核 CPU 上导入大约需要 7 个小时。
其他人在具有以下设置的 MySQL 服务器上测试了导入:
innodb_buffer_pool_size = 8G
query_cache_size = 300M
我对这些设置的相关性有点怀疑(是的,我什至认为设置这么大的查询缓存是不好的)。那会有什么不同吗?这些设置不是仅在查询数据库时使用,因此与导入无关吗?
如果是,应该设置哪些设置来加快大型转储文件的导入?
根据官方文档,这些值应该临时设置:
unique_checks = 0
foreign_key_checks = 0
我在这里读到它也应该设置
innodb_flush_log_at_trx_commit = 2
但我认为这不会有帮助,因为自动提交模式(每次插入都将日志刷新到磁盘)在 mysqldump 命令(--opt
选项)中已经默认禁用。
建议 #1
无需运行
unique_checks = 0
和foreign_key_checks = 0
. 请参阅我 3 年前的文章Speeding up mysqldump / reload(ASPECT #2 显示了 mysqldump 的标准标头。第 13 行和第 14 行为您处理禁用这些检查)建议 #2
请注意 InnoDB 架构(图片来自 Percona CTO Vadim Tkachenko)
如果你想重新加载一个 MySQL 实例,你应该暂时禁用双写缓冲区。
步骤1
登录到目标服务器并运行
第2步
通过将innodb_doublewrite 设置为 OFF来重新启动 mysqld
第 3 步
将 mysqldump 加载到目标服务器
第4步
正常重启mysqld(将再次启用双写缓冲区)
由于名称“双写缓冲区”意味着两次写入,因此 InnoDB 只会将数据和索引直接写入表文件,并绕过写入
ibdata1
. 也许这会使导入时间加倍(双关语)建议#3
默认的innodb_log_buffer_size 是 8M。您需要更大的日志缓冲区。
请将此行添加到
[mysqld]
组标题下的 my.cnf然后,在重新加载 mysqldump 之前重新启动 mysqld。
试试看 !!!