适用于甲骨文的亚马逊 RDS 中的 Oracle 闪回数据库功能的替代方案

由于托管服务 提供的好 ,客户可能更愿意将他们的 Oracle 数据库工作负载托管在托管 服务中,例如适用 于 Oracle 的 亚马逊关系数据库服务 (Amazon RDS) 。但是,有些工作负载可能依赖于适用于甲骨文的亚马逊 RDS 不支持的 Oracle 功能。

例如, 闪回数据库 是 Oracle 数据库的一项功能,允许您将数据库恢复到某个时间点。该功能可用于帮助从用户错误、数据损坏和其他不可预见的灾难中恢复,也可以作为应用程序和数据库升级等计划活动的备用选项。恢复直接应用于实时数据库,您无需配置其他硬件也无需等待完成完整恢复。这在本地环境中尤其有价值,在本地环境中,通常很难预置按需硬件来在短时间内托管数据库的一个或多个副本。另一方面,直接在生产数据库上执行闪回操作会带来一些风险,如果出现不可预测的问题,您可能必须运行完整恢复,这可能会对服务可用性产生重大影响。通过利用 亚马逊云科技 云的敏捷性和灵活性,您可以获得相同级别的保护,而无需直接对实时数据库进行操作,并有助于避免与闪回数据库功能相关的性能开销和资源消耗。

适用于 Oracle 的 Amazon RDS 支持闪回表、闪回查询、闪回事务和 Oracle 闪回功能 ,但不支持将整个 数据库恢复 到特定时间点的 闪回 数据库。这篇文章介绍了适用于甲骨文的亚马逊 RDS 中甲骨文闪回数据库功能的替代方案。

解决方案概述

您可以使用 快照恢复 方法或 只 读副本 激活方法来替代 Oracle 闪回数据库功能。只读副本激活方法使用 RDS 副本功能以及将副本激活为完整读/写主实例的能力。快照还原使用 RDS 快照功能将数据库返回到某个时间点。您确实需要注意,在快照和副本存在的时间段内,快照和只读副本功能都需要额外的许可。另一个注意点是 延迟加载 ;当您从数据库快照创建数据库实例时,只要恢复的数据库实例状态为可用,就可以使用该实例。数据将继续从 Amazon S3 备份或您明确请求后台加载。您可以执行涉及全表扫描的操作,以减少延迟加载需要快速访问的表的性能开销。另一种选择是在数据库级别运行 RMAN VALIDATE。在这两种情况下,您都可以使用基于还原实例内核的一定程度的并行度来加快操作速度。

在这篇文章中,我们将引导您通过 亚马逊云科技 管理控制台 和 亚马逊云科技 命令行接口 ( 亚马逊云科技 CLI) 使用这两种方法。

快照恢复

使用 数据库快照 , 您可以在精确的时间点创建数据库实例的存储卷快照,备份整个数据库实例,而不仅仅是单个数据库。您可以通过从数据库快照还原来使用新的 URL 终端节点创建新的数据库实例。如果您决定将应用程序指向还原的数据库实例,则只需将旧实例和还原的实例重命名为原始实例名称即可。

如果您已在 Amazon Route 53 私有区域中配置了指向您的 RDS 数据库实例的自定义 CNAME 条目,则另一种选择是在不更新 RDS 数据库实例名称的情况下使用恢复的数据库实例终端节点编辑 CNAME 条目。这样,与已恢复的 RDS 数据库实例的连接将在几秒钟内可用。

下图说明了该解决方案的工作流程:

激活只读副本

对于只读副本激活方法,我们可以在计划中的潜在风险活动(例如大规模应用程序代码发布或数据库软件升级)之前创建一个新的数据库实例,该实例充当现有源数据库实例的只读副本,以提供快速回滚策略。就在源数据库实例上开始计划活动之前,只读副本数据库实例被提升为独立数据库实例。如果出现不可恢复的问题,需要禁用,我们可以通过连接到推广的副本数据库实例来快速回滚到之前的数据库状态。如果在原始 RDS 数据库实例上配置了 多可用区 和其他只读副本,请考虑启用多可用区并在推广的副本数据库实例上创建额外的只读副本以满足您在 RTO 和 RPO 方面的需求所需的时间。

下图说明了这种架构。首先,我们配置 RDS 只读副本。

然后,我们将 RDS 只读副本提升为独立的 RDS 数据库实例。

然后,我们将客户端连接切换到升级后的 RDS 数据库只读副本,将其重命名为原始实例名称。

使用快照还原进行闪回

在本节中,我们演示如何通过 Amazon RDS 控制台或 亚马逊云科技 CLI 使用快照还原方法模拟 Oracle 中的闪回数据库功能。您可以进行快照备份或使用 时间 点恢复 ;由于快照备份将创建完整备份,无需应用额外的日志来加快恢复时间,因此我们将在本解决方案中展示这种方法。

拍摄快照备份

首先,我们在所需的时间点进行快照备份。

控制台

要使用控制台,请完成以下步骤:

  1. 在 Amazon RDS 控制台上, 在导航窗格中选择 数据库
  2. 选择要创建快照的数据库。
  3. 在 “ 操作 ” 菜单上,选择 “ 拍摄快照 ” 。

  1. 为快照命名,然后选择 “ 拍摄快照 ” 。

您可以在 Amazon RDS 控制台上检查备份的状态。

亚马逊云科技 命令行

要通过 亚马逊云科技 CLI 运行快照备份,请使用以下代码:

aws rds create-db-snapshot 
--db-instance-identifier blog-demo
--db-snapshot-identifier blog-demo-snapshot

恢复快照

现在,我们将数据库恢复到快照备份。

控制台

要使用控制台,请完成以下步骤:

  1. 在 Amazon RDS 控制台上,选择我们刚才拍摄的快照,然后在 “ 操作 ” 菜单上选择 “ 恢复快照 ” 。

  1. 选择数据库实例标识符、分配给从中获取快照的数据库的安全组以及实例类。
  2. 选择 恢复数据库实例

恢复快照后,我们可以重命名数据库,这样就无需将应用程序更改指向新还原的数据库。

  1. 选择我们从中拍摄快照的数据库,然后选择 M odify
  2. 对于 数据库实例标识符 ,使用前缀 -old 更新实例名称。

  1. 选择 “ 继续 ” 。
  2. 选择 立即 应用 ,然后选择 修改数据库实例

  1. 恢复完成后,我们可以对还原的数据库执行重命名操作,将其命名为与我们最初从中获取备份的实例相同的实例名称(例如, 博客演示)

重命名完成后,我们可以删除旧实例。

  1. 选择旧实例,然后在 “ 操作 ” 菜单上选择 “ 删除 ” 。
  2. 如果需要,您可以保留最终快照和自动备份。
  3. 输入 “删除我” 进行确认,然后选择 “ 删除 ” 。

亚马逊云科技 命令行

要使用 亚马逊云科技 CLI 实施解决方案,请完成以下步骤:

  1. 要恢复备份,请使用以下代码:
aws rds restore-db-instance-from-db-snapshot
--db-instance-identifier blog-demo-restore
--db-snapshot-identifier blog-demo-snapshot
--db-instance-class db.t3.medium —no-deletion-protection
  1. 恢复完成后,重命名我们从中获取备份的实例:
aws rds modify-db-instance
--db-instance-identifier blog-demo
--new-db-instance-identifier blog-demo-old
  1. 重命名完成后,将恢复的数据库重命名为与我们拍摄快照的实例相同的名称:
aws rds modify-db-instance
--db-instance-identifier blog-demo-restore
--new-db-instance-identifier blog-demo
  1. 现在我们可以删除我们重命名的初始数据库:
aws rds delete-db-instance
--db-instance-identifier blog-demo-old
--skip-final-snapshot
--delete-automated-backups

使用只读副本激活进行闪回

基于只读副本功能的闪回过程包括以下步骤:

  1. 准备源数据库。
  2. 在同一个可用区中创建已装载的 Oracle 副本。
  3. 检查副本延迟,并在计划维护时段开始时升级只读副本。
  4. 等待只读副本升级完成以达到一致点,以防出现回滚情况。
  5. 检查升级后的只读副本的状态并执行连接测试。
  6. 在源数据库上运行计划活动。
  7. 如果在计划活动结束后需要回滚,请将您的应用程序指向升级后的只读副本,将旧实例和升级后的实例重命名为原始实例名称。

如果您已在 Amazon Route 53 私有区域中配置了指向您的 RDS 数据库实例的自定义 CNAME 条目,则另一种选择是在不更新 RDS 数据库实例名称的情况下使用升级后的数据库实例终端节点编辑 CNAME 条目。这样,与推广的 RDS 数据库实例的连接将在几秒钟内可用。

准备源数据库

在本节中,我们提供了启用自动备份和强制记录模式所需的步骤。

启用自动备份

在数据库实例可用作源数据库实例之前,请确保在源数据库实例上启用自动备份。您可以通过控制台或 亚马逊云科技 CLI 检查自动备份是否已启用。

如有必要,将自动 备份设置 backupRetentionPeriod 启用为大于 0

控制台

要检查控制台上的自动备份,请完成以下步骤:

  1. 在 Amazon RDS 控制台上, 在导航窗格中选择 数据库
  2. 选择要验证的数据库实例。
  3. 在 “ 维护和备份 ” 选项卡上,检查 是否启用了 自动备份

  1. 要启用自动备份,请选择 修改
  2. 对于 备份保留期 ,选择一个非零的正值,例如 7 天。
  3. 选择 “ 继续 ” 。

  1. 选择 “ 立即 应用 ” 。
  2. 在确认页面上,选择 修改数据库实例 以保存您的更改并启用自动备份。

亚马逊云科技 命令行

使用以下代码验证 backupRetentionPeri od 是否大于 0:

$aws rds describe-db-instances
--db-instance-identifier blog-demo \
--query "DBInstances[*].DBInstanceIdentifier,BackupRetentionPeriod]"

要启用备份保留期为 7 天的自动备份,请使用以下代码:

aws rds modify-db-instance \
--db-instance-identifier blog-demo \
--backup-retention-period 7 \
--apply-immediately

启用强制记录模式

我们建议您启用强制记录模式。在强制记录模式下,即使将 NOLO GGING 模式与数据定义语言 (DDL) 语句一起使用,Oracle 数据库也会写入重做记录,以确保它们也适用于副本数据库实例。完成以下步骤以启用强制记录模式:

  1. 使用 SQL Developer 或 SQL*Plus 等客户端工具登录您的 Oracle 数据库。
  2. 通过运行以下过程启用强制记录模式:
SQL> select name,db_unique_name,force_logging from v$database;

NAME DB_UNIQUE_NAME FORCE_LOGGING
---------- -------------------- --------------------
DEMO DEMO_A NO

exec rdsadmin.rdsadmin_util.force_logging(p_enable => true);

SQL> select name,db_unique_name,force_logging from v$database;

NAME DB_UNIQUE_NAME FORCE_LOGGING
---------- -------------------- --------------------
DEMO DEMO_A YES

创建只读副本

在同一可用区中为源 Oracle 数据库实例创建处于已装载状态的只读副本。在主数据库的计划活动开始前几个小时运行此任务,并确保在维护时段开始时有一个有效的副本。根据经验,您可以估计在您的特定系统上执行测试并增加至少两个小时的应急时间。只读副本数据库实例是在禁用备份的情况下创建的。除非另有规定,否则其他数据库实例属性(包括数据库安全组和数据库参数组)继承自源数据库实例。

控制台

要在控制台上创建只读副本,请完成以下步骤:

  1. 在 Amazon RDS 控制台的导航窗格中,选择 数据库
  2. 选择要用作副本源的 Oracle 数据库实例。
  3. 在 “ 操作 ” 菜单上,选择 “ 创建副本 ” 。

  1. 对于 副本模式 ,选择 “ 已装载 ” 。
  2. 对于 数据库实例标识符 ,输入只读副本的名称。

  1. 对于 可用区域 ,选择源数据库的区域。

  1. 对于其他设置,请验证它们是否与源数据库相同。
  2. 选择 创建只读副本

你可以在控制台上查看副本的状态。

创建副本操作完成后,我们可以选择将副本模式更改为已装载。

亚马逊云科技 命令行

要使用 亚马逊云科技 CLI 创建只读副本,请完成以下步骤:

  1. 使用以下代码创建只读副本:
aws rds create-db-instance-read-replica \
--db-instance-identifier blog-demo-b \
--source-db-instance-identifier blog-demo \
--availability-zone eu-central-1a
  1. 使用以下代码查询实例:
aws rds describe-db-instances 
--db-instance-identifier blog-demo \
--query "DBInstances[*].[DBInstanceIdentifier,DBInstanceStatus]"
  1. 创建副本操作完成后,我们可以选择将副本模式更改为开放只读(此选项需要额外 Oracle 许可证):
aws rds modify-db-instance \
--db-instance-identifier $REPINSTANCENAME \
--replica-mode open-read-only

检查副本延迟

在计划运行计划活动的计划维护时段开始时,我们会将只读副本升级为具有一致的恢复点,以防最后需要回滚。

在提升只读副本之前,我们必须检查副本延迟,以确保副本数据库实例与源数据库实例同步。

连接到源数据库后,我们在检查副本延迟之前运行以下 logfile switch 命令以获取更新的延迟统计信息:

SQL> EXEC rdsadmin.rdsadmin_util.switch_logfile;

PL/SQL procedure successfully completed.

现在我们可以通过控制台或 亚马逊云科技 CLI 检查副本延迟。

控制台

要在控制台上检查副本延迟,请完成以下步骤:

  1. 在 Amazon RDS 控制台的导航窗格中,选择 数据库
  2. 选择 Oracle 数据库副本实例。
  3. 复制 部分中,我们可以验证 复制状态 延迟 列。

  1. 我们还可以在 “ 监控 ” 选项卡上查 看 Amazon CloudWatch 副本延迟 指标。

亚马逊云科技 命令行

要使用 亚马逊云科技 CLI 检查副本延迟,请使用以下代码:

aws cloudwatch get-metric-statistics --namespace "AWS/RDS" \
--metric-name ReplicaLag --start-time $(date -d "-1 min" +%FT%TZ) \
--end-time $(date +%FT%TZ) --period 60 \
--dimensions Name=DBInstanceIdentifier,Value=blog-demo-b \
--statistics Maximum

提升只读副本

在继续进行只读副本升级之前,我们将检查源数据库和目标数据库的当前状态、整个源端点的连接、只读副本端点以及现在指向源端点的 CNAME DNS 别名。

  1. 通过 RDS 实例终端节点测试与源数据库的连接:
sqlplus admin/$PASSWORD@blog-demo.yyyy.eu-central-1.rds.amazonaws.com:1521/DEMO

SQL> select name,db_unique_name,database_role from v$database;

NAME DB_UNIQUE_NAME DATABASE_ROLE
---------- -------------------- ----------------
DEMO DEMO_A PRIMARY
  1. 通过 RDS 实例终端节点测试与目标副本数据库的连接:
sqlplus admin/$PASSWORD@blog-demo-b.xxxx.eu-central-1.rds.amazonaws.com:1521/DEMO

SQL> select name,db_unique_name,database_role from v$database;

NAME DB_UNIQUE_NAME DATABASE_ROLE
---------- -------------------- ----------------
DEMO DEMO_B PHYSICAL STANDBY
  1. 测试通过 CNAME DNS 别名与源数据库的连接:
sqlplus admin/$PASSWORD@demo.rds.blogdemo.com:1521/DEMO

SQL> select name,db_unique_name,database_role from v$database;

NAME DB_UNIQUE_NAME DATABASE_ROLE
---------- -------------------- ----------------
DEMO DEMO_A PRIMARY

现在我们可以升级只读副本。提升只读副本时,创建的新数据库实例会保留前一个只读副本的选项组和参数组。升级过程可能需要几分钟或更长时间才能完成,具体取决于只读副本的大小。将只读副本提升为新的数据库实例后,它就像其他数据库实例一样。

请记住以下几点:

  • 备份持续时间是自上次备份以来数据库更改次数的函数。如果您计划将只读副本升级为独立实例,我们建议您在升级之前启用备份并完成至少一个备份。
  • 当只读副本处于备份状态时,您无法将其升级为独立实例。如果您在只读副本上启用了备份,请配置自动备份窗口,以使每日备份不会干扰只读副本的提升。

控制台

要在控制台上升级只读副本,请完成以下步骤:

  1. 在 Amazon RDS 控制台上, 在导航窗格中选择 数据库
  2. 选择要升级的只读副本。
  3. 在 “ 操作 ” 菜单上,选择 “ 升级 ” 。

  1. 提升只读副本 页面上,将备份保留期输入为源数据库。
  2. 当设置符合您的要求时,选择 “ 继续 ” 。
  3. 在确认页面上,选择 提升只读副本

您可以在控制台上查看副本的状态。

亚马逊云科技 命令行

要使用 亚马逊云科技 CLI 将只读副本实例升级为独立实例,请使用以下代码:

aws rds promote-read-replica 
--backup-retention-period 7 \
--db-instance-identifier blog-demo-b

等待只读副本促销完成

此时,我们将等待数据库副本升级完成,以便在发生回滚时验证一致性。我们还将检查与推广的只读副本实例的连接,以确保在回滚时它已准备好接受入站连接。

我们可以通过控制台或 亚马逊云科技 CLI 查看促销状态。

控制台

以下屏幕截图显示了控制台上的促销数据库实例状态。

亚马逊云科技 命令行

要使用 亚马逊云科技 CLI,请使用以下代码检查推广的数据库实例状态:

aws rds describe-db-instances 
--db-instance-identifier blog-demo-b \
--query "DBInstances[*].[DBInstanceIdentifier,DBInstanceStatus,ReplicaMode]"

使用升级后的只读副本 RDS 端点运行连接测试:

sqlplus admin/$PASSWORD@blog-demo-b.xxxx.eu-central-1.rds.amazonaws.com:1521/DEMO

SQL> select name,db_unique_name,database_role from v$database;

NAME DB_UNIQUE_NAME DATABASE_ROLE
---------- -------------------- ----------------
DEMO DEMO_B PRIMARY

在源数据库上运行计划中的活动

此时,我们已经启动并运行了源数据库的副本,它可以起到新的源数据库的作用,以防我们在计划活动结束后需要回滚应用于数据库的更改。在实际执行生产 RDS 实例上的计划活动之前,请确保升级的 RDS 实例具有预期的配置,以适应需要回滚的生产工作负载。例如,检查 RDS 实例类和大小、存储自动扩展选项以及任何其他配置,例如参数和选项组。

计划活动结束后回滚

在这种情况下,我们已经在源数据库上运行了计划中的活动,但结果并不如预期。我们下令禁止此活动,然后开始回滚。

要回滚到数据库的初始状态,我们必须重新创建原始 RDS 数据库实例 DNS 终端节点,通过重命名两个 RDS 数据库实例来指向升级的 RDS 数据库实例,如下所示:

  • 将原始 RDS 数据库实例从 演示博客重命名为演示博客 旧实例,然后 停止原始实例
  • 将推广的 RDS 数据库实例从 demo-blog -b 重命名为演示博客

这样,将重新创建原始 RDS 数据库实例 DNS 条目以指向升级后的 RDS 数据库实例。

重命名的数据库实例的新 DNS 名称将在大约 10 分钟后生效。

控制台

要在控制台上实现回滚,请完成以下步骤:

  1. 在 Amazon RDS 控制台的导航窗格中,选择 数据库
  2. 选择要停止的数据库实例。
  3. 选择 “ 修改”
  4. 输入原始 RDS 数据库实例标识符的新名称(d emo-blog-old )。

  1. 选择 “ 立即 应用 ” ,然后选择 “ 修改数据库实例 ” 。

  1. 对推广的 RDS 数据库实例应用相同的步骤并将其重命名为 d emo- blog。

亚马逊云科技 命令行

要使用 亚马逊云科技 CLI 进行回滚,请完成以下步骤:

  1. 重命名旧的源数据库实例:
aws rds modify-db-instance
--db-instance-identifier blog-demo \
--new-db-instance-identifier blog-demo-old
  1. 使用原始源数据库实例名称重命名推广的 RDS 数据库实例 (demo-blog ):
aws rds modify-db-instance
--db-instance-identifier blog-demo-b \
--new-db-instance-identifier blog-demo
  1. 使用原始源数据库 RDS 端点测试与数据库的连接:
sqlplus admin/Welcome1@blog-demo.yyyy.eu-central-1.rds.amazonaws.com:1521/DEMO

SQL> select name,db_unique_name,database_role from v$database;

NAME DB_UNIQUE_NAME DATABASE_ROLE
---------- -------------------- ----------------
DEMO DEMO_B PRIMARY

编辑 CNAME 条目

如前几节所预期的那样,如果您的应用程序连接字符串使用在指向初始主数据库实例终端节点的私有区域中定义的自定义 Route 53 CNAME 条目进行配置,则您只需更新 CNAME 以指向推广的数据库实例终端节点,而无需重命名这两个数据库实例。这样,与推广的 RDS 数据库实例的连接将在几秒钟内可用。高级步骤如下所示:

  1. 停止原始源数据库。
  2. 使用推广的只读副本的别名更新专用于您的源数据库的 Route 53 DNS 别名记录。
  3. 测试与新源数据库的连接。

控制台

要通过控制台编辑 CNAME 条目,请完成以下步骤:

  1. 在 Amazon RDS 控制台的导航窗格中,选择 数据库
  2. 选择要停止的数据库实例。
  3. 在 “ 操作 ” 菜单上,选择 “ 暂时 停止 ” 。

  1. 选择确认数据库实例将在 7 天后自动重启。
  2. 作为可选但建议的步骤,选择在 快照中 保存数据库实例, 然后在快照名称中输入 快照名称
  3. 选择 “ 暂时 停 止” 以停止数据库实例。

  1. 在 Route 53 控制台上, 在导航窗格中选择 托管区域 ,然后选择您的托管区域。
  2. 选择 编辑托管区域

  1. 记录 列表中,选择与源数据库关联的 CNAME。
  2. 选择 “ 编辑记录”
  3. 使用升级后的只读副本端点更新该值。
  4. 选择 “ 保存”

  1. 使用 CNAME 别名端点测试与数据库的连接:
sqlplus admin/Welcome1@demo.rds.blogdemo.com:1521/DEMO

SQL> select name,db_unique_name,database_role from v$database;

NAME DB_UNIQUE_NAME DATABASE_ROLE
---------- -------------------- ----------------
DEMO DEMO_B PRIMARY

结论

有了适用于 Oracle 的 Amazon RDS,我们可以使用亚马逊 RDS 功能来实现与 Oracle 闪回数据库功能相同的业务目标。在这篇文章中,我们讨论了如何在计划内且具有潜在风险的活动之前验证恢复点:我们可以在活动开始之前创建手动快照或升级只读副本。第二个选项更适合生产环境,因为它可以加快回滚速度,以防计划活动引入不可恢复的问题,因为您可以根据数据库大小和工作负载提前足够的时间配置只读副本,以减轻 延迟加载 存储恢复的影响。

如果您有任何意见或问题,请将其留在评论部分。


作者简介

Tony Mullen 是驻曼彻斯特的高级数据库专家解决方案架构师。他专注于关系数据库引擎,帮助客户将其数据库工作负载迁移到 亚马逊云科技 并对其进行现代化改造。

Giorgio Bonzi 是一位驻米兰的高级数据库专家解决方案架构师。他专注于 Oracle 数据库引擎,为客户提供指导和技术援助,帮助他们在 亚马逊云科技 上设计、部署和优化关系数据库工作负载。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。