将大型 MySQL 数据库传输/克隆到另一台服务器的最佳方法

将大型 MySQL 数据库传输/克隆到另一台服务器的最佳方法

我正在共享托管环境中运行 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。

相关内容