将 sql 转储恢复到 RDS 的最快方法
Fastest way to restore sql dump to RDS
我正在尝试将大型 *.sql 转储 (~4 GB) 恢复到我在 RDS 上的一个数据库。上次尝试使用 Workbench 恢复它,整个过程完成需要大约 24 小时以上。
我想知道是否有更快的方法来做到这一点。请帮助并分享您的想法
编辑:顺便说一下,我的 sql 转储在我的本地计算机上。
目前我有两个选择:
- 关注这个link
http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/MySQL.Procedural.Importing.NonRDSRepl.html(低可信度)
- 转储数据库并压缩它,然后将压缩后的转储上传到我的一个 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。
我正在尝试将大型 *.sql 转储 (~4 GB) 恢复到我在 RDS 上的一个数据库。上次尝试使用 Workbench 恢复它,整个过程完成需要大约 24 小时以上。
我想知道是否有更快的方法来做到这一点。请帮助并分享您的想法
编辑:顺便说一下,我的 sql 转储在我的本地计算机上。
目前我有两个选择:
- 关注这个link http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/MySQL.Procedural.Importing.NonRDSRepl.html(低可信度)
- 转储数据库并压缩它,然后将压缩后的转储上传到我的一个 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。