将 sql 转储恢复到 RDS 的最快方法

Fastest way to restore sql dump to RDS

我正在尝试将大型 *.sql 转储 (~4 GB) 恢复到我在 RDS 上的一个数据库。上次尝试使用 Workbench 恢复它,整个过程完成需要大约 24 小时以上。

我想知道是否有更快的方法来做到这一点。请帮助并分享您的想法

编辑:顺便说一下,我的 sql 转储在我的本地计算机上。

目前我有两个选择:

  1. 关注这个link http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/MySQL.Procedural.Importing.NonRDSRepl.html(低可信度)
  2. 转储数据库并压缩它,然后将压缩后的转储上传到我的一个 EC2 实例,然后通过 SSH 连接到我的 EC2 实例并执行 mysql> source backup.sql;

我更喜欢第二种方法(只是因为我对此更有信心),而且它会缩短上传时间,因为整个转储首先上传、解压缩并最终恢复。

命令总是比 Workbench 快。 尝试使用此命令来恢复您的数据库。

恢复:

mysql -u root -p YOUR_DB_NAME < D:\your\file\location\dump.sql

转储:

mysqldump -u root -p YOUR_DB_NAME > D:\your\file\location\dump.sql

我的建议是对大型 table 进行 table 明智的备份,并通过禁用索引来恢复它们。它可以快速插入记录(速度超过两倍)并在恢复完成后简单地启用索引。

恢复命令之前:

ALTER TABLE `table_name` DISABLE KEYS;

还原完成后:

ALTER TABLE `table_name` ENABLE KEYS;

还在文件顶部添加这些额外的命令以避免大量磁盘访问:

SET FOREIGN_KEY_CHECKS = 0;
SET UNIQUE_CHECKS = 0;
SET AUTOCOMMIT = 0;

并在末尾添加这些:

SET UNIQUE_CHECKS = 1;
SET FOREIGN_KEY_CHECKS = 1;
COMMIT;

希望这能奏效,谢谢。

您关于使用 EC2 中介的直觉是正确的,但我真的认为对您最大的好处实际上是在 AWS 中。我偶尔会执行类似的过程,将 6GB 数据库的内容从一个 RDS 数据库实例移动到另一个。

我的配置:

  • 源数据库实例和目标数据库实例在同一地区和可用区。都是db.m3.large.
  • EC2 实例与数据库实例位于同一区域和可用区。
  • EC2 实例是 compute optimized。 (我使用 c3.xlarge,但如果我要从头开始,我会推荐 c4 系列)。

从这里开始,我只是使用 EC2 实例从源实例执行非常简单的 mysqldump,然后到目标实例执行非常简单的 mysqlrestore。

处于同一区域和可用区确实有很大的不同,因为它减少了过程中的网络延迟。这种情况下数据传输也是free or near-free。您为 EC2 和 RDS 实例选择的实例 class 也很重要——如果您希望这是一个快速操作,您希望能够最大化 I/O。

如果您没有提供足够的资源,网络延迟和 CPU 等外部因素可能(根据我的经验,已经)成为操作瓶颈。在我使用 db.m3.large 实例的示例中,MySQLDump 花费不到 5 分钟,而 MySQLRestore 花费大约 15 分钟。我曾尝试恢复到 db.m3.medium RDS 实例之前,恢复时间花了一个多小时,因为 CPU 瓶颈——它无法跟上 EC2 实例.当我从我的本地机器恢复时,在他们的网络之外导致整个过程需要 4 个多小时。

这个 EC2 中介不需要 24/7 全天候可用。完成后将其关闭或终止。我只需支付一个小时的 c3.xlarge 时间。另请记住,您可以临时扩展 RDS 实例 class up/down 以增加转储期间的可用资源。如果可以,尽量让您的本地计算机脱离等式。

如果您对这个策略感兴趣,AWS 自己已经提供了一些关于此事的 documentation