亚马逊RDS:将快照还原到现有实例

123

我已经创建了一个实例的快照并在数据库中进行了一些不需要的更改。

现在我想从这个快照中还原我的实例。

当我尝试这样做时,它会为我创建另一个实例,除了我已经拥有的实例之外。

我指定“DB实例标识符”,然后就会得到两个带有相同ID的实例。

所以我的问题是:是否有办法将快照还原到现有实例中?

因为否则 - 将创建具有不同端点(主机名)的新实例,我需要更改配置文件才能访问数据库。或者有更好的方法来管理这种情况吗?


4
只需删除您的旧实例即可解决问题。 - Mike Brant
2
未来的读者注意:我建议查看下面 jack.chen.job 的回答。它没有其他答案那么多的赞,但它更简单,并且似乎对我有用。 - Mark
只是删除旧实例。问题解决了。但并不总是如此,所有使用已删除数据库的应用程序用户都会收到HTTP 500错误吗?也许,“重命名”是一个好的解决方案,但无论如何:这很尴尬... - maxkoryukov
8个回答

111

不,您不能将现有的DB实例还原为手动备份或时间点快照中的任何一个。

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

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


57
可以的,尽管现在是配置DNS中的“CNAME”并将其指向您的RDS主机名的好时机,然后重新配置应用程序以使用CNAME。这样,在将来,您只需要在DNS中进行一次更改即可。 - Michael - sqlbot
1
没错,我没试过;但我猜应该可以工作。假设那能行;缺点是 DNS 缓存和传播可能会更长,而你的应用程序可能会表现奇怪。个人认为修改应用程序配置设置是减轻这类问题的最佳方法。 - Naveen Vijay
6
没错,但如果你控制DNS并使用合理的TTL,这不应该成为无法克服的问题。最佳方法还取决于需要重新配置应用程序的场所数量或者有多少个不同的应用程序可能正在运行相同的数据库。 - Michael - sqlbot
1
那么,对于EC2来说,没有像弹性IP这样的服务,可以为您的数据库获取一个静态的端点吗?这有些尴尬 =)感谢您的回答! - SmxCde
不要改变端点,否则只需从恢复的快照中复制数据库即可。 - jontro
显示剩余2条评论

75

如果有人(就像我一样)只是想恢复数据而不改变配置,以下是步骤:

  • 从自动快照或手动创建的快照中创建一个新实例(temp)。
  • 使用 Sequel Pro 或 MySQL Workbench 从此实例连接。
  • 从此临时实例中获取所需数据的 SQL 转储。
  • 连接生产实例并进行还原。
  • 现在删除您创建的临时实例。

3
这种方法的主要好处在于,您可以像通常一样创建具有相同脚本和配置的新生产实例,然后按照步骤将数据复制到其中。 - Max
2
这个救了我,但是显而易见的是 - 如果你有大量数据,这可能需要一些时间! - Crazometer

40

这个链接是用来更改 AWS 实例名称的,这将显然重命名您的终端节点。 - Swapnil Boralkar
最有用的答案通常在底部 :( - Randolpho
1
尽管这个想法看起来很好,只读副本仍然附加在旧实例上(我刚刚检查了这个过程)。我猜想,我们将不得不为这个新恢复的实例重新配置多AZ(如果在恢复期间没有完成),并创建新的只读副本! - Koushik Shom Choudhury

14

今天我遇到了同样的问题。我认为在不更改应用程序配置设置的情况下,有两个选项可供选择。

  1. 按照Mike建议的删除旧实例,然后还原它。

  2. 首先重命名旧实例(需要在重命名时检查“立即应用”选项)。


你是不是想说“重命名新实例为next(在重命名时需要勾选“立即应用”选项)”? - AgBorkowski
2
不,我的意思是“重命名旧实例”。然后您可以将备份还原到原始名称。 - jack.chen.job

3

1

如果您想通过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

0

回答有点晚,但是在研究过程中,我找到了一个避免进行任何应用层面更改的方法。如先前建议的,没有导入快照到现有RDS的选项。可能的解决方案:

一次性努力

  1. 在Route 53中创建一个私有域[在您的VPC内解析]。
  2. 使用域名/子域名指向您的RDS实例。
  3. 在您的应用程序中使用指向的域名/子域名。

每次恢复快照时

  1. 使用快照创建一个新的RDS实例。
  2. 将域名/子域名指向新的RDS实例。
  3. 方便时删除旧实例。

-2

在创建了一个带有新名称的恢复数据库之后,您可以将当前实例重命名为...-old,这也会重命名数据库的URL。在URL也更改之后,您必须将恢复的数据库重命名为之前使用的名称,并等待数据库的URL更改。然后,您需要重新启动服务,它们将连接到恢复的数据库。

这样做不会导致任何中断。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接