准备 Data Guard 的主数据库

Data Guard 需要一个主数据库和至少一个备用数据库才能正常运行。在裸金属解决方案上设置 Data Guard 之前,请先创建主数据库

本指南中使用了以下示例:

数据库唯一名称 服务器主机名 RAC 实例名称 角色
DBDG_SITE1 site1db2site1db1 DBDG_SITE12DBDG_SITE11 主要
DBDG_SITE2 site2db2site2db1 DBDG_SITE22DBDG_SITE21 备用实例

本指南中运行 Oracle 的裸金属解决方案服务器使用以下环境变量进行配置:

环境变量名称
ORACLE_BASE /apps/oracle/oracle_base
ORACLE_HOME /apps/oracle/19.0.0/db_home1

您可能需要根据您的设置修改环境变量路径。

设置主数据库

  1. 登录托管主数据库的第一个裸金属解决方案服务器。

  2. /etc/oratab 文件中添加一个条目,以便 oraenv 命令可以为主数据库设置环境变量。修改实例名称以与每个节点上正在运行的实例匹配,并指定 Oracle 数据库主目录的完整路径:

    DBDG_SITE11:ORACLE_HOME:N
    
  3. 设置 ORACLE_SID 环境变量,以便连接到主数据库:

    source oraenv <<< "DBDG_SITE11"
    

    您应该会收到响应 The Oracle base has been set to /apps/oracle/oracle_base

配置数据库日志记录并启用闪回数据库

  1. 启动 SQL*Plus,然后启用 force logging,以便记录添加到数据库的 nologging 表空间:

    sqlplus / as sysdba
    
    ALTER DATABASE FORCE LOGGING;
    
  2. 验证 archivelog modeflashback database 是否均已启用:

    ARCHIVE LOG LIST;
    SELECT LOG_MODE, FLASHBACK_ON FROM V$DATABASE;
    

    如果 archivelog modeflashback database 处于禁用状态,请使用以下 SQL 命令启用它们:

    1. 停止聚簇数据库,以便进行所需的更改:

       srvctl stop database -d 
      
    2. 运行所需的 SQL 命令以启用 archivelog modeflashback database

       STARTUP MOUNT;
       ALTER DATABASE ARCHIVELOG;
       ALTER DATABASE FLASHBACK ON;
       ALTER SYSTEM SET DB_FLASHBACK_RETENTION_TARGET=1440 SID='*' SCOPE=BOTH;
       ALTER DATABASE OPEN;
       SHUTDOWN IMMEDIATE;
       EXIT;
      
    3. 再次启动聚簇数据库:

       srvctl start database -d DBDG_SITE1
      

为 Data Guard 准备数据库

  1. 登录托管主数据库的第一个裸金属解决方案服务器,并设置 ORACLE_SID 环境变量,以便连接到主数据库:

    source oraenv <<< "DBDG_SITE11"
    

    您应该会收到响应 The Oracle base has been set to /apps/oracle/oracle_base

  2. 启动 SQL*Plus,然后修改 Data Guard 配置和服务所需的数据库初始化参数:

    sqlplus / as sysdba
    
    ALTER SYSTEM SET LOG_ARCHIVE_FORMAT='%t_%s_%r.arc' SID='*' SCOPE=SPFILE;
    ALTER SYSTEM SET LOG_ARCHIVE_MAX_PROCESSES=8 SID='*' SCOPE=BOTH;
    ALTER SYSTEM SET REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE SID='*' SCOPE=SPFILE;
    ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=AUTO SID='*' SCOPE=BOTH;
    
  3. 检查数据库中是否存在备用重做日志。每个线程的备用重做日志组的数量必须比在线重做日志组的数量多一个。

    SELECT 'Logfile groups in thread ' || THREAD# || ': ' || COUNT(*) FROM V$LOG GROUP BY THREAD#
    UNION
    SELECT 'Standby logfile groups in thread ' || THREAD# || ': ' || COUNT(*) FROM V$STANDBY_LOG GROUP BY THREAD#;
    

    在以下示例中,每个线程有 4 个在线重做日志,并且尚未创建任何备用重做日志组。由于有 4 个在线重做日志组,因此必须为每个线程创建 5 个备用重做日志组:

    Logfile groups in thread 1: 4
    Logfile groups in thread 2: 4
    
  4. 如果存在足够的备用重做日志组,则可跳过此步骤。备用重做日志组的大小必须与每个在线重做日志组的大小相同。使用以下 PL/SQL 代码创建必要数量的备用重做日志组:

    SET FEEDBACK OFF
    SET SERVEROUTPUT ON
    DECLARE
      CURSOR cur_thread IS
        SELECT THREAD# THREAD, COUNT(*) COUNT FROM V$LOG GROUP BY THREAD#;
      standbylog_count NUMBER := 0;
      standbylog_group NUMBER := 0;
      standbylog_size NUMBER := 0;
      last_group_number NUMBER;
      sqlstmt VARCHAR2(200);
    BEGIN
      SELECT MAX(GROUP#), MAX(BYTES)
    INTO last_group_number, standbylog_size
    FROM V$LOG;
      standbylog_group := last_group_number + 1;
      FOR rec_thread IN cur_thread LOOP
    standbylog_count := rec_thread.count + 1;
    FOR i IN 1..standbylog_count LOOP
      sqlstmt := 'ALTER DATABASE ADD STANDBY LOGFILE THREAD ' || rec_thread.thread || ' GROUP ' || TO_CHAR(standbylog_group) || ' SIZE ' || standbylog_size || ';';
      DBMS_OUTPUT.PUT_LINE( sqlstmt);
      standbylog_group := standbylog_group + 1;
    END LOOP;
      END LOOP;
    END;
    /
    SET FEEDBACK ON
    

    以下示例输出将指导您为这两个线程中的每个线程各创建 5 个备用重做日志组:

    ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP  9 SIZE 2147483648;
    ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 10 SIZE 2147483648;
    ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 11 SIZE 2147483648;
    ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 12 SIZE 2147483648;
    ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 13 SIZE 2147483648;
    ALTER DATABASE ADD STANDBY LOGFILE THREAD 2 GROUP 14 SIZE 2147483648;
    ALTER DATABASE ADD STANDBY LOGFILE THREAD 2 GROUP 15 SIZE 2147483648;
    ALTER DATABASE ADD STANDBY LOGFILE THREAD 2 GROUP 16 SIZE 2147483648;
    ALTER DATABASE ADD STANDBY LOGFILE THREAD 2 GROUP 17 SIZE 2147483648;
    ALTER DATABASE ADD STANDBY LOGFILE THREAD 2 GROUP 18 SIZE 2147483648;
    
  5. 验证系统是否已为您的配置正确设置备用重做日志:

    SELECT 'Logfile groups in thread ' || THREAD# || ': ' || COUNT(*) FROM V$LOG GROUP BY THREAD#
    UNION
    SELECT 'Standby logfile groups in thread ' || THREAD# || ': ' || COUNT(*) FROM V$STANDBY_LOG GROUP BY THREAD#;
    

    以下输出包含每个线程的 4 个在线重做日志组和每个线程的 5 个备用重做日志组:

    Logfile groups in thread 1: 4
    Logfile groups in thread 2: 4
    Standby logfile groups in thread 1: 5
    Standby logfile groups in thread 2: 5
    
  6. 退出 SQL*Plus:

    EXIT;
    

将数据库参数和密码文件复制到备用服务器

  1. 创建数据库参数文件并将其复制到备用服务器:

    1. 为备用数据库参数文件 (pfile) 创建一个文件夹:

      mkdir /home/oracle/backup
      
    2. 启动 SQL*Plus,然后创建备用数据库 pfile

      sqlplus / as sysdba
      
      CREATE PFILE='/home/oracle/backup/initDBDG_SITE21.ora' FROM SPFILE;
      
    3. 退出 SQL*Plus,然后将 pfile 复制到备用位置的第一个裸金属解决方案服务器:

      EXIT;
      
      scp /home/oracle/backup/initDBDG_SITE21.ora ORACLE_USERNAME@site2db1:/apps/oracle/19.0.0/db_home1/dbs/initDBDG_SITE21.ora
      
  2. 确保安全保存 SYS 远程登录密码。如果您不知道密码,请重置密码

  3. 将密码文件复制到备用集群:

    1. 使用 srvctl 命令获取密码文件的位置:

      srvctl config database -db DBDG_SITE1 | grep -i password
      

      以下输出显示了 ASM 中密码文件存储区的位置:

        Password file: +DATA/DBDG_SITE1/PASSWORD/pwdDBDG_SITE1.287.1086459663
      
    2. 使用 asmcmd 命令在本地文件系统上创建密码文件的临时副本:

      asmcmd cp +DATA/DBDG_SITE1/PASSWORD/pwdDBDG_SITE1.287.1086459663 /tmp/orapwDBDG_SITE21
      
    3. 将密码文件复制到备用位置的第一个裸金属解决方案服务器,然后从主要位置的裸金属解决方案服务器中删除临时副本:

      scp /tmp/orapwDBDG_SITE21 ORACLE_USERNAME@site2db1:/apps/oracle/19.0.0/db_home1/dbs/orapwDBDG_SITE21
      rm /tmp/orapwDBDG_SITE21
      

配置数据库连接

在主数据库位置上修改每个裸金属解决方案服务器上的 $ORACLE_HOME/network/admin/tsnames.ora 文件,以更新网络服务配置。该文件中有三个条目;每个数据库对应一个条目,此外还有一个临时条目用于数据库复制过程(稍后将删除):

DBDG_SITE1 =
  (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = DBDG_SITE1_SCAN_HOSTNAME)(PORT = 1521))
      (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = DBDG_SITE1) (UR=A)
      )
  )

DBDG_SITE2 =
 (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = DBDG_SITE2_SCAN_HOSTNAME)(PORT = 1521))
      (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = DBDG_SITE2) (UR=A)
      )
  )

DBDG_SITE2_FOR_DUPLICATION =
  (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = site2db1)(PORT = 1523))
      (CONNECT_DATA =
          (SERVER = DEDICATED)
          (INSTANCE_NAME = DBDG_SITE21) (UR=A)
      )
  )

现在,主数据库已准备好在 Data Guard 配置中使用。

后续步骤

接下来,创建 Data Guard 的备用数据库