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

时间:2015-02-04 09:25:46

标签: mysql mysql-workbench mysqldump amazon-rds

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

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

编辑:顺便说一下,我在我的本地计算机上安装了sql dump。

目前我有两个选择:

  1. 点击此链接 http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/MySQL.Procedural.Importing.NonRDSRepl.html(信心不足)
  2. 转储数据库并压缩它,然后将压缩转储上传到我的一个EC2实例,然后SSH到我的EC2实例并执行 mysql> source backup.sql;
  3. 我更喜欢第二种方法(仅仅因为我对此更有信心),并且它会固定上传时间,因为整个转储首次上传,未压缩并最终恢复。

3 个答案:

答案 0 :(得分:3)

我的建议是对大表进行逐表备份,并通过禁用索引来恢复它们。其中快速插入记录(速度超过双倍速度)并在恢复完成后简单地启用索引。

恢复前命令:

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;

我希望这会有效,谢谢。

答案 1 :(得分:1)

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

我的配置:

  • 源数据库实例和目标数据库实例位于相同的区域和可用区域中。两者都是db.m3.large。
  • EC2实例与数据库实例位于同一区域和可用区中。
  • EC2实例为compute optimized。 (我使用c3.xlarge但如果我从头开始再推荐c4系列。)

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

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

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

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

如果您对此策略感兴趣,AWS本身就此问题提供了一些documentation

答案 2 :(得分:-3)

命令总是比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