Oracle 11gR2 Data Guard 搭建 (一主一从)

发布于:2024-11-29 ⋅ 阅读:(29) ⋅ 点赞:(0)

一、环境规划

项目 主库 Primary 备库 Standby
操作系统 CentOS Linux 7.9.2009 CentOS Linux 7.9.2009
数据库版本 11.2.0.4 11.2.0.4
IP地址 192.168.10.101 192.168.10.102
db_name orcl orcl
instance_name orcl orcl
db_unique_name orcl_pri orcl_sby
tnsname orcl_pri orcl_sby
service_names(服务名) orcl orcl
提前准备 安装数据库软件、DBCA建库、监听 只安装数据库软件

‌DataGuard主从库的命名通常遵循以下规则‌(参考): ‌

主库(Primary Database)‌:通常命名为primary或pri。 ‌

备库(Standby Database)‌:通常命名为standby或sby。

说明

  • 主库和备库建议采用相同服务器配置。
  • 主库和备库建议采用相同操作系统版本。
  • 主库和备库需要采用相同数据库版本(含 PSU)。
  • db_name 相同。
  • db_unique_name 不同。

二、主库参数配置

1. 启用强制记录日志 (Force Logging)

  • 查看

    SELECT log_mode, force_logging FROM v$Database;
    
  • 启用

    ALTER DATABASE FORCE LOGGING;
    

2. 启用归档模式

  • 查看

    ARCHIVE LOG LIST;
    SELECT log_mode FROM v$database;
    
  • 启用

    SHUTDOWN IMMEDIATE;
    STARTUP MOUNT;
    ALTER SYSTEM SET log_archive_dest_1='location=/u01/archivelog/orcl';
    ALTER DATABASE ARCHIVELOG;
    ALTER DATABASE OPEN;
    

3. 配置主库监听和 TNS

监听器配置
  • 监听文件默认路径$ORACLE_HOME/network/admin/listener.ora

  • 配置静态监听,增加 SID_LIST_LISTENER 部分,然后使用 lsnrctl reload 重新加载监听器配置。

  • 示例配置

    LISTENER =
    (DESCRIPTION_LIST =
      (DESCRIPTION =
        (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
        (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.101)(PORT = 1521))
      )
    )
    SID_LIST_LISTENER =
    (SID_LIST =
      (SID_DESC =
        (GLOBAL_DBNAME = orcl) -- GLOBAL_DBNAME 对应监听里的服务名
        (SID_NAME = orcl)
        (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)
      )
    )
    ADR_BASE_LISTENER = /u01/app/oracle
    
TNS 配置
  • TNS 文件默认路径$ORACLE_HOME/network/admin/tnsnames.ora

  • 方便主备切换服务名设置相同,配置如下:

    orcl_pri =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.101)(PORT = 1521))
      (CONNECT_DATA =
        (SERVER = DEDICATED)
        (SERVICE_NAME = orcl)
      )
    )
    
    orcl_sby =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.102)(PORT = 1521))
      (CONNECT_DATA =
        (SERVER = DEDICATED)
        (SERVICE_NAME = orcl)
      )
    )
    

4. 配置主库参数

  • 修改归档文件名后缀为 .arc(可选)

    ALTER SYSTEM SET log_archive_format='%t_%s_%r.arc' SCOPE=SPFILE;
    
  • 检查 db_unique_name

    SHOW PARAMETER db_unique_name;
    ALTER SYSTEM SET db_unique_name='orcl_pri' SCOPE=SPFILE;
    
  • 修改 log_archive_config 参数,括号中为主备库的 db_unique_name

    ALTER SYSTEM SET log_archive_config='DG_CONFIG=(orcl_pri,orcl_sby)' SCOPE=BOTH;
    
  • 配置 log_archive_dest_1,主库归档位置

    ALTER SYSTEM SET log_archive_dest_1='LOCATION=/u01/archivelog/orcl VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl_pri' SCOPE=BOTH;
    
  • 配置 log_archive_dest_2,备库归档位置,采用 LGWR 异步传输方式:

    ALTER SYSTEM SET log_archive_dest_2='SERVICE=orcl_sby LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl_sby' SCOPE=BOTH;
    
  • 修改归档日志进程的最大数量(可选)

    ALTER SYSTEM SET log_archive_max_processes=30 SCOPE=BOTH;
    SHOW PARAMETER log_archive_max_processes;
    
  • 检查数据库口令文件的使用模式

    SHOW PARAMETER remote_login_passwordfile;
    ALTER SYSTEM SET remote_login_passwordfile=EXCLUSIVE SCOPE=SPFILE;
    
  • 修改 /etc/hosts 文件,追加主备库 IP 与主机名对应关系,备库同样配置:

    echo "192.168.10.101 db1" >> /etc/hosts
    echo "192.168.10.102 db2" >> /etc/hosts
    
  • 修改 db_file_name_convert 参数,主备库数据文件名称和路径对应关系:

    ALTER SYSTEM SET db_file_name_convert='/oracle/app/oracle/oradata/orcl_sby', '/oradata/datafile/orcl/' SCOPE=SPFILE;
    
  • 修改 log_file_name_convert 参数,主备库日志文件名称和路径对应关系:

    ALTER SYSTEM SET log_file_name_convert='/u01/app/oracle/oradata/orcl_sby', '/oradata/datafile/orcl/' SCOPE=SPFILE;
    
  • 设置 standby_file_management 为自动

    ALTER SYSTEM SET standby_file_management=auto;
    
  • 修改 fal_clientfal_server

    ALTER SYSTEM SET fal_client='orcl_pri' SCOPE=BOTH; -- 本地 TNS
    ALTER SYSTEM SET fal_server='orcl_sby' SCOPE=BOTH; -- 备库 TNS
    

三、备库配置

1. 密码文件

  • 主库和备库的 SYS 密码必须一致

    • 方式 1:使用 orapwd 设置相同密码:

      orapwd file=orapworcl password=<password>
      
    • 方式 2:将主库密码文件复制到备库 $ORACLE_HOME/dbs 目录下,并修改密码文件名为 orapworcl

      scp <主库密码文件> <备库用户>@<备库IP>:/u01/app/oracle/product/11.2.0/db_1/dbs/orapworcl
      

2. 设置 pfile 文件并启动到 nomount 状态

  • dbs 目录下创建 initorcl.ora 并参考主库添加参数:

    db_name='orcl'
    service_names='orcl'
    db_unique_name='orcl_sby'
    pga_aggregate_target=191889408 -- 设置跟主库一样
    sga_target=575668224 -- 设置跟主库一样
    audit_file_dest='/u01/app/oracle/admin/orcl/adump' -- 创建这个路径
    compatible='11.2.0.4.0' -- 兼容性参数 主备库要保持一致
    log_archive_format='%t_%s_%r.arc'
    control_files='/u01/app/oracle/oradata/orcl/control01.ctl', '/u01/app/oracle/oradata/orcl/control02.ctl' -- 注意修改文件路径中的实例名
    log_archive_config='DG_CONFIG=(orcl_pri,orcl_sby)'
    log_archive_dest_1='LOCATION=/u01/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl_sby'
    log_archive_dest_2='SERVICE=orcl_pri LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl_pri' -- 日志传输为 LGWR ASYNC 异步传输
    db_file_name_convert='/oradata/datafile/orcl/', '/u01/app/oracle/oradata/orcl' -- 前面是对方的,后面是本地的
    log_file_name_convert='/oradata/datafile/orcl/', '/u01/app/oracle/oradata/orcl'
    fal_client='orcl_sby' -- 该参数与主库设置相反
    fal_server='orcl_pri' -- 该参数与主库设置相反
    standby_file_management='AUTO'
    
  • 使用刚才编辑的 pfile 创建 spfile:

    STARTUP NOMOUNT PFILE='/u01/app/oracle/product/11.2.0/db_1/dbs/initorcl.ora';
    CREATE SPFILE FROM PFILE;
    
  • 关闭数据库正常启动到 nomount 状态:

    SHUTDOWN IMMEDIATE;
    STARTUP NOMOUNT;
    
  • 查看是否使用 spfile 启动:

    SHOW PARAMETER spfile;
    

3. 备库配置监听与 TNS

监听器配置
  • 监听文件默认路径$ORACLE_HOME/network/admin/listener.ora

  • 配置静态监听,增加 SID_LIST_LISTENER 部分,然后使用 lsnrctl reload 重新加载监听器配置。

  • 示例配置

    LISTENER =
    (DESCRIPTION_LIST =
      (DESCRIPTION =
        (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
        (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.102)(PORT = 1521))
      )
    )
    SID_LIST_LISTENER =
    (SID_LIST =
      (SID_DESC =
        (GLOBAL_DBNAME = orcl)
        (SID_NAME = orcl_sby)
        (ORACLE_HOME = /oracle/app/oracle/product/11.2.0/db_1)
      )
    )
    ADR_BASE_LISTENER = /u01/app/oracle
    DIAG_ADR_ENABLED_LISTENER = OFF
    
TNS 配置
  • TNS 文件默认路径$ORACLE_HOME/network/admin/tnsnames.ora

  • 方便主备切换服务名设置相同,配置如下:

    ORCL_PRI =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.101)(PORT = 1521))
      (CONNECT_DATA =
        (SERVER = DEDICATED)
        (SERVICE_NAME = orcl)
      )
    )
    
    ORCL_SBY =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.102)(PORT = 1521))
      (CONNECT_DATA =
        (SERVER = DEDICATED)
        (SERVICE_NAME = orcl)
      )
    )
    

4. 测试 TNS

  • 主库和备库分别测试

    tnsping orcl_pri
    tnsping orcl_sby
    sqlplus sys/oracle@orcl_pri as sysdba
    sqlplus sys/oracle@orcl_sby as sysdba
    
  • 注意:如果出现 TNS-12543 错误,关闭防火墙再试。如果 tnsping 出现 ORA-12541 错误,检查一下 hosts 文件里面是否配置正常,备库也要配置好。

四、使用 Duplicate 创建物理 Standby

备库执行

  • 连接 RMAN 并连接辅助(auxiliary)实例,备库目前是 nomount 状态

    rman target sys/oracle@orcl_pri auxiliary sys/oracle@orcl_sby
    
  • 执行复制

    DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE NOFILENAMECHECK;
    
  • 注意

    1. 第一次 duplicate 时遇到 ORA-17628 错误,排查后发现为需要提前创建的文件夹没有创建。
    2. 之前设置过 db_file_name_convertlog_file_name_convert,这里就会按照设置的地址拷贝。

五、添加 Standby 日志组并开启同步

1. 主备库添加 Standby 日志组

  • standby 日志组数量:redo 日志组数量 + 1

  • 添加前需要查看已有的日志组号

    SELECT * FROM v$log;
    
  • 主库添加

    ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 ('/oradata/datafile/orcl/sby_redo05.log') SIZE 500M;
    ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 ('/oradata/datafile/orcl/sby_redo06.log') SIZE 500M;
    ALTER DATABASE ADD STANDBY LOGFILE GROUP 7 ('/oradata/datafile/orcl/sby_redo07.log') SIZE 500M;
    ALTER DATABASE ADD STANDBY LOGFILE GROUP 8 ('/oradata/datafile/orcl/sby_redo08.log') SIZE 500M;
    
  • 备库添加

    ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 ('/oracle/app/oracle/oradata/orcl/sby_redo05.log') SIZE 500M;
    ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 ('/oracle/app/oracle/oradata/orcl/sby_redo06.log') SIZE 500M;
    ALTER DATABASE ADD STANDBY LOGFILE GROUP 7 ('/oracle/app/oracle/oradata/orcl/sby_redo07.log') SIZE 500M;
    ALTER DATABASE ADD STANDBY LOGFILE GROUP 8 ('/oracle/app/oracle/oradata/orcl/sby_redo08.log') SIZE 500M;
    
  • 查看 standby 日志

    SELECT * FROM v$standby_log;
    
  • 打开备库

    ALTER DATABASE OPEN;
    

2. 设置同步

  • 开启实时同步(启动 MRP 进程),备库操作

    -- 开启 real time apply
    ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
    ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT; -- 简写
    
  • 开启同步,日志切换才会同步

    ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
    
  • 停止同步(关闭 MRP 进程)

    ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
    

3. 主备库检查模式

  • 查询主备库状态

    SELECT open_mode, database_role, protection_mode, protection_level FROM v$database;
    
  • 备库显示

    • open_mode:备库标识为 READ ONLY WITH APPLY,表示应用了日志。如果关闭同步则这里只有 READ ONLY
    • database_role:标识为主库还是备库,此时为物理备库。
    • protection_modeprotection_level 此时标识都是最大性能模式。

六、总结

通过以上步骤,可以成功搭建一个稳定的 Data Guard 环境,确保数据的一致性和高可用性。