Oracle DG之--构建Physical Standby(一主库对应多备库)

本文介绍了一种Oracle数据库高可用方案——一主两备的Physical Standby配置方法。主库bjdb与两个备库shdb和gzdb通过特定的初始化参数实现日志归档与同步。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Oracle DG之--构建Physical Standby(一主库对应多备库)


系统环境:

操作系统: RedHat EL6

Oracle:    Oracle 10.2.0.1.0

wKioL1R25dqSqrvxAADnIlkOMXs321.jpg

      如图所示,主库为bjdb(db_unique_name),备库为shdb和gzdb。


案例分析: 

一个主库,两个备库

主库初始化参数(pfile):

[oracle@bjsrv dbs]$ cat initbj.ora 

*.audit_file_dest='/u01/app/oracle/admin/prod/adump'
*.background_dump_dest='/u01/app/oracle/admin/prod/bdump'
*.compatible='10.2.0.1.0'
*.control_files='/u01/app/oracle/oradata/prod/control01.ctl','/disk1/oradata/bj/control02.ctl','/disk2/oradata/bj/control03.ctl'
*.core_dump_dest='/u01/app/oracle/admin/prod/cdump'
*.db_block_size=8192
*.db_domain=''
*.db_file_multiblock_read_count=16
*.DB_FILE_NAME_CONVERT='/u01/app/oracle/oradata/sh','/u01/app/oracle/oradata/prod','/u01/app/oracle/oradata/gz','/u01/app/oracle/oradata/prod'
*.db_recovery_file_dest='/u01/app/oracle/flash_recovery_area'
*.db_recovery_file_dest_size=2147483648
*.instance_name='bj'
*.job_queue_processes=10
*.open_cursors=300
*.pga_aggregate_target=94371840
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=285212672
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/u01/app/oracle/admin/prod/udump'

以下参数用于DG配置:

*.db_name='prod'
*.DB_UNIQUE_NAME='bjdb'
*.FAL_CLIENT='bjdb'
*.FAL_SERVER='shdb','gzdb'

*.LOG_ARCHIVE_CONFIG='DG_CONFIG=(bjdb,shdb,gzdb)'

*.LOG_ARCHIVE_DEST_1='LOCATION=/disk3/arch_bj
  VALID_FOR=(ALL_LOGFILES,ALL_ROLES)
  DB_UNIQUE_NAME=bjdb'
  
*.LOG_ARCHIVE_DEST_2='SERVICE=shdb LGWR ASYNC
  VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) 
  DB_UNIQUE_NAME=shdb'
  
*.LOG_ARCHIVE_DEST_3='SERVICE=gzdb LGWR ASYNC
  VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)
  DB_UNIQUE_NAME=gzdb'
  
*.LOG_ARCHIVE_DEST_STATE_1='ENABLE'
*.LOG_ARCHIVE_DEST_STATE_2='ENABLE'
*.LOG_ARCHIVE_DEST_STATE_3='ENABLE'
*.log_archive_format='arch_%t_%s_%r.log'
*.LOG_ARCHIVE_MAX_PROCESSES=3

*.LOG_FILE_NAME_CONVERT='/disk1/oradata/sh','/disk1/oradata/bj','/disk2/oradata/sh','/disk2/oradata/bj','/disk1/oradata/gz','/disk1/oradata/bj','/disk2/oradata/gz','/disk2/oradata/bj'
*.STANDBY_FILE_MANAGEMENT='AUTO'


备库初始化参数pfile(shdb):

[oracle@shsrv dbs]$ cat initsh.ora 
*.audit_file_dest='/u01/app/oracle/admin/sh/adump'
*.background_dump_dest='/u01/app/oracle/admin/sh/bdump'
*.compatible='10.2.0.1.0'
*.control_files='/u01/app/oracle/oradata/sh/std_control.ctl'
*.core_dump_dest='/u01/app/oracle/admin/sh/cdump'
*.db_block_size=8192
*.db_domain=''
*.db_file_multiblock_read_count=16
*.DB_FILE_NAME_CONVERT='/u01/app/oracle/oradata/prod','/u01/app/oracle/oradata/sh','/u01/app/oracle/gz','/u01/app/oracle/oradata/sh'
*.instance_name='sh'
*.job_queue_processes=10
*.open_cursors=300
*.pga_aggregate_target=94371840
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=285212672
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/u01/app/oracle/admin/sh/udump'

以下参数用于DG配置:

*.db_name='prod'
*.DB_UNIQUE_NAME='shdb'
*.FAL_CLIENT='shdb'
*.FAL_SERVER='bjdb','gzdb'

*.LOG_ARCHIVE_CONFIG='DG_CONFIG=(bjdb,shdb,gzdb)'

*.LOG_ARCHIVE_DEST_1='LOCATION=/disk3/arch_sh
  VALID_FOR=(ALL_LOGFILES,ALL_ROLES)
  DB_UNIQUE_NAME=shdb'
  
*.LOG_ARCHIVE_DEST_2='SERVICE=bjdb LGWR ASYNC
  VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) 
  DB_UNIQUE_NAME=bjdb'
  
*.LOG_ARCHIVE_DEST_3='SERVICE=gzdb LGWR ASYNC
  VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)
  DB_UNIQUE_NAME=gzdb'
  
*.LOG_ARCHIVE_DEST_STATE_1='ENABLE'
*.LOG_ARCHIVE_DEST_STATE_2='ENABLE'
*.LOG_ARCHIVE_DEST_STATE_3='ENABLE'
*.log_archive_format='arch_%t_%s_%r.log'
*.LOG_ARCHIVE_MAX_PROCESSES=3

*.LOG_FILE_NAME_CONVERT='/disk1/oradata/bj','/disk1/oradata/sh','/disk2/oradata/bj','/disk2/oradata/sh','/disk1/oradata/gz','/disk1/oradata/sh','/disk2/oradata/gz','/disk2/oradata/sh'
*.STANDBY_FILE_MANAGEMENT='AUTO'

备库初始化参数pfile(gzdb):

[oracle@gzsrv dbs]$ cat initgz.ora 

*.audit_file_dest='/u01/app/oracle/admin/gz/adump'
*.background_dump_dest='/u01/app/oracle/admin/gz/bdump'
*.compatible='10.2.0.1.0'
*.control_files='/u01/app/oracle/oradata/gz/gzstd_control.ctl'
*.core_dump_dest='/u01/app/oracle/admin/gz/cdump'
*.db_block_size=8192
*.db_domain=''
*.db_file_multiblock_read_count=16
*.DB_FILE_NAME_CONVERT='/u01/app/oracle/oradata/prod','/u01/app/oracle/oradata/gz','/u01/app/oracle/oradata/sh','/u01/app/oracle/oradata/gz'
*.open_cursors=300
*.pga_aggregate_target=94371840
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=285212672
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/u01/app/oracle/admin/gz/udump'
*.job_queue_processes=10

以下参数用于DG配置:

*.db_name='prod'
*.DB_UNIQUE_NAME='gzdb'
*.FAL_CLIENT='gzdb'
*.FAL_SERVER='bjdb','shdb'
*.instance_name='gz'

*.LOG_ARCHIVE_CONFIG='DG_CONFIG=(bjdb,shdb,gzdb)'

*.LOG_ARCHIVE_DEST_1='LOCATION=/disk3/arch_gz
  VALID_FOR=(ALL_LOGFILES,ALL_ROLES)
  DB_UNIQUE_NAME=gzdb'
  
*.LOG_ARCHIVE_DEST_2='SERVICE=bjdb LGWR ASYNC
  VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) 
  DB_UNIQUE_NAME=bjdb'
  
*.LOG_ARCHIVE_DEST_3='SERVICE=shdb LGWR ASYNC
  VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)
  DB_UNIQUE_NAME=shdb'
  
*.LOG_ARCHIVE_DEST_STATE_1='ENABLE'
*.LOG_ARCHIVE_DEST_STATE_2='ENABLE'
*.LOG_ARCHIVE_DEST_STATE_3='ENABLE'
*.log_archive_format='arch_%t_%s_%r.log'
*.LOG_ARCHIVE_MAX_PROCESSES=3

*.LOG_FILE_NAME_CONVERT='/disk1/oradata/bj','/disk1/oradata/gz','/disk2/oradata/bj','/disk2/oradata/gz','/disk1/oradata/sh','/disk1/oradata/gz','/disk2/oradata/sh','/disk2/oradata/gz'
*.STANDBY_FILE_MANAGEMENT='AUTO'

---以上为构建一个主库2个Physical Standby的初始化参数,创建过程省略,可以参考:http://tiany.blog.51cto.com/513694/1583444 Oracle DG之--构建Physical Standby》

本文出自 “天涯客的blog” 博客,请务必保留此出处http://tiany.blog.51cto.com/513694/1583399

<think>根据用户提供的引用信息和之前的问题,我们继续分析Oracle Data Guard归档日志传输正常但数据未同步的原因。结合引用[1][2][3][4]中的关键点,以下是核心排查方向: ### 核心原因定位(基于引用) 1. **日志应用(MRP)未启动**(引用[1]明确提到): - 即使日志传输正常(LNSn进程活动),若未启动MRP进程,则日志不会被应用到数据[^1]。 - 引用[1]中操作命令: - 停止应用:`ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL` - 启动应用:`ALTER DATABASE RECOVER MANAGED STEDNBY DATABASE DISCONNECT` 2. **归档日志存在间隙(GAP)**(引用[2][3]强调): - 通过`V$ARCHIVE_GAP`视图可检查缺失的日志序列[^2][^3]。 - 即使新日志持续传输,若中间有日志丢失(如网络中断导致),会卡在缺失日志处停止应用。 3. **日志应用参数配置错误**(引用[4]说明传输机制): - 主库日志传输依赖LNSn进程(非LGWR直接传输)[^4],但需正确配置`STANDBY_FILE_MANAGEMENT`等参数才能应用日志。 4. **状态不兼容**(引用[1]隐含): - 物理需处于`MOUNT`或`READ ONLY WITH APPLY`状态(Active Data Guard)才能应用日志[^1]。 --- ### 详细排查步骤(结合引用和实战) #### 1. **确认日志应用状态**(关键步) ```sql -- 检查MRP进程状态(引用[1][2]) SELECT PROCESS, STATUS, SEQUENCE# FROM V$MANAGED_STANDBY WHERE PROCESS IN ('MRP0', 'MRP'); ``` - **正常状态**:`STATUS`应为`APPLYING_LOG`且`SEQUENCE#`持续增长。 - **异常处理**: - 若未返回记录,说明MRP未启动,执行: ```sql ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT; ``` #### 2. **检查日志序列连续性**(引用[2][3]) ```sql -- 是否存在日志间隙(GAP) SELECT * FROM V$ARCHIVE_GAP; ``` - **输出说明**: - `THREAD#`: 线程号(RAC环境需关注) - `LOW_SEQUENCE#`/`HIGH_SEQUENCE#`: 缺失的日志序列号范围。 - **处理缺失日志**: 1. 在主库定位缺失的归档日志文件: ```sql SELECT NAME FROM V$ARCHIVED_LOG WHERE THREAD#=<gap_thread> AND SEQUENCE# BETWEEN <low_seq> AND <high_seq>; ``` 2. 手动复制到归档目录。 3. 在注册日志: ```sql ALTER DATABASE REGISTER PHYSICAL LOGFILE '/path/to/archive_log_<sequence#>.arc'; ``` #### 3. **验证数据状态**(引用[1]) ```sql SELECT OPEN_MODE, DATABASE_ROLE, SWITCHOVER_STATUS FROM V$DATABASE; ``` - **要求状态**: - Oracle 11g+:`OPEN_MODE`应为`READ ONLY WITH APPLY`(启用Active Data Guard)。 - Oracle 10g:`OPEN_MODE`应为`MOUNTED`。 - **错误状态示例**:`OPEN_MODE=READ ONLY`但未启用应用(无`WITH APPLY`)。 - **修复命令**: ```sql -- 先取消恢复(若已启动) ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; -- 重启为正确模式 ALTER DATABASE OPEN READ ONLY; ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT; ``` #### 4. **检查关键参数配置**(引用[3][4]) ```sql -- 文件自动管理(避免文件缺失导致应用失败) SHOW PARAMETER STANDBY_FILE_MANAGEMENT; -- 应为 'AUTO' -- 归档路径(确认与主库传输路径匹配) SHOW PARAMETER STANDBY_ARCHIVE_DEST; -- 路径需有写入权限且磁盘空间充足 ``` - **异常处理**: - 若`STANDBY_FILE_MANAGEMENT=MANUAL`,需改为`AUTO`: ```sql ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=AUTO SCOPE=BOTH; ``` - 若路径错误或磁盘满,调整路径或清理空间。 #### 5. **检查告警日志**(终极手段) ```bash # 登录服务器 tail -100f $ORACLE_BASE/diag/rdbms/<dbname_standby>/<instance_name>/trace/alert_<instance_name>.log ``` - **关键错误**: - `ORA-00308`: 无法打开归档日志(文件损坏或路径错误) - `ORA-19502`: 写数据文件失败(存储问题) - `ORA-600 [3020]`: 块校验错误(数据文件不致) --- ### 总结解决方案 | **原因** | **解决措施** | |-------------------------|-----------------------------------------------------------------------------| | MRP进程未启动 | 启动MRP:`ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;` | | 存在日志间隙(GAP) | 手动注册缺失日志(方法见步骤2) | | 状态错误 | 调整为`MOUNT`或`READ ONLY WITH APPLY`(方法见步骤3) | | 参数配置错误 | 修正`STANDBY_FILE_MANAGEMENT=AUTO`,确保归档路径有效 | | 日志/数据文件损坏 | 从主库重新传输文件或重建 | > **预防建议**:部署定期监控脚本,检查`V$ARCHIVE_GAP`和`V$MANAGED_STANDBY`,并配置OEM告警。 §§相关问题§§ 1. Oracle Data Guard中如何自动修复日志间隙(GAP)? 2. 如何配置Active Data Guard以实现实时查询? 3. 主库出现数据文件不致时如何修复? 4. 如何监控Oracle Data Guard的实时同步延迟?</think>### Oracle DG 日志传输正常但数据未同步的原因排查 根据引用内容,结合 Oracle Data Guard 的核心机制,以下是数据未同步的**根本原因**和**排查步骤**: --- ### 、核心原因分析 1. **日志应用未启动(MRP 进程未运行)** - 归档日志传输(由 LNSn 进程完成)正常,但日志**应用**依赖 MRP 进程[^1][^4]。 - **典型表现**: ```sql -- 查询结果 STATUS 为空或非 APPLYING_LOG SELECT PROCESS, STATUS FROM V$MANAGED_STANDBY WHERE PROCESS = 'MRP0'; ``` 2. **日志序列间隙(GAP)** - 主库日志序列不连续,导致无法应用后续日志(即使新日志持续传输)[^2][^3]。 - **检查命令**: ```sql SELECT * FROM V$ARCHIVE_GAP; -- 显示缺失的日志序列 ``` 3. **状态不兼容日志应用** - Oracle 10g:需处于 `MOUNT` 状态才能应用日志。 - Oracle 11g+:需启用 Active Data Guard(`READ ONLY WITH APPLY`)[^1]。 - **错误状态示例**: ```sql SELECT OPEN_MODE FROM V$DATABASE; -- 返回 OPEN(非 READ ONLY WITH APPLY) ``` 4. **参数配置错误** - `STANDBY_FILE_MANAGEMENT=MANUAL`(无法自动管理文件)[^3] - `LOG_ARCHIVE_DEST_2` 含 `DELAY` 属性(故意延迟应用)[^1] - `STANDBY_ARCHIVE_DEST` 路径错误(日志文件无法定位)[^3] 5. **日志/数据文件损坏** - 传输的归档日志在损坏(如 RFS 进程写入失败)[^4] - 数据文件与主库致(如手动修改文件) --- ### 二、关键排查步骤 #### 1. 检查日志应用状态(MRP 进程) ```sql -- 确认 MRP 进程是否运行 SELECT PROCESS, STATUS, SEQUENCE# FROM V$MANAGED_STANDBY WHERE PROCESS = 'MRP0'; -- 若未运行,手动启动 ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT; ``` #### 2. 检查日志序列连续性 ```sql -- 是否存在日志间隙 SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP; -- 对比日志序列 SELECT MAX(SEQUENCE#) AS "主库最新序列" FROM V$ARCHIVED_LOG WHERE DEST_ID=1; SELECT MAX(SEQUENCE#) AS "已应用序列" FROM V$ARCHIVED_LOG WHERE APPLIED='YES'; ``` #### 3. 验证状态和模式 ```sql -- 检查数据状态 SELECT OPEN_MODE, DATABASE_ROLE, SWITCHOVER_STATUS FROM V$DATABASE; -- Oracle 11g+ 修复命令(启用 Active DG) ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; ALTER DATABASE OPEN; ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT; ``` #### 4. 审核关键参数 ```sql -- 检查文件自动管理 SHOW PARAMETER STANDBY_FILE_MANAGEMENT; -- 需为 AUTO -- 检查归档路径 SHOW PARAMETER STANDBY_ARCHIVE_DEST; -- 检查延迟设置(主库执行) SHOW PARAMETER LOG_ARCHIVE_DEST_2; -- 确认无 DELAY 属性 ``` #### 5. 检查日志错误和系统资源 ```sql -- 查看同步错误(引用[2][3]) SELECT ERROR_CODE, MESSAGE FROM V$DATAGUARD_STATUS; -- 检查存储空间 SELECT * FROM V$RECOVERY_AREA_USAGE; -- 归档区使用率 ``` --- ### 三、解决方案总结 | **问题类型** | **解决措施** | |----------------------|-----------------------------------------------------------------------------| | MRP 进程未运行 | 启动 MRP:`ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;` | | 日志间隙(GAP) | 手动注册缺失日志:`ALTER DATABASE REGISTER PHYSICAL LOGFILE '<路径>';` | | 状态错误 | 重启至正确模式(`MOUNT` 或 `READ ONLY WITH APPLY`) | | 参数配置错误 | 修正参数:`ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=AUTO;` | | 日志/文件损坏 | 从主库重新传输日志或重建 | > **预防建议**: > - 部署监控脚本定期检查 `V$MANAGED_STANDBY` 和 `V$ARCHIVE_GAP`[^2] > - 启用 Active Data Guard(11g+)避免状态冲突[^1] > - 设置 `LOG_ARCHIVE_TRACE=15` 跟踪日志传输细节 --- ### 四、相关问题 1. 如何配置 Active Data Guard 实现实时查询? 2. Oracle Data Guard 出现 ORA-00308 错误如何修复? 3. 如何监控 Data Guard 的实时同步延迟? 4. 主库数据文件不致时如何修复? 通过以上步骤,90% 的同步问题可快速定位。若问题仍存在,请检查告警日志(`alert_<SID>.log`)中的 ORA 错误[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值