What You See Is What You Get Element

如何在 Oracle 云上故障切换并恢复 Oracle 数据库

  

作者:Joel Pérez 和 Skant Gupta

在本文中,我们将介绍如何在 Oracle 云上故障切换并恢复 Oracle 数据库。

:要使用本文中介绍的操作步骤,您需要两个 Oracle 云数据库实例。此外,这些操作步骤是在 Oracle Database 11g 上执行的;但它们应当适用于更高版本,例如 Oracle Database 12c 第 1 版和第 2 版。

创建主数据库实例

  1. 登录到您的 Oracle 云服务帐户。然后转至 Oracle Database Cloud Service 页面,创建一个新服务:

    - 在 Service Name 中,输入 Primary
    - 从 Service Level 列表中,选择 Oracle Database Cloud Service
    - 从 Metering Frequency 列表中,选择适合您环境的频率。
    - 从 Software Release 列表中,选择 Oracle Database 11g Release 2
    - 从 Software Edition 列表中,选择 Enterprise Edition
    - 从 Database Type 列表中,选择 Single Instance

    然后,单击 Next 继续。

    图 1 创建新服务

    图 1.创建新服务

  2. 在 Service Details 屏幕上,执行以下操作:

    - 在 DB Name (SID) 中,输入 ORCL
    - 设置您的管理密码并确认密码(这将是您的 sys 密码)。
    - 在 Usable Database Storage (GB) 中,输入 25
    - 从 Compute Shape 列表中,选择 OC3 -1 OCPU, 7.5GB RAM(这是最低要求)。
    - 在 SSH Public Key 中,输入 rsa-key-20170111.pub

    然后,单击 Next 继续。

    图 2 指定服务详细信息

    图 2.指定服务详细信息

  3. 最后,检查配置并单击 Create 创建主云数据库。

    图 3 创建主云数据库实例

    图 3.创建主云数据库实例

    几分钟后,主云数据库实例已成功创建。

    图 4 主数据库已创建

    图 4.主数据库已创建

  4. 单击服务名称 (Primary) 打开数据库的主页面。

    图 5 主数据库的主页面

    图 5.主数据库的主页面

  5. 在尝试连接到云端的主数据库实例之前,您必须启用 dblistener 访问规则。执行以下操作:

    a.打开数据库服务,从菜单中选择 Access Rules

    图 6 选择 Access Rules 项目

    图 6.选择 Access Rules 项目

    b.对于 ora_p2_dblistener 规则,从 Actions 菜单中选择 Enable

    图 7 启用 ora_p2_dblistener

    图 7.启用 ora_p2_dblistener 规则

创建备用数据库实例

  1. 登录到您的 Oracle 云服务帐户。然后转至 Oracle Database Cloud Service 页面,创建一个新服务:

    - 在 Service Name 中,输入 Standby
    - 从 Service Level 列表中,选择 Oracle Database Cloud Service
    - 从 Metering Frequency 列表中,选择适合您环境的频率。
    - 从 Software Release 列表中,选择 Oracle Database 11g Release 2
    - 从 Software Edition 列表中,选择 Enterprise Edition
    - 从 Database Type 列表中,选择 Single Instance

    然后,单击 Next 继续。

    图 8 创建另一个新服务

    图 8.创建另一个新服务

  2. 在 Service Details 屏幕上,执行以下操作:

    - 在 DB Name (SID) 中,输入 ORCL
    - 设置您的管理密码并确认密码(这将是您的 sys 密码)。
    - 在 Usable Database Storage (GB) 中,输入 25
    - 从 Compute Shape 列表中,选择 OC3 -1 OCPU, 7.5GB RAM(这是最低要求)。
    - 在 SSH Public Key 中,输入 rsa-key-20170111.pub

    单击 Next 继续。

    :此虚拟数据库随后会被删除。

    图 9 指定服务详细信息

    图 9.指定服务详细信息

  3. 最后,检查配置并单击 Create 创建备用云数据库。

    图 10 创建备用数据库实例

    图 10.创建备用云数据库实例

    几分钟后,备用云数据库实例已经成功创建。

    图 11 备用数据库已创建

    图 11.备用数据库已创建

  4. 单击服务名称 (Standby) 打开数据库的主页面。

    图 12 备用数据库主页面

    图 12.备用数据库的主页面

  5. 在尝试连接到云端的备用实例之前,您必须启用 dblistener 访问规则。执行以下操作:

    a.打开数据库服务,从菜单中选择 Access Rules

    图 13 选择 Access Rules

    图 13.选择 Access Rules 项目

    b.对于 ora_p2_dblistener 规则,从 Actions 菜单中选择 Enable

    图 14 启用 ora_p2_dblistener

    图 14.启用 ora_p2_dblistener 规则

  6. 打开 PuTTY 可执行文件的两个不同实例,使用 SSH 连接到两台机器。

    图 15 使用 PuTTY 连接到两台机器

    图 15.使用 PuTTY 连接到两台机器

    :在下图中,主实例显示为黑色背景,备用实例显示为黄色背景。

  7. 检查每个服务器上的主机名和 pmon 进程。

    图 16 检查主机名

    图 16.检查主机名和 pmon 进程

  8. 删除默认的备用数据库。

    图 17 删除备用数据库

    图 17.删除备用数据库

    在接下来的步骤中,您将手动重新创建备用数据库

  9. listener.ora 文件中配置备用实例静态注册。

    此外,由于您需要在接下来的步骤中配置 Data Guard 代理,因此请在主服务器和备用服务器上的 listener.ora 文件中为其命令行界面 (DGMGRL) 添加一个静态条目。(Data Guard 代理是 Oracle Database 企业版提供的一个分布式管理框架。)

    SID_LIST_LISTENER =
        (SID_LIST =
          (SID_DESC =
            (GLOBAL_DBNAME = STBY_DGMGRL)
            (ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)
            (SID_NAME = STBY)
         )
         (SID_LIST =
           (SID_DESC =
            (GLOBAL_DBNAME = STBY)
            (ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)
            (SID_NAME = STBY)
         )
    )
    
    LISTENER =
      (DESCRIPTION_LIST =
        (DESCRIPTION =
          (ADDRESS = (PROTOCOL = TCP)(HOST = Standby.compute-aeetisalat78358.oraclecloud.internal)(PORT = 1521))
          (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
        )
      )
    


    图 18 配置监听器

    图 18.配置 listener.ora 文件

  10. 现在,重新启动监听器。

    图 19 重新启动监听器

    图 19.重新启动监听器

  11. 使用主服务器和备用服务器的公共 IP 地址配置 tnsnames.ora 文件。配置完地址之后,就可以在控制台上看到它们。

    图 20 验证配置

    图 20.验证 tnsnames.ora 文件的配置

  12. 确保 tnsping 命令在两端均有效。

    图 21 运行 tnsping 命令

    图 21.运行 tnsping 命令

  13. 在备用服务器上创建 pfile 和密码文件。同时,为备用数据库创建必要的目录。

    图 22 创建目录

    图 22.在备用服务器上创建目录

  14. 在主服务器上,设置创建备用数据库所需的以下参数:

    ALTER SYSTEM SET LOG_ARCHIVE_CONFIG = 'DG_CONFIG=(ORCL,STBY)'SCOPE=BOTH;
    ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/archive
    VALID_FOR=(ONLINE_LOGFILES, ALL_ROLES)DB_UNIQUE_NAME=ORCL';
    ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=STBY LGWR ASYNC AFFIRM
    VALID_FOR=(ONLINE_LOGFILES, PRIMARY_ROLE) DB_UNIQUE_NAME=STBY';
    ALTER SYSTEM SET FAL_SERVER =STBY SCOPE=BOTH;
    ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT = AUTO SCOPE = BOTH;
    ALTER DATABASE FORCE LOGGING;
    
  15. 使用 nomount 选项和 pfile 子句启动备用数据库。然后,在主服务器中,使用 Oracle Recovery Manager (Oracle RMAN) rman target 命令检查两个连接。

    图 23 启动备用数据库

    图 23.启动备用数据库并检查连接

  16. 在主服务器中,使用 Oracle RMAN duplicate 命令配置备用数据库实例。

    DUPLICATE TARGET DATABASE
    FOR STANDBY
    FROM ACTIVE DATABASEDORECOVER
    SPFILE
    set
    control_files='/u02/app/oracle/oradata/STBY/control01.ctl','/u03/app/oracle/fast_recovery_area/STBY/control02.ctl'
    SET db_unique_name='STBY' COMMENT 'Is standby'
    SET LOG_ARCHIVE_DEST_2='SERVICE=ORCLASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)DB_UNIQUE_NAME=ORCL'
    SET FAL_SERVER='ORCL' COMMENT 'Is primary'
    set db_recovery_file_dest='/u01/app/'
    set db_file_name_convert='/ORCL/','/STBY/'
    set log_file_name_convert='/ORCL/','/STBY/'
    NOFILENAMECHECK;
    


    等待一段时间之后,备用数据库便会成功创建并以挂载状态运行。

    图 24 备用数据库已运行

    图 24.备用数据库以挂载状态运行

  17. 现在,以只读模式启动备用数据库并开始恢复。同时确认物理数据库功能是否正常。

    在主服务器上:

    create table test as select * from dict;
    


    在备用服务器上:

    alter database open;
    
    ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=STBY';
    
    ALTER SYSTEM SET LOG_ARCHIVE_DEST_2= 'SERVICE=ORCL LGWR ASYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES, PRIMARY_ROLE) DB_UNIQUE_NAME=ORCL' scope=both;
    
    recover managed standby database using current logfile disconnect;
    


    图 25 打开主数据库

    图 25.打开备用数据库并开始恢复

在未启用闪回技术的情况下手动故障切换至备用数据库

故障切换是在生产(主)数据库发生故障时激活备用数据库的过程,以便尽可能降低数据丢失的风险。这是一个不可逆的过程。启用故障切换流程之后,备用数据库会切换作为主数据库运行,而您需要重新创建备用数据库。

在一种最糟糕的情况下,当 Data Guard 主数据库不可用于生产环境时,您可以通过以下步骤将备用数据库激活为主生产数据库。

  1. 在备用数据库中,运行以下 SQL 语句:

    recover managed standby database cancel;
    recover managed standby database finish;
    alter database activate standby database;
    startup force
    


    图 26 激活备用数据库

    图 26.激活备用数据库

  2. 由于我们在两端都未启用闪回技术,因此需要手动将之前的主数据库重新创建为物理备用数据库。

    图 27 重新创建之前的主数据库

    图 27.手动重新创建之前的主数据库

  3. 以“nomount”状态启动之前的主数据库。然后,在备用机器机中运行 Oracle RMAN duplicate 命令来恢复它:

    duplicate target database for standby from active database nofilenamecheck;
    


    图 28 启动之前的主数据库

    图 28.启动之前的主数据库并恢复它

    等待一段时间之后,之前的主数据库会被重新创建为备用数据库,并以挂载状态运行。

    图 29 挂载状态的主数据库

    图 28.之前的主数据库以挂载状态运行

  4. 现在,以只读模式启动备用数据库并开始恢复。同时确认物理数据库功能是否正常。

    在主服务器上:

    SQL>  alter database open read only;
    
    SQL> recover managed standby database using current logfile disconnect;
    
    SQL> Select count(*) from test;
    
      COUNT(*)
    ----------
             0
    
    SQL> select name,db_unique_name,database_role,open_mode from v$database;
    
    
    NAME      DB_UNIQUE_NAME         DATABASE_ROLE      OPEN_MODE
    
    --------- ------------------------------ ---------------- --------------------
    
    ORCL      ORCL              PHYSICAL STANDBY      READ ONLY WITH APPLY
    


    在备用服务器上:

    SQL> Select count(*) from test;
    
      COUNT(*)
    ----------
          2666
    
    SQL> delete from test;
    
    2666 rows deleted.
    
    SQL> commit;
    
    Commit complete.
    
    SQL> Select count(*) from test;
    
      COUNT(*)
    ----------
             0
    


    图 30 打开备用数据库

    Figure 30.打开备用数据库并开始恢复

通过 Data Guard 代理执行故障切换后,使用闪回技术恢复备用数据库

如今,硬件崩溃已经是一种非常普遍的现象。因此,为 Data Guard 创建一个灾难恢复 (DR) 配置对于任何大小的数据库都是非常有帮助的。但是,数据库的大小决定了 DBA 应当使用什么样的工具来重新创建主数据库并设置 DR 配置。

如果数据库非常小,那么使用 Oracle RMAN duplicate 命令执行简单的“冷拷贝”就足够了。然而,当涉及庞大的数据仓库或数据集市时,这种方式就太耗时了。因此,建议使用 Oracle 数据库的 Oracle 闪回数据库功能来恢复备用数据库。

  1. 在主服务器上,挂载数据库、配置闪回保留、启动 Oracle 闪回数据库功能并打开数据库,具体运行的语句如下:

    SHUTDOWN IMMEDIATE;
    STARTUP MOUNT;
    ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE=2g scope=both;
    ALTER SYSTEM SET DB_RECOVERY_FILE_DEST='/u01/app/' scope=both;
    ALTER SYSTEM SET DB_FLASHBACK_RETENTION_TARGET=240;
    ALTER DATABASE FLASHBACK ON;
    ALTER DATABASE OPEN;
    
  2. 在备用机器上,取消恢复、挂载数据库、配置闪回保留、启用 Oracle 闪回数据库功能、以只读模式打开数据库并开始恢复过程,具体运行的语句如下:

    ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
    STARTUP FORCE MOUNT;
    alter system set DB_RECOVERY_FILE_DEST_SIZE=2g scope=both;
    alter system set db_recovery_file_dest='/u01/app/' scope=both;
    ALTER SYSTEM SET DB_FLASHBACK_RETENTION_TARGET=240;
    ALTER SYSTEM FLASHBACK ON;
    ALTER DATABASE OPEN READ ONLY;
    recover managed standby database using current logfile disconnect from session;
    


    图 31 启用闪回的结果

    图 31.在两个机器上启用闪回技术的结果

    接下来,我们将配置 Data Guard 代理。

    主数据库服务器和备用数据库服务器的详细信息如下:

    主服务器:Primary.compute-aeetisalat78358.oraclecloud.internal
    数据库:ORCL

    备用服务器:StandBy-1.compute-aeetisalat78358.oraclecloud.internal
    数据库:STBY1
      
  3. 在主数据库服务器和备用数据库服务器上,启动 Data Guard 代理进程:

    a.通过将 DG_BROKER_START 参数的值设置为 TRUE 来启用代理进程。

    ALTER SYSTEM SET DG_BROKER_START=TRUE SCOPE=BOTH;
    


    b.确保两个服务器上的 listener.ora 文件都包含一条针对 DGMGRL 命令行界面的静态条目。(这是之前在第 9 步中添加的。)

    c.在主服务器上,运行以下语句,创建 Data Guard 代理配置:

    DGMGRL> CREATE CONFIGURATION 'Cloud DG' as PRIMARY DATABASE IS'ORCL' CONNECT
    IDENTIFIER IS 'ORCL';
    Configuration "CloudDG" created with primary database "ORCL"
    DGMGRL> show CONFIGURATION
    Configuration - CloudDG
    
            Protection Mode :MaxPerformance
            Members:
            ORCL - Primary database
    
    Fast-Start Failover:DISABLED
    
    Configuration Status:
    DISABLED
    


    d.运行以下语句,将备用数据库添加到配置中:

    DGMGRL> ADD DATABASE 'STBY' as CONNECT IDENTIFIER IS 'STBY';
    Database "STBY" added
    
    DGMGRL> show CONFIGURATION
    Configuration - CloudDG
    
    Protection Mode :MaxPerformance
    Databases:
         ORCL - Primary database
         STBY - Physical standby database
    
    Fast-Start Failover:DISABLED
    
    Configuration Status:
    DISABLED
    


    e.运行以下语句,启用配置:

    DGMGRL> enable CONFIGURATION
    Enabled.
    DGMGRL> show CONFIGURATION
    
    Configuration - CloudDG
    
     Protection Mode: MaxPerformance
     Databases:
      ORCL - Primary database
      STBY - Physical standby database
    
    Fast-Start Failover: DISABLED
    
    Configuration Status:
    SUCCESS
    


    图 32 启用代理的结果

    图 32.启用代理的结果

  4. 现在,要继续此模拟,我们需要让主数据库崩溃。

    图 33 主数据库的状态

    图 33.主数据库崩溃之后的状态

  5. 现在,运行以下命令,故障切换至备用服务器:

    DGMGRL> failover to 'STBY'
    Performing failover NOW, please wait…
    Failover succeeded, new primary is "STBY"
    


    图 34 执行故障切换

    图 34.执行故障切换

    :现在,备用数据库已成为主数据库。

  6. 恢复数据库。

    由于我们已经配置了 Oracle 闪回数据库,因此您可以使用以下命令恢复数据库,而无需还原备份:

    DGMGRL> reinstate database 'ORCL';
    


    图 35 恢复数据库

    图 35.恢复数据库

    否则,我们需要配置闪回数据库功能才能自动恢复数据库。如图 35 所示,恢复任务失败,因为未配置闪回功能通过 Reinstate Database <数据库名称> 命令自动恢复数据库。

  7. 现在,我们将返回原始配置。执行切换操作,如图 36 所示。

    图 36 执行切换操作

    图 36.执行切换操作

总结

可以看到,无论是否使用 Oracle 闪回数据库功能,在云平台上执行故障切换都是一个简便易行的过程。

我们希望本文能为您提供一些帮助,欢迎继续阅读本专栏关于 Oracle 云的后续文章。

关于作者

Joel Pérez 是一位资深 DBA 和 Oracle ACE 总监,同时还是 Oracle 高可用性架构、Oracle 数据库云管理以及 Oracle Database 11g 和 12c 领域的 Oracle 认证大师。他在 Oracle 技术领域拥有超过 17 年的实践经验,致力于从事云、高可用性 (HA)、灾难恢复、升级、复制以及与 Oracle 数据库相关的大部分领域的设计和实施工作。目前,他在云和恩墨(北京)信息技术有限公司担任云技术、Oracle 高可用架构和高可用性领域的首席技术专家和架构师。

Skant Gupta 是 Oracle Database 12c 的 Oracle 认证云专家,Oracle Database 11g 中的 Oracle Real Application Clusters (Oracle RAC) 的 Oracle 认证专家以及 Oracle Database 10g、11g 和 12c 的 Oracle 认证专家。他目前任职于英国的 Vodafone Technology,此前曾在迪拜的 Etisalat 担任高级 DBA。他拥有六年的 Oracle 技术经验,主要致力于云、数据库和高可用性解决方案、Oracle WebLogic Suite 和 Oracle GoldenGate。他经常在全球各地的 Oracle 用户组活动上发表演讲,最近刚在美国、阿联酋和印度的活动上发表了演讲。