### Oracle 11g R2 Streams出现ORA-26744: ORA-26767:错误分析与解决
#### 一、背景与问题概述
在Oracle 11g R2数据库环境中,Streams复制技术因其灵活性和高效性被广泛应用于数据同步场景。然而,用户在实际操作中可能遇到ORA-26744和ORA-26767错误,这两个错误通常与Streams的捕获(Capture)或应用(Apply)过程相关,导致数据同步中断或失败。本文将深入分析这两个错误的成因、影响及解决方案,帮助DBA快速定位并解决问题。
#### 二、错误代码详解
1. **ORA-26744: 捕获进程无法生成LCR(Logical Change Record)**
- 原因:捕获进程在读取重做日志(Redo Log)或归档日志(Archive Log)时,因日志损坏、权限不足或配置错误导致无法生成有效的LCR。
- 典型场景:
- 源数据库的归档日志被删除或损坏。
- 捕获进程用户(如`CAPTURE_USER`)缺少必要的权限(如`SELECT ANY TRANSACTION`、`EXECUTE_CATALOG_ROLE`)。
- Streams配置中`DBMS_STREAMS_ADM.SET_UP_QUEUE`未正确执行,导致队列表空间不足。
2. **ORA-26767: 应用进程无法解析LCR**
- 原因:应用进程在接收LCR后,因目标数据库对象(如表、索引)不存在、结构不匹配或约束冲突导致无法执行DDL/DML操作。
- 典型场景:
- 目标数据库缺少源数据库的某些表或视图。
- 表结构变更(如新增列)未同步到目标数据库。
- 主键/外键约束冲突导致DML操作失败。
#### 三、诊断步骤
1. **检查Streams组件状态**
-- 查询捕获进程状态
SELECT capture_name, status, error_number, error_message
FROM dba_capture;
-- 查询应用进程状态
SELECT apply_name, status, error_number, error_message
FROM dba_apply;
2. **分析日志文件**
- 检查`alert.log`和Streams跟踪文件(通常位于`$ORACLE_BASE/diag/rdbms/
- 使用`ADRCI`工具查看诊断日志:
adrci> show incident
adrci> show alert
3. **验证权限与配置**
- 确认捕获进程用户具有以下权限:
GRANT SELECT ANY TRANSACTION TO capture_user;
GRANT EXECUTE_CATALOG_ROLE TO capture_user;
GRANT CREATE ANY QUEUE TO capture_user;
- 检查队列表空间是否足够:
SELECT tablespace_name, bytes/1024/1024 "Size(MB)"
FROM dba_data_files
WHERE tablespace_name IN (
SELECT tablespace_name FROM dba_queues WHERE queue_table LIKE '%STREAMS_QT%'
);
#### 四、解决方案
1. **针对ORA-26744的修复**
- **场景1:日志损坏**
- 恢复归档日志:从备份中还原缺失的归档日志文件。
- 跳过损坏的日志:使用`DBMS_CAPTURE_ADM.ALTER_CAPTURE`设置`skip_transaction`参数。
BEGIN
DBMS_CAPTURE_ADM.ALTER_CAPTURE(
capture_name => 'MY_CAPTURE',
skip_transaction => TRUE
);
END;
/
- **场景2:权限不足**
- 补充缺失权限(参考诊断步骤中的权限列表)。
- 重新启动捕获进程:
BEGIN
DBMS_CAPTURE_ADM.STOP_CAPTURE(capture_name => 'MY_CAPTURE');
DBMS_CAPTURE_ADM.START_CAPTURE(capture_name => 'MY_CAPTURE');
END;
/
2. **针对ORA-26767的修复**
- **场景1:目标对象缺失**
- 使用`DBMS_STREAMS_ADM.MAINTAIN_TABLES`同步表结构:
BEGIN
DBMS_STREAMS_ADM.MAINTAIN_TABLES(
table_names => 'EMPLOYEES',
remote_link => 'TARGET_DB_LINK',
operation => 'REFRESH'
);
END;
/
- 手动创建缺失对象并重新初始化Streams配置。
- **场景2:约束冲突**
- 临时禁用约束:
ALTER TABLE employees DISABLE CONSTRAINT emp_pk;
-- 执行Streams应用后重新启用
ALTER TABLE employees ENABLE CONSTRAINT emp_pk;
- 修改应用进程参数`apply_error_handling`为`IGNORE`或`LOG`:
BEGIN
DBMS_APPLY_ADM.ALTER_APPLY(
apply_name => 'MY_APPLY',
error_handling => 'IGNORE'
);
END;
/
3. **通用修复步骤**
- 重新注册捕获进程:
BEGIN
DBMS_CAPTURE_ADM.DROP_CAPTURE(capture_name => 'MY_CAPTURE');
DBMS_CAPTURE_ADM.CREATE_CAPTURE(
capture_name => 'MY_CAPTURE',
queue_name => 'MY_QUEUE',
start_time => SYSTIMESTAMP,
source_database => 'SOURCE_DB'
);
END;
/
- 重建Streams队列:
BEGIN
DBMS_AQADM.DROP_QUEUE(queue_name => 'MY_QUEUE');
DBMS_AQADM.CREATE_QUEUE(queue_name => 'MY_QUEUE', queue_table => 'MY_QT');
DBMS_AQADM.START_QUEUE(queue_name => 'MY_QUEUE');
END;
/
#### 五、预防措施
1. **监控与告警**
- 配置自定义监控脚本,定期检查Streams进程状态:
#!/bin/bash
# 检查捕获进程状态
CAPTURE_STATUS=$(sqlplus -s "/ as sysdba"
2. **日志管理**
- 设置归档日志保留策略,避免因日志过期导致捕获失败。
- 定期备份Streams元数据(如使用`EXPDP`导出`SYS.STREAMS$`表)。
3. **版本兼容性**
- 确保源库和目标库的Oracle版本一致(如均为11.2.0.4),避免因版本差异导致LCR解析失败。
#### 六、案例分析
**案例1:ORA-26744因权限不足**
- 现象:捕获进程报错`ORA-26744: cannot generate LCR for transaction`,跟踪文件显示`ORA-01031: insufficient privileges`。
- 解决:授予`capture_user`权限后重启捕获进程。
**案例2:ORA-26767因表结构不匹配**
- 现象:应用进程报错`ORA-26767: apply process cannot execute DML`,原因为目标表缺少源表的新增列。
- 解决:使用`DBMS_STREAMS_ADM.ADD_TABLE_RULES`更新规则,并手动添加列。
#### 七、总结
ORA-26744和ORA-26767错误是Oracle Streams复制中常见的两类问题,分别涉及数据捕获和应用阶段。通过系统化的诊断流程(如检查状态、分析日志、验证权限)和针对性的修复方案(如恢复日志、同步对象、调整参数),可以高效解决这些问题。同时,建立完善的监控机制和预防措施(如权限管理、日志备份)能够显著降低故障发生率,保障数据同步的稳定性和可靠性。
**关键词**:Oracle 11g R2、Streams复制、ORA-26744、ORA-26767、逻辑变更记录(LCR)、捕获进程、应用进程、权限管理、日志恢复、表结构同步
**简介**:本文详细分析了Oracle 11g R2环境中Streams复制技术出现的ORA-26744和ORA-26767错误,涵盖错误成因、诊断方法、解决方案及预防措施。通过代码示例和案例分析,帮助DBA快速定位并解决数据同步问题,确保Streams复制的稳定运行。