Skip to main content
NetApp database solutions
简体中文版经机器翻译而成,仅供参考。如与英语版出现任何冲突,应以英语版为准。

TR-4981:使用Amazon FSx ONTAP降低 Oracle Active Data Guard 成本

贡献者 kevin-hoke

Allen Cao、Niyaz Mohamed, NetApp

该解决方案提供了使用 AWS FSx ONTAP作为备用站点 Oracle 数据库存储配置 Oracle Data Guard 的概述和详细信息,以降低 AWS 中 Oracle Data Guard HA/DR 解决方案的许可和运营成本。

目的

Oracle Data Guard 可确保主数据库和备用数据库复制配置中企业数据的高可用性、数据保护和灾难恢复。 Oracle Active Data Guard 使用户能够在从主数据库到备用数据库的数据复制处于活动状态时访问备用数据库。 Data Guard 是 Oracle Database Enterprise Edition 的一个特性。它不需要单独的许可。另一方面,Active Data Guard 是 Oracle Database Enterprise Edition Option,因此需要单独的许可。在 Active Data Guard 设置中,多个备用数据库可以从主数据库接收数据复制。但是,每个额外的备用数据库都需要 Active Data Guard 许可证和与主数据库大小相同的额外存储空间。运营成本迅速增加。

如果您热衷于削减 Oracle 数据库操作成本并计划在 AWS 中设置 Active Data Guard,那么您应该考虑另一种选择。不要使用 Active Data Guard,而是使用 Data Guard 从主数据库复制到Amazon FSx ONTAP存储上的单个物理备用数据库。随后,可以克隆此备用数据库的多个副本并打开以进行读/写访问,以服务于许多其他用例,例如报告、开发、测试等。最终结果有效地提供了 Active Data Guard 的功能,同时消除了 Active Data Guard 许可证和每个额外备用数据库的额外存储成本。在本文档中,我们演示了如何使用 AWS 中现有的主数据库设置 Oracle Data Guard,并将物理备用数据库放置在Amazon FSx ONTAP存储上。备用数据库通过快照进行备份,并根据需要克隆以供用例进行读/写访问。

此解决方案适用于以下用例:

  • AWS 中任何存储上的主数据库与Amazon FSx ONTAP存储上的备用数据库之间的 Oracle Data Guard。

  • 在关闭数据复制的同时克隆备用数据库,以满足报告、开发、测试等用例的需求。

受众

此解决方案适用于以下人群:

  • 一位 DBA 在 AWS 中设置了 Oracle Active Data Guard,以实现高可用性、数据保护和灾难恢复。

  • 对 AWS 云中的 Oracle Active Data Guard 配置感兴趣的数据库解决方案架构师。

  • 管理支持 Oracle Data Guard 的 AWS FSx ONTAP存储的存储管理员。

  • 喜欢在 AWS FSx/EC2 环境中启动 Oracle Data Guard 的应用程序所有者。

解决方案测试和验证环境

该解决方案的测试和验证是在 AWS FSx ONTAP和 EC2 实验室环境中进行的,该环境可能与最终部署环境不匹配。有关更多信息,请参阅部署考虑的关键因素

架构

此图提供了使用 FSx ONTAP在 AWS 中实施 Oracle Data Guard 的详细图片。

硬件和软件组件

硬件

FSx ONTAP存储

AWS 提供的当前版本

同一 VPC 和可用区中的一个 FSx HA 集群

用于计算的 EC2 实例

t2.xlarge/4vCPU/16G

三个 EC2 T2 xlarge EC2 实例,一个作为主数据库服务器,一个作为备用数据库服务器,第三个作为克隆数据库服务器

软件

红帽Linux

RHEL-8.6.0_HVM-20220503-x86_64-2-Hourly2-GP2

部署 RedHat 订阅进行测试

Oracle 网格基础设施

19.18 版

已应用RU补丁p34762026_190000_Linux-x86-64.zip

Oracle 数据库

19.18 版

已应用RU补丁p34765931_190000_Linux-x86-64.zip

Oracle OPatch

版本 12.2.0.1.36

最新补丁 p6880880_190000_Linux-x86-64.zip

假设纽约到洛杉矶灾难恢复设置的 Oracle Data Guard 配置

数据库

数据库唯一名称

Oracle 网络服务名称

主云

db1_NY

db1_NY.demo.netapp.com

物理备用

db1_LA

db1_LA.demo.netapp.com

部署考虑的关键因素

  • Oracle 备用数据库FlexClone 的工作原理。 AWS FSx ONTAP FlexClone提供可写的相同备用数据库卷的共享副本。卷的副本实际上是链接回原始数据块的指针,直到在克隆上启动新的写入。然后, ONTAP为新的写入分配新的存储块。任何读取 IO 均由主动复制下的原始数据块提供服务。因此,克隆的存储效率非常高,可以用于许多其他用例,为新的写入 IO 分配最少且增量的新存储。通过大幅减少 Active Data Guard 存储空间,可以节省大量的存储成本。 NetApp建议在数据库从主存储切换到备用 FSx 存储时尽量减少FlexClone活动,以保持 Oracle 性能处于高水平。

  • *Oracle 软件要求。*一般而言,物理备用数据库必须具有与主数据库相同的数据库主版本,包括补丁集异常 (PSE)、关键补丁更新 (CPU) 和补丁集更新 (PSU),除非正在进行 Oracle Data Guard 备用优先补丁应用过程(如 My Oracle Support 说明 1265700.1 中所述,网址为"support.oracle.com"

  • *备用数据库目录结构注意事项。*如果可能,主系统和备用系统上的数据文件、日志文件和控制文件应该具有相同的名称和路径名,并使用最佳灵活架构 (OFA) 命名约定。备用数据库上的存档目录在站点之间也应该相同,包括大小和结构。该策略允许其他操作(例如备份、切换和故障转移)执行同一组步骤,从而降低维护复杂性。

  • *强制记录模式。*为了防止主数据库中未记录的直接写入无法传播到备用数据库,请在执行数据文件备份以创建备用数据库之前在主数据库上打开 FORCE LOGGING。

  • 数据库存储管理。为了简化操作,Oracle 建议在 Oracle Data Guard 配置中设置 Oracle 自动存储管理 (Oracle ASM) 和 Oracle 管理文件 (OMF) 时在主数据库和备用数据库上对称设置它。

  • EC2 计算实例。在这些测试和验证中,我们使用 AWS EC2 t2.xlarge 实例作为 Oracle 数据库计算实例。 NetApp建议在生产部署中使用 M5 类型的 EC2 实例作为 Oracle 的计算实例,因为它针对数据库工作负载进行了优化。您需要根据实际工作负载需求,适当调整 EC2 实例的 vCPU 数量和 RAM 容量。

  • *FSx 存储 HA 集群单区域或多区域部署。*在这些测试和验证中,我们在单个 AWS 可用区中部署了一个 FSx HA 集群。对于生产部署, NetApp建议在两个不同的可用区部署 FSx HA 对。 FSx 集群始终在 HA 对中配置,该 HA 对在主动-被动文件系统中同步镜像,以提供存储级冗余。多区域部署进一步增强了单个 AWS 区域发生故障时的高可用性。

  • FSx 存储集群大小。 Amazon FSx ONTAP存储文件系统提供高达 160,000 个原始 SSD IOPS、高达 4GBps 的吞吐量以及最大 192TiB 的容量。但是,您可以根据部署时的实际需求,根据预配置的 IOPS、吞吐量和存储限制(最小 1,024 GiB)来确定集群大小。容量可以动态调整,而不会影响应用程序的可用性。

解决方案部署

假设您已在 VPC 内的 AWS EC2 环境中部署了主 Oracle 数据库,作为设置 Data Guard 的起点。主数据库使用 Oracle ASM 进行存储管理。创建两个 ASM 磁盘组 - +DATA 和 +LOGS,用于存储 Oracle 数据文件、日志文件、控制文件等。有关在 AWS 中使用 ASM 部署 Oracle 的详细信息,请参阅以下技术报告以获取帮助。

您的主要 Oracle 数据库可以在 FSx ONTAP或 AWS EC2 生态系统中的任何其他存储上运行。以下部分提供了在具有 ASM 存储的主 EC2 DB 实例和具有 ASM 存储的备用 EC2 DB 实例之间设置 Oracle Data Guard 的分步部署过程。

部署先决条件

Details

部署需要以下先决条件。

  1. 已设置 AWS 账户,并在您的 AWS 账户内创建了必要的 VPC 和网络段。

  2. 从 AWS EC2 控制台,您需要部署至少三个 EC2 Linux 实例,一个作为主 Oracle DB 实例,一个作为备用 Oracle DB 实例,以及一个用于报告、开发和测试等的克隆目标 DB 实例。有关环境设置的更多详细信息,请参阅上一节中的架构图。还请查看 AWS"Linux 实例用户指南"了解更多信息。

  3. 从 AWS EC2 控制台部署Amazon FSx ONTAP存储 HA 集群来托管存储 Oracle 备用数据库的 Oracle 卷。如果您不熟悉 FSx 存储的部署,请参阅文档"创建 FSx ONTAP文件系统"以获得分步说明。

  4. 步骤 2 和 3 可以使用以下 Terraform 自动化工具包执行,该工具包创建一个名为 ora_01`以及一个名为 `fsx_01。在执行之前,请仔细检查说明并更改变量以适合您的环境。该模板可以根据您自己的部署要求轻松修改。

    git clone https://github.com/NetApp-Automation/na_aws_fsx_ec2_deploy.git
备注 确保您已在 EC2 实例根卷中分配至少 50G,以便有足够的空间来暂存 Oracle 安装文件。

为 Data Guard 准备主数据库

Details

在此演示中,我们在主 EC2 DB 实例上设置了一个名为 db1 的主 Oracle 数据库,该数据库具有两个独立重启配置中的 ASM 磁盘组,其中数据文件位于 ASM 磁盘组 +DATA 中,闪回恢复区位于 ASM 磁盘组 +LOGS 中。下面说明了为 Data Guard 设置主数据库的详细步骤。所有步骤都应以数据库所有者 - oracle 用户的身份执行。

  1. 主 EC2 DB 实例 ip-172-30-15-45 上的主数据库 db1 配置。 ASM 磁盘组可以位于 EC2 生态系统内的任何类型的存储上。

    [oracle@ip-172-30-15-45 ~]$ cat /etc/oratab
    
    # This file is used by ORACLE utilities.  It is created by root.sh
    # and updated by either Database Configuration Assistant while creating
    # a database or ASM Configuration Assistant while creating ASM instance.
    
    # A colon, ':', is used as the field terminator.  A new line terminates
    # the entry.  Lines beginning with a pound sign, '#', are comments.
    #
    # Entries are of the form:
    #   $ORACLE_SID:$ORACLE_HOME:<N|Y>:
    #
    # The first and second fields are the system identifier and home
    # directory of the database respectively.  The third field indicates
    # to the dbstart utility that the database should , "Y", or should not,
    # "N", be brought up at system boot time.
    #
    # Multiple entries with the same $ORACLE_SID are not allowed.
    #
    #
    +ASM:/u01/app/oracle/product/19.0.0/grid:N
    db1:/u01/app/oracle/product/19.0.0/db1:N
    
    [oracle@ip-172-30-15-45 ~]$ /u01/app/oracle/product/19.0.0/grid/bin/crsctl stat res -t
    --------------------------------------------------------------------------------
    Name           Target  State        Server                   State details
    --------------------------------------------------------------------------------
    Local Resources
    --------------------------------------------------------------------------------
    ora.DATA.dg
                   ONLINE  ONLINE       ip-172-30-15-45          STABLE
    ora.LISTENER.lsnr
                   ONLINE  ONLINE       ip-172-30-15-45          STABLE
    ora.LOGS.dg
                   ONLINE  ONLINE       ip-172-30-15-45          STABLE
    ora.asm
                   ONLINE  ONLINE       ip-172-30-15-45          Started,STABLE
    ora.ons
                   OFFLINE OFFLINE      ip-172-30-15-45          STABLE
    --------------------------------------------------------------------------------
    Cluster Resources
    --------------------------------------------------------------------------------
    ora.cssd
          1        ONLINE  ONLINE       ip-172-30-15-45          STABLE
    ora.db1.db
          1        ONLINE  ONLINE       ip-172-30-15-45          Open,HOME=/u01/app/o
                                                                 racle/product/19.0.0
                                                                 /db1,STABLE
    ora.diskmon
          1        OFFLINE OFFLINE                               STABLE
    ora.driver.afd
          1        ONLINE  ONLINE       ip-172-30-15-45          STABLE
    ora.evmd
          1        ONLINE  ONLINE       ip-172-30-15-45          STABLE
    --------------------------------------------------------------------------------
  2. 从 sqlplus 中,在主服务器上启用强制日志记录。

    alter database force logging;
  3. 从 sqlplus,在主服务器上启用闪回。闪回功能允许在故障转移后轻松地将主数据库恢复为备用数据库。

    alter database flashback on;
  4. 使用 Oracle 密码文件配置重做传输身份验证 - 如果未设置,则使用 orapwd 实用程序在主服务器上创建 pwd 文件,并将其复制到备用数据库 $ORACLE_HOME/dbs 目录。

  5. 在主数据库上创建与当前在线日志文件大小相同的备用重做日志。日志组比联机日志文件组多一个。然后,如果需要,主数据库可以快速转换到备用角色并开始接收重做数据。

    alter database add standby logfile thread 1 size 200M;
    Validate after standby logs addition:
    
    SQL> select group#, type, member from v$logfile;
    
        GROUP# TYPE    MEMBER
    ---------- ------- ------------------------------------------------------------
             3 ONLINE  +DATA/DB1/ONLINELOG/group_3.264.1145821513
             2 ONLINE  +DATA/DB1/ONLINELOG/group_2.263.1145821513
             1 ONLINE  +DATA/DB1/ONLINELOG/group_1.262.1145821513
             4 STANDBY +DATA/DB1/ONLINELOG/group_4.286.1146082751
             4 STANDBY +LOGS/DB1/ONLINELOG/group_4.258.1146082753
             5 STANDBY +DATA/DB1/ONLINELOG/group_5.287.1146082819
             5 STANDBY +LOGS/DB1/ONLINELOG/group_5.260.1146082821
             6 STANDBY +DATA/DB1/ONLINELOG/group_6.288.1146082825
             6 STANDBY +LOGS/DB1/ONLINELOG/group_6.261.1146082827
             7 STANDBY +DATA/DB1/ONLINELOG/group_7.289.1146082835
             7 STANDBY +LOGS/DB1/ONLINELOG/group_7.262.1146082835
    
    11 rows selected.
  6. 从 sqlplus,从 spfile 创建一个 pfile 以供编辑。

    create pfile='/home/oracle/initdb1.ora' from spfile;
  7. 修改pfile并添加以下参数。

    DB_NAME=db1
    DB_UNIQUE_NAME=db1_NY
    LOG_ARCHIVE_CONFIG='DG_CONFIG=(db1_NY,db1_LA)'
    LOG_ARCHIVE_DEST_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=db1_NY'
    LOG_ARCHIVE_DEST_2='SERVICE=db1_LA ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=db1_LA'
    REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
    FAL_SERVER=db1_LA
    STANDBY_FILE_MANAGEMENT=AUTO
  8. 从 sqlplus 中,根据 /home/oracle 目录中修改后的 pfile 在 ASM +DATA 目录中创建 spfile。

    create spfile='+DATA' from pfile='/home/oracle/initdb1.ora';
  9. 在 +DATA 磁盘组下找到新创建的 spfile(如有必要,使用 asmcmd 实用程序)。使用 srvctl 修改网格以从新的 spfile 启动数据库,如下所示。

    [oracle@ip-172-30-15-45 db1]$ srvctl config database -d db1
    Database unique name: db1
    Database name: db1
    Oracle home: /u01/app/oracle/product/19.0.0/db1
    Oracle user: oracle
    Spfile: +DATA/DB1/PARAMETERFILE/spfile.270.1145822903
    Password file:
    Domain: demo.netapp.com
    Start options: open
    Stop options: immediate
    Database role: PRIMARY
    Management policy: AUTOMATIC
    Disk Groups: DATA
    Services:
    OSDBA group:
    OSOPER group:
    Database instance: db1
    [oracle@ip-172-30-15-45 db1]$ srvctl modify database -d db1 -spfile +DATA/DB1/PARAMETERFILE/spfiledb1.ora
    [oracle@ip-172-30-15-45 db1]$ srvctl config database -d db1
    Database unique name: db1
    Database name: db1
    Oracle home: /u01/app/oracle/product/19.0.0/db1
    Oracle user: oracle
    Spfile: +DATA/DB1/PARAMETERFILE/spfiledb1.ora
    Password file:
    Domain: demo.netapp.com
    Start options: open
    Stop options: immediate
    Database role: PRIMARY
    Management policy: AUTOMATIC
    Disk Groups: DATA
    Services:
    OSDBA group:
    OSOPER group:
    Database instance: db1
  10. 修改 tnsnames.ora 以添加 db_unique_name 进行名称解析。

    # tnsnames.ora Network Configuration File: /u01/app/oracle/product/19.0.0/db1/network/admin/tnsnames.ora
    # Generated by Oracle configuration tools.
    
    db1_NY =
      (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = ip-172-30-15-45.ec2.internal)(PORT = 1521))
        (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SID = db1)
        )
      )
    
    db1_LA =
      (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = ip-172-30-15-67.ec2.internal)(PORT = 1521))
        (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SID = db1)
        )
      )
    
    LISTENER_DB1 =
      (ADDRESS = (PROTOCOL = TCP)(HOST = ip-172-30-15-45.ec2.internal)(PORT = 1521))
  11. 将主数据库的数据保护服务名称 db1_NY_DGMGRL.demo.netapp 添加到 listener.ora 文件。

#Backup file is  /u01/app/oracle/crsdata/ip-172-30-15-45/output/listener.ora.bak.ip-172-30-15-45.oracle line added by Agent
# listener.ora Network Configuration File: /u01/app/oracle/product/19.0.0/grid/network/admin/listener.ora
# Generated by Oracle configuration tools.

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = ip-172-30-15-45.ec2.internal)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = db1_NY_DGMGRL.demo.netapp.com)
      (ORACLE_HOME = /u01/app/oracle/product/19.0.0/db1)
      (SID_NAME = db1)
    )
  )

ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER=ON              # line added by Agent
VALID_NODE_CHECKING_REGISTRATION_LISTENER=ON            # line added by Agent
  1. 使用 srvctl 关闭并重新启动数据库,并验证数据保护参数现在是否处于活动状态。

    srvctl stop database -d db1
    srvctl start database -d db1

这完成了 Data Guard 的主数据库设置。

准备备用数据库并激活 Data Guard

Details

Oracle Data Guard 需要 OS 内核配置和 Oracle 软件堆栈(包括备用 EC2 DB 实例上的补丁集)以与主 EC2 DB 实例匹配。为了便于管理和简单起见,备用 EC2 DB 实例数据库存储配置理想情况下也应该与主 EC2 DB 实例匹配,例如 ASM 磁盘组的名称、数量和大小。以下是为 Data Guard 设置备用 EC2 DB 实例的详细步骤。所有命令都应以 oracle 所有者用户 ID 的身份执行。

  1. 首先,检查主 EC2 实例上主数据库的配置。在此演示中,我们在主 EC2 DB 实例上设置了一个名为 db1 的主 Oracle 数据库,并在独立重启配置中使用两个 ASM 磁盘组 +DATA 和 +LOGS。主 ASM 磁盘组可以位于 EC2 生态系统内的任何类型的存储上。

  2. 按照文档中的程序进行"TR-4965:使用 iSCSI/ASM 在 AWS FSx/EC2 中部署和保护 Oracle 数据库"在备用 EC2 DB 实例上安装和配置网格和 Oracle,以与主数据库匹配。应配置数据库存储并将其分配给 FSx ONTAP中的备用 EC2 DB 实例,其存储容量与主 EC2 DB 实例相同。

    备注 在第 10 步停止 `Oracle database installation`部分。备用数据库将使用 dbca 数据库复制功能从主数据库实例化。
  3. 安装并配置 Oracle 软件后,从备用 $ORACLE_HOME dbs 目录复制主数据库中的 oracle 密码。

    scp oracle@172.30.15.45:/u01/app/oracle/product/19.0.0/db1/dbs/orapwdb1 .
  4. 使用以下条目创建 tnsnames.ora 文件。

    # tnsnames.ora Network Configuration File: /u01/app/oracle/product/19.0.0/db1/network/admin/tnsnames.ora
    # Generated by Oracle configuration tools.
    
    db1_NY =
      (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = ip-172-30-15-45.ec2.internal)(PORT = 1521))
        (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SID = db1)
        )
      )
    
    db1_LA =
      (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = ip-172-30-15-67.ec2.internal)(PORT = 1521))
        (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SID = db1)
        )
      )
  5. 将 DB 数据保护服务名称添加到 listener.ora 文件。

    #Backup file is  /u01/app/oracle/crsdata/ip-172-30-15-67/output/listener.ora.bak.ip-172-30-15-67.oracle line added by Agent
    # listener.ora Network Configuration File: /u01/app/oracle/product/19.0.0/grid/network/admin/listener.ora
    # Generated by Oracle configuration tools.
    
    LISTENER =
      (DESCRIPTION_LIST =
        (DESCRIPTION =
          (ADDRESS = (PROTOCOL = TCP)(HOST = ip-172-30-15-67.ec2.internal)(PORT = 1521))
          (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
        )
      )
    
    SID_LIST_LISTENER =
      (SID_LIST =
        (SID_DESC =
          (GLOBAL_DBNAME = db1_LA_DGMGRL.demo.netapp.com)
          (ORACLE_HOME = /u01/app/oracle/product/19.0.0/db1)
          (SID_NAME = db1)
        )
      )
    
    ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER=ON              # line added by Agent
    VALID_NODE_CHECKING_REGISTRATION_LISTENER=ON            # line added by Agent
  6. 设置 oracle 主页和路径。

    export ORACLE_HOME=/u01/app/oracle/product/19.0.0/db1
    export PATH=$PATH:$ORACLE_HOME/bin
  7. 使用 dbca 从主数据库 db1 实例化备用数据库。

    [oracle@ip-172-30-15-67 bin]$ dbca -silent -createDuplicateDB -gdbName db1 -primaryDBConnectionString ip-172-30-15-45.ec2.internal:1521/db1_NY.demo.netapp.com -sid db1 -initParams fal_server=db1_NY -createAsStandby -dbUniqueName db1_LA
    Enter SYS user password:
    
    Prepare for db operation
    22% complete
    Listener config step
    44% complete
    Auxiliary instance creation
    67% complete
    RMAN duplicate
    89% complete
    Post duplicate database operations
    100% complete
    
    Look at the log file "/u01/app/oracle/cfgtoollogs/dbca/db1_LA/db1_LA.log" for further details.
  8. 验证重复的备用数据库。新复制的备用数据库最初以只读模式打开。

    [oracle@ip-172-30-15-67 bin]$ export ORACLE_SID=db1
    [oracle@ip-172-30-15-67 bin]$ sqlplus / as sysdba
    
    SQL*Plus: Release 19.0.0.0.0 - Production on Wed Aug 30 18:25:46 2023
    Version 19.18.0.0.0
    
    Copyright (c) 1982, 2022, Oracle.  All rights reserved.
    
    
    Connected to:
    Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
    Version 19.18.0.0.0
    
    SQL> select name, open_mode from v$database;
    
    NAME      OPEN_MODE
    --------- --------------------
    DB1       READ ONLY
    
    SQL> show parameter name
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    cdb_cluster_name                     string
    cell_offloadgroup_name               string
    db_file_name_convert                 string
    db_name                              string      db1
    db_unique_name                       string      db1_LA
    global_names                         boolean     FALSE
    instance_name                        string      db1
    lock_name_space                      string
    log_file_name_convert                string
    pdb_file_name_convert                string
    processor_group_name                 string
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    service_names                        string      db1_LA.demo.netapp.com
    SQL>
    SQL> show parameter log_archive_config
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    log_archive_config                   string      DG_CONFIG=(db1_NY,db1_LA)
    SQL> show parameter fal_server
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    fal_server                           string      db1_NY
    
    SQL> select name from v$datafile;
    
    NAME
    --------------------------------------------------------------------------------
    +DATA/DB1_LA/DATAFILE/system.261.1146248215
    +DATA/DB1_LA/DATAFILE/sysaux.262.1146248231
    +DATA/DB1_LA/DATAFILE/undotbs1.263.1146248247
    +DATA/DB1_LA/03C5C01A66EE9797E0632D0F1EAC5F59/DATAFILE/system.264.1146248253
    +DATA/DB1_LA/03C5C01A66EE9797E0632D0F1EAC5F59/DATAFILE/sysaux.265.1146248261
    +DATA/DB1_LA/DATAFILE/users.266.1146248267
    +DATA/DB1_LA/03C5C01A66EE9797E0632D0F1EAC5F59/DATAFILE/undotbs1.267.1146248269
    +DATA/DB1_LA/03C5EFD07C41A1FAE0632D0F1EAC9BD8/DATAFILE/system.268.1146248271
    +DATA/DB1_LA/03C5EFD07C41A1FAE0632D0F1EAC9BD8/DATAFILE/sysaux.269.1146248279
    +DATA/DB1_LA/03C5EFD07C41A1FAE0632D0F1EAC9BD8/DATAFILE/undotbs1.270.1146248285
    +DATA/DB1_LA/03C5EFD07C41A1FAE0632D0F1EAC9BD8/DATAFILE/users.271.1146248293
    
    NAME
    --------------------------------------------------------------------------------
    +DATA/DB1_LA/03C5F0DDF35CA2B6E0632D0F1EAC8B6B/DATAFILE/system.272.1146248295
    +DATA/DB1_LA/03C5F0DDF35CA2B6E0632D0F1EAC8B6B/DATAFILE/sysaux.273.1146248301
    +DATA/DB1_LA/03C5F0DDF35CA2B6E0632D0F1EAC8B6B/DATAFILE/undotbs1.274.1146248309
    +DATA/DB1_LA/03C5F0DDF35CA2B6E0632D0F1EAC8B6B/DATAFILE/users.275.1146248315
    +DATA/DB1_LA/03C5F1C9B142A2F1E0632D0F1EACF21A/DATAFILE/system.276.1146248317
    +DATA/DB1_LA/03C5F1C9B142A2F1E0632D0F1EACF21A/DATAFILE/sysaux.277.1146248323
    +DATA/DB1_LA/03C5F1C9B142A2F1E0632D0F1EACF21A/DATAFILE/undotbs1.278.1146248331
    +DATA/DB1_LA/03C5F1C9B142A2F1E0632D0F1EACF21A/DATAFILE/users.279.1146248337
    
    19 rows selected.
    
    SQL> select name from v$controlfile;
    
    NAME
    --------------------------------------------------------------------------------
    +DATA/DB1_LA/CONTROLFILE/current.260.1146248209
    +LOGS/DB1_LA/CONTROLFILE/current.257.1146248209
    
    SQL> select name from v$tempfile;
    
    NAME
    --------------------------------------------------------------------------------
    +DATA/DB1_LA/TEMPFILE/temp.287.1146248371
    +DATA/DB1_LA/03C5C01A66EE9797E0632D0F1EAC5F59/TEMPFILE/temp.288.1146248375
    +DATA/DB1_LA/03C5EFD07C41A1FAE0632D0F1EAC9BD8/TEMPFILE/temp.290.1146248463
    +DATA/DB1_LA/03C5F0DDF35CA2B6E0632D0F1EAC8B6B/TEMPFILE/temp.291.1146248463
    +DATA/DB1_LA/03C5F1C9B142A2F1E0632D0F1EACF21A/TEMPFILE/temp.292.1146248463
    
    SQL> select group#, type, member from v$logfile order by 2, 1;
    
        GROUP# TYPE    MEMBER
    ---------- ------- ------------------------------------------------------------
             1 ONLINE  +LOGS/DB1_LA/ONLINELOG/group_1.259.1146248349
             1 ONLINE  +DATA/DB1_LA/ONLINELOG/group_1.280.1146248347
             2 ONLINE  +DATA/DB1_LA/ONLINELOG/group_2.281.1146248351
             2 ONLINE  +LOGS/DB1_LA/ONLINELOG/group_2.258.1146248353
             3 ONLINE  +DATA/DB1_LA/ONLINELOG/group_3.282.1146248355
             3 ONLINE  +LOGS/DB1_LA/ONLINELOG/group_3.260.1146248355
             4 STANDBY +DATA/DB1_LA/ONLINELOG/group_4.283.1146248357
             4 STANDBY +LOGS/DB1_LA/ONLINELOG/group_4.261.1146248359
             5 STANDBY +DATA/DB1_LA/ONLINELOG/group_5.284.1146248361
             5 STANDBY +LOGS/DB1_LA/ONLINELOG/group_5.262.1146248363
             6 STANDBY +LOGS/DB1_LA/ONLINELOG/group_6.263.1146248365
             6 STANDBY +DATA/DB1_LA/ONLINELOG/group_6.285.1146248365
             7 STANDBY +LOGS/DB1_LA/ONLINELOG/group_7.264.1146248369
             7 STANDBY +DATA/DB1_LA/ONLINELOG/group_7.286.1146248367
    
    14 rows selected.
    
    SQL> select name, open_mode from v$database;
    
    NAME      OPEN_MODE
    --------- --------------------
    DB1       READ ONLY
  9. 重新启动备用数据库 `mount`阶段并执行以下命令来激活备用数据库管理恢复。

    alter database recover managed standby database disconnect from session;
    SQL> shutdown immediate;
    Database closed.
    Database dismounted.
    ORACLE instance shut down.
    SQL> startup mount;
    ORACLE instance started.
    
    Total System Global Area 8053062944 bytes
    Fixed Size                  9182496 bytes
    Variable Size            1291845632 bytes
    Database Buffers         6744440832 bytes
    Redo Buffers                7593984 bytes
    Database mounted.
    SQL> alter database recover managed standby database disconnect from session;
    
    Database altered.
  10. 验证备用数据库恢复状态。注意 `recovery logmerger`在 `APPLYING_LOG`行动。

    SQL> SELECT ROLE, THREAD#, SEQUENCE#, ACTION FROM V$DATAGUARD_PROCESS;
    
    ROLE                        THREAD#  SEQUENCE# ACTION
    ------------------------ ---------- ---------- ------------
    recovery apply slave              0          0 IDLE
    recovery apply slave              0          0 IDLE
    recovery apply slave              0          0 IDLE
    recovery apply slave              0          0 IDLE
    recovery logmerger                1         30 APPLYING_LOG
    RFS ping                          1         30 IDLE
    RFS async                         1         30 IDLE
    archive redo                      0          0 IDLE
    archive redo                      0          0 IDLE
    archive redo                      0          0 IDLE
    gap manager                       0          0 IDLE
    
    ROLE                        THREAD#  SEQUENCE# ACTION
    ------------------------ ---------- ---------- ------------
    managed recovery                  0          0 IDLE
    redo transport monitor            0          0 IDLE
    log writer                        0          0 IDLE
    archive local                     0          0 IDLE
    redo transport timer              0          0 IDLE
    
    16 rows selected.
    
    SQL>

这样就完成了 db1 从主数据库到备用数据库的 Data Guard 保护设置,并且启用了托管备用恢复。

设置 Data Guard Broker

Details

Oracle Data Guard 代理是一个分布式管理框架,可自动并集中执行 Oracle Data Guard 配置的创建、维护和监控。以下部分演示如何设置 Data Guard Broker 来管理 Data Guard 环境。

  1. 通过 sqlplus 使用以下命令在主数据库和备用数据库上启动数据保护代理。

    alter system set dg_broker_start=true scope=both;
  2. 从主数据库,以 SYSDBA 身份连接到 Data Guard Borker。

    [oracle@ip-172-30-15-45 db1]$ dgmgrl sys@db1_NY
    DGMGRL for Linux: Release 19.0.0.0.0 - Production on Wed Aug 30 19:34:14 2023
    Version 19.18.0.0.0
    
    Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.
    
    Welcome to DGMGRL, type "help" for information.
    Password:
    Connected to "db1_NY"
    Connected as SYSDBA.
  3. 创建并启用 Data Guard Broker 配置。

    DGMGRL> create configuration dg_config as primary database is db1_NY connect identifier is db1_NY;
    Configuration "dg_config" created with primary database "db1_ny"
    DGMGRL> add database db1_LA as connect identifier is db1_LA;
    Database "db1_la" added
    DGMGRL> enable configuration;
    Enabled.
    DGMGRL> show configuration;
    
    Configuration - dg_config
    
      Protection Mode: MaxPerformance
      Members:
      db1_ny - Primary database
        db1_la - Physical standby database
    
    Fast-Start Failover:  Disabled
    
    Configuration Status:
    SUCCESS   (status updated 28 seconds ago)
  4. 在 Data Guard Broker 管理框架内验证数据库状态。

    DGMGRL> show database db1_ny;
    
    Database - db1_ny
    
      Role:               PRIMARY
      Intended State:     TRANSPORT-ON
      Instance(s):
        db1
    
    Database Status:
    SUCCESS
    
    DGMGRL> show database db1_la;
    
    Database - db1_la
    
      Role:               PHYSICAL STANDBY
      Intended State:     APPLY-ON
      Transport Lag:      0 seconds (computed 1 second ago)
      Apply Lag:          0 seconds (computed 1 second ago)
      Average Apply Rate: 2.00 KByte/s
      Real Time Query:    OFF
      Instance(s):
        db1
    
    Database Status:
    SUCCESS
    
    DGMGRL>

如果发生故障,可以使用 Data Guard Broker 立即将主数据库故障转移到备用数据库。

克隆备用数据库以供其他用例使用

Details

在 Data Guard 中的 AWS FSx ONTAP上暂存备用数据库的主要好处是,它可以通过 FlexCloned 来服务于许多其他用例,而只需最少的额外存储投资。在下一部分中,我们将演示如何使用NetApp SnapCenter工具对 FSx ONTAP上已安装和恢复的备用数据库卷进行快照和克隆,以用于其他目的,例如 DEV、TEST、REPORT 等。

以下是使用SnapCenter从 Data Guard 中的托管物理备用数据库克隆 READ/WRITE 数据库的高级过程。有关如何设置和配置SnapCenter 的详细说明,请参阅"采用SnapCenter的混合云数据库解决方案"相关 Oracle 部分。

  1. 我们首先创建一个测试表,然后在主数据库的测试表中插入一行。然后我们将验证事务是否向下移动到待机状态并最终移动到克隆状态。

    [oracle@ip-172-30-15-45 db1]$ sqlplus / as sysdba
    
    SQL*Plus: Release 19.0.0.0.0 - Production on Thu Aug 31 16:35:53 2023
    Version 19.18.0.0.0
    
    Copyright (c) 1982, 2022, Oracle.  All rights reserved.
    
    
    Connected to:
    Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
    Version 19.18.0.0.0
    
    SQL> alter session set container=db1_pdb1;
    
    Session altered.
    
    SQL> create table test(
      2  id integer,
      3  dt timestamp,
      4  event varchar(100));
    
    Table created.
    
    SQL> insert into test values(1, sysdate, 'a test transaction on primary database db1 and ec2 db host: ip-172-30-15-45.ec2.internal');
    
    1 row created.
    
    SQL> commit;
    
    Commit complete.
    
    SQL> select * from test;
    
            ID
    ----------
    DT
    ---------------------------------------------------------------------------
    EVENT
    --------------------------------------------------------------------------------
             1
    31-AUG-23 04.49.29.000000 PM
    a test transaction on primary database db1 and ec2 db host: ip-172-30-15-45.ec2.
    internal
    
    SQL> select instance_name, host_name from v$instance;
    
    INSTANCE_NAME
    ----------------
    HOST_NAME
    ----------------------------------------------------------------
    db1
    ip-172-30-15-45.ec2.internal
  2. 将 FSx 存储集群添加到 `Storage Systems`在SnapCenter中使用 FSx 集群管理 IP 和 fsxadmin 凭据。

    屏幕截图显示了 GUI 中的此步骤。

  3. 将 AWS ec2-user 添加到 Credential`在 `Settings

    屏幕截图显示了 GUI 中的此步骤。

  4. 添加备用 EC2 DB 实例并将 EC2 DB 实例克隆到 Hosts

    屏幕截图显示了 GUI 中的此步骤。

    备注 克隆的 EC2 DB 实例应该安装和配置类似的 Oracle 软件堆栈。在我们的测试用例中,网格基础设施和 Oracle 19C 已安装并配置,但没有创建数据库。
  5. 创建针对离线/挂载完整数据库备份定制的备份策略。

    屏幕截图显示了 GUI 中的此步骤。

  6. 应用备份策略来保护备用数据库 `Resources`选项卡。

    屏幕截图显示了 GUI 中的此步骤。

  7. 单击数据库名称以打开数据库备份页面。选择用于数据库克隆的备份并单击 `Clone`按钮启动克隆工作流程。

    屏幕截图显示了 GUI 中的此步骤。

  8. 选择 `Complete Database Clone`并将克隆实例命名为 SID。

    屏幕截图显示了 GUI 中的此步骤。

  9. 选择克隆主机,该主机托管从备用数据库克隆的数据库。接受数据文件、控制文件和重做日志的默认值。克隆主机上将创建两个 ASM 磁盘组,与备用数据库上的磁盘组相对应。

    屏幕截图显示了 GUI 中的此步骤。

  10. 基于操作系统的身份验证不需要数据库凭证。将 Oracle 主目录设置与克隆 EC2 数据库实例上的配置进行匹配。

    屏幕截图显示了 GUI 中的此步骤。

  11. 如果需要,更改克隆数据库参数,并指定在克隆之前运行的脚本(如果有)。

    屏幕截图显示了 GUI 中的此步骤。

  12. 输入克隆后运行的SQL。在演示中,我们执行命令来关闭 dev/test/report 数据库的数据库存档模式。

    屏幕截图显示了 GUI 中的此步骤。

  13. 如果需要,配置电子邮件通知。

    屏幕截图显示了 GUI 中的此步骤。

  14. 查看摘要,单击 `Finish`开始克隆。

    屏幕截图显示了 GUI 中的此步骤。

  15. 监视克隆作业 `Monitor`选项卡。我们观察到克隆一个数据库卷大小约为 300GB 的数据库大约需要 8 分钟。

    屏幕截图显示了 GUI 中的此步骤。

  16. 从SnapCenter验证克隆数据库,该数据库会立即在 `Resources`克隆操作后立即标签。

    屏幕截图显示了 GUI 中的此步骤。

  17. 从克隆 EC2 实例查询克隆数据库。我们验证了主数据库中发生的测试事务已经遍历到克隆数据库。

    [oracle@ip-172-30-15-126 ~]$ export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dev
    [oracle@ip-172-30-15-126 ~]$ export ORACLE_SID=db1dev
    [oracle@ip-172-30-15-126 ~]$ export PATH=$PATH:$ORACLE_HOME/bin
    [oracle@ip-172-30-15-126 ~]$ sqlplus / as sysdba
    
    SQL*Plus: Release 19.0.0.0.0 - Production on Wed Sep 6 16:41:41 2023
    Version 19.18.0.0.0
    
    Copyright (c) 1982, 2022, Oracle.  All rights reserved.
    
    
    Connected to:
    Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
    Version 19.18.0.0.0
    
    SQL> select name, open_mode, log_mode from v$database;
    
    NAME      OPEN_MODE            LOG_MODE
    --------- -------------------- ------------
    DB1DEV    READ WRITE           NOARCHIVELOG
    
    SQL> select instance_name, host_name from v$instance;
    
    INSTANCE_NAME
    ----------------
    HOST_NAME
    ----------------------------------------------------------------
    db1dev
    ip-172-30-15-126.ec2.internal
    
    SQL> alter session set container=db1_pdb1;
    
    Session altered.
    
    SQL> select * from test;
    
            ID
    ----------
    DT
    ---------------------------------------------------------------------------
    EVENT
    --------------------------------------------------------------------------------
             1
    31-AUG-23 04.49.29.000000 PM
    a test transaction on primary database db1 and ec2 db host: ip-172-30-15-45.ec2.
    internal
    
    
    SQL>

这完成了从 FSx 存储上的 Data Guard 中的备用数据库克隆和验证新的 Oracle 数据库,用于 DEV、TEST、REPORT 或任何其他用例。可以从 Data Guard 中的同一个备用数据库克隆多个 Oracle 数据库。