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

Posted

技术标签:

【中文标题】将sql转储恢复到RDS的最快方法【英文标题】:Fastest way to restore sql dump to RDS 【发布时间】:2015-04-03 18:16:19 【问题描述】:

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

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

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

目前我有两个选择:

    点击此链接 http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/mysql.Procedural.Importing.NonRDSRepl.html(信心不足) 转储数据库并压缩它,然后将压缩转储上传到我的 EC2 实例之一,然后通过 SSH 连接到我的 EC2 实例并执行 mysql> source backup.sql;

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

【问题讨论】:

还要考虑更改一些变量,例如 max_allowed_pa​​cket,假设 amazon 允许您访问 cnf 【参考方案1】:

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

恢复命令前:

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;

我希望这会奏效,谢谢。

【讨论】:

【参考方案2】:

您对使用 EC2 中介的直觉是正确的,但我真的认为最有利于您的事情实际上是在 AWS 内部。我偶尔会执行类似的过程,将 6GB 数据库的内容从一个 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 中介不需要 24/7 全天候可用。完成后将其关闭或终止。我只需要支付一个小时的 c3.xlarge 时间。另请记住,您可以临时向上/向下扩展 RDS 实例类以增加转储期间的可用资源。如果可以的话,试着让你的本地机器摆脱困境。

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

【讨论】:

谢谢,我最终使用了类似于您建议的方法。延迟方面,我认为这是最快的方法。唯一的瓶颈是我将 dump.sql 从我的本地电脑(在我的地方)传输到我的 EC2 实例。但是,一旦 dump.sql 在 EC2 上,它的点亮速度就会很快(我可能在这里夸大了一点)。【参考方案3】:

Command 总是比 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

【讨论】:

这会使上传过程更快吗?请参阅我的更新以获取更多详细信息。干杯。 -1 表示“命令总是比 Workbench 快”,我读为:“命令行总是比 MySQL Workbench 快”。这完全是错误的。 MySQL Workbench 的许多任务甚至使用命令行应用程序,那它怎么能慢呢? 您好,我知道“MySQL Workbench 甚至使用命令行”,但是我们当然可以直接使用它,那样总是更快。参考:thisTried and true, the command line will always be the most efficient - though not the most friendly way - to accomplish a database export/import.

以上是关于将sql转储恢复到RDS的最快方法的主要内容,如果未能解决你的问题,请参考以下文章

获取 aws rds 快照的本地副本

从 Amazon RDS 下载 MySql 备份/快照

数据库原理-数据恢复

将大型 SQL 托管实例还原到本地

如何将 RDS 快照恢复到 cloudformation?

尝试本地 XAMPP MySQL 服务器时,恢复 MySQL .sql 转储不起作用