Amazon RDS:将快照还原到现有实例

Posted

技术标签:

【中文标题】Amazon RDS:将快照还原到现有实例【英文标题】:Amazon RDS: Restore snapshot to existing instance 【发布时间】:2014-08-08 07:35:30 【问题描述】:

我创建了我的实例的快照并在 DB 中进行了一些不必要的更改。

现在我想从此快照恢复我的实例。

当我尝试这样做时,它会在我拥有的实例之外再创建一个实例。

我指定“数据库实例标识符”,然后我得到两个具有相同 ID 的实例。

所以我的问题是:有没有办法将快照恢复到现有实例?

因为在其他情况下 - 新实例是使用不同的端点(主机名)创建的,我需要更改我的配置以访问数据库。或者有更好的方法来处理这种情况?

【问题讨论】:

只需删除您的旧实例。问题解决了。 未来读者请注意:我建议在下面查看 jack.chen.job 的答案。它没有其他答案那么多的赞成票,但它更简单,而且似乎对我有用。 【参考方案1】:

不,您无法将现有数据库实例恢复到任何手动备份或时间点快照。

您可以使用手动备份或自动快照的唯一方法是使用它创建一个新的 RDS 数据库实例。创建新的数据库实例后,您可以在应用程序/代码中更改数据库的端点并删除旧的数据库实例。

底线:您必须更改应用程序中的配置设置。没有其他选择。

【讨论】:

正确,虽然“现在”是在 DNS 中配置 CNAME 并将其指向您的 RDS 主机名的好时机,然后重新配置应用程序以使用 cname。然后,在未来,您只需要在 DNS 中进行一项更改。 对,我没试过;但我想这应该可行。假设这会起作用;这样做的缺点是 DNS 缓存和传播可能会更长,并且您的应用程序可能会表现得很奇怪。我个人觉得修改应用的配置设置是缓解这类问题的最好办法。 确实如此,但如果您控制 DNS 并使用合理的 TTL,它不应该是一个交易破坏者。哪种方法可能是最好的还取决于有多少地方需要重新配置应用程序,或者可能针对一个数据库运行多少不同的应用程序。 那么,当您可以为您的数据库获得一个静态端点时,没有像 EC2 的弹性 ip 这样的服务吗?这很尴尬 =) 感谢您的回答! 否则只需从恢复的快照中复制数据库,而不是更改端点。【参考方案2】:

我今天遇到了同样的问题。我认为您有两个选择,而无需更改应用程序的配置设置。

    按照 Mike 的建议删除旧实例,然后恢复它。

    先重命名旧实例(重命名时需要勾选“立即应用”选项)。

【讨论】:

你的意思是“下一个重命名新实例(重命名时需要选中“立即应用”选项)。” ? 不,我的意思是“重命名旧实例”。然后您可以将备份恢复为原始名称。【参考方案3】:

如果有人来这里(就像我一样)只是为了恢复数据而不改变你的配置。

步骤如下:

从您的自动快照或手动创建的快照创建一个新实例(临时)。 从 Sequel pro 或 mysql 工作台连接到此实例。 从这个临时实例中获取您需要的任何数据的 SQL 转储。 连接您的生产实例并恢复它。 现在删除您创建的临时实例。

【讨论】:

这种方法的主要好处是您可以使用与通常相同的脚本和配置创建一个新的生产实例,然后按照建议的步骤将数据复制到其中。 这救了我,但要指出一点——如果您有大量数据,这最终可能需要一段时间!【参考方案4】:

重命名原始实例并用原始名称命名新实例

https://aws.amazon.com/blogs/aws/endpoint-renaming-for-amazon-rds/

【讨论】:

此链接用于更改 aws 实例名称,这显然也会重命名您的端点。 最有用的答案往往在底部:( 虽然这个想法看起来很棒,但只读副本仍然连接到旧实例(我刚刚检查了这个过程)。我猜,我们必须为多可用区重新配置这个新恢复的实例(如果在恢复期间没有完成)并创建新的只读副本!【参考方案5】:

正如@MaXimus 所说(我还不能添加 cmets),您可以:

    先重命名原始实例 从快照恢复并分配原始实例名称

正如在Renaming to Replace an Existing DB Instance 中指定的那样:https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_RenameInstance.html

【讨论】:

【参考方案6】:

使用新名称创建恢复的数据库后,您可以将当前实例重命名为 ...-old,这也会重命名数据库 url。 url也改变后,你必须将恢复的db重命名为之前使用的名称,等到db的url改变。然后你必须重新启动你的服务,它们将连接到恢复的数据库。

这根本不会导致中断。

【讨论】:

【参考方案7】:

如果您想通过 AWS CLI 运行的解决方案。将 ORIG_NAMENEW_NAME 替换为您的值

$ aws rds modify-db-instance \
    --db-instance-identifier ORIG_NAME \
    --new-db-instance-identifier NEW_NAME \
    --apply-immediately

$ aws rds restore-db-instance-to-point-in-time \
    --source-db-instance-identifier NEW_NAME \
    --target-db-instance ORIG_NAME \
    --restore-time 2020-08-27T00:00:00.000Z \
    --publicly-accessible \
    --availability-zone us-east-2a \
    --db-subnet-group-name SUBNET_NAME \
    --vpc-security-group-ids SG_ID

如果您没有自定义 VPC,可以跳过--db-subnet-group-name 如果您的 RDS 没有自定义安全组,您可以跳过--vpc-security-group-ids 如果您不需要公开访问您的实例,请跳过 --publicly-accessible

所以 aws rds restore-db-instance-to-point-in-time 的简短版本是:

$ aws rds restore-db-instance-to-point-in-time \
    --source-db-instance-identifier NEW_NAME \
    --target-db-instance ORIG_NAME \
    --restore-time 2020-08-27T00:00:00.000Z

【讨论】:

以上是关于Amazon RDS:将快照还原到现有实例的主要内容,如果未能解决你的问题,请参考以下文章

如何比较两个Amazon RDS快照?

Amazon Redshift:拒绝访问还原集群快照请求

从 Amazon RDS 下载 MySql 备份/快照

Amazon Aurora 快照还原真的很慢

AWS RDS启用数据加密(创建时未启用情况下)

如何通过 RDS 复制到 Elastic Beanstalk 克隆