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

server/2024/12/2 21:49:50/

一、环境规划

项目主库 Primary备库 Standby
操作系统CentOS Linux 7.9.2009CentOS Linux 7.9.2009
数据库版本11.2.0.411.2.0.4
IP地址192.168.10.101192.168.10.102
db_nameorclorcl
instance_nameorclorcl
db_unique_nameorcl_priorcl_sby
tnsnameorcl_priorcl_sby
service_names(服务名)orclorcl
提前准备安装数据库软件、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 环境,确保数据的一致性和高可用性。


http://www.ppmy.cn/server/146846.html

相关文章

neo4j如何存储关于liquidity structure的层次和关联结构

在 Neo4j 中存储关于流动性结构&#xff08;liquidity structure&#xff09;的层次和关联结构非常适合&#xff0c;因为 Neo4j 是一个基于图的数据库&#xff0c;能够自然地建模和存储复杂的关系和层次结构。下面是如何在 Neo4j 中设计和实现这样的数据模型的详细步骤和示例。…

[CTF/网络安全] 攻防世界 upload1 解题详析

[CTF/网络安全] 攻防世界 upload1 解题详析 考察文件上传&#xff0c;具体原理及姿势不再赘述。 姿势 在txt中写入一句话木马<?php eval($_POST[qiu]);?> 回显如下&#xff1a; 查看源代码&#xff1a; Array.prototype.contains function (obj) { var i this.…

【从零开始的LeetCode-算法】263. 丑数

丑数 就是只包含质因数 2、3 和 5 的 正 整数。 给你一个整数 n &#xff0c;请你判断 n 是否为 丑数 。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;n 6 输出&#xff1a;true 解释&#xff1a;6 2 3 示…

Javascript 图片懒加载

摘要 最近公司和第三方材料供应商对接开发了物资集采平台&#xff0c;其中有个功能需求需要展示数百张材料信息图片&#xff0c;有时页面会出现卡顿的情况&#xff0c;并使用了图片懒加载的方式进行了优化。下面把方法分享给大家一起学习。 未做优化实例 以下代码仅作为示例…

【西瓜书】决策树

决策树 决策树&#xff08;decision tree&#xff09;是一种常见的机器学习方法&#xff0c;也叫“判定树”。 根据上下文&#xff0c;决策树有时候是指学习方法&#xff0c;有时候是指学得的树。 决策树是根据树形结构来进行决策的&#xff0c;这与人类在面临决策问题时的处…

matlab2024a安装

1.开始安装 2.点击安装 3.选择安装密钥 4.接受条款 5.安装密钥 21471-07182-41807-00726-32378-34241-61866-60308-44209-03650-51035-48216-24734-36781-57695-35731-64525-44540-57877-31100-06573-50736-60034-42697-39512-63953 6 7.选择许可证文件 8.找许可证文件 9.选…

springboot340“共享书角”图书借还管理系统(论文+源码)_kaic

摘 要 随着社会的发展&#xff0c;图书借还的管理形势越来越严峻。越来越多的借阅者利用互联网获得信息&#xff0c;但图书借还信息量大。为了方便借阅者更好的获得本图书借还信息&#xff0c;因此&#xff0c;设计一种安全高效的“共享书角”图书借还管理系统极为重要。 为…

v-for产生 You may have an infinite update loop in a component render function

参考文章&#xff1a; 报错解析 [Vue warn]: You may have an infinite update loop in a component render function. 另外一个解决方法 例如: MyList 是一个数组&#xff0c;我希望将排序后的结果返回进行for循环&#xff0c;因此设计了一个myMethon函数 <div v-for"…