我正在共享托管环境中运行 Web 应用程序,该环境使用大约 3GB 大小的 MYSQL 数据库。
为了测试目的,我在本地 macOS 机器上设置了一个 XAMPP 环境。为了将在线数据库复制到本地机器,我mysqldump
在服务器上使用了该数据库,然后直接将转储文件导入到mysql
:
// Server
$ mysqldump -alv -h127.0.0.3 --default-character-set=utf8 -u dbUser -p'dbPass' --extended-insert dbName > dbDump.sql
// Local machine
$ mysql -h 127.0.0.3 -u dbUser -p'dbPass' dbName < dbDump.sql
这里唯一的优化是使用extended-insert
。然而导入需要10个小时!
哑文件已经包含禁用唯一键和外键检查以加快导入速度的命令:
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
我不是 SQL 导出人员,也不确定/*!40014
命令是否执行,因此SET FOREIGN_KEY_CHECKS=0;
手动添加到文件中以确保检查被禁用。然而这并没有什么区别。
为什么导入数据需要这么长时间?有没有更好/更快的方法来做到这一点?
该服务器不是最快的(共享主机……),但导出/转储数据仅需大约 2 分钟。导出(无语法检查、无解析、仅写入……)比导入(解析、语法检查等)更快并不令人惊讶,但速度却快了 300 倍(10 小时 vs. 2 分钟)?这是一个巨大的差异……
有没有其他更快的解决方案?例如,复制二进制 DB 文件?任何方法都比使用文本文件作为传输介质要好。
这不仅仅是为了测试目的将数据传输到另一台机器。我还每天备份数据库。如果需要恢复数据库,网站停机 10 小时就太糟糕了……
答案1
导入速度慢是目标服务器配置不佳的症状。
增加到innodb_buffer_pool_size
可用 RAM 的 70%。设置innodb_log_file_size
为 512M(使用这程序(调整 url 以适应 mysql 服务器版本))。
导入期间SET GLOBAL innodb_flush_log_at_trx_commit=0
,导入完成后设置回 1。