Oracle 11g Streams配置Schema复制报ORA-00942错误排查
问题根因
这个ORA-00942报错和你手动导入的目标端Schema对象完整性无关,是Streams自动生成的DataPump实例化PL/SQL块编译/执行阶段触发的,核心触发点有三个:
- 自动生成的PL/SQL块中直接引用了
v$parameter动态性能视图,执行配置的用户如果没有该视图的select权限,块会在编译阶段直接抛942错误,报错位置刚好对应错误栈中提示的line 43行,也就是查询compatible参数的SQL语句,这是11g版本Streams配置的高频已知问题。 - 你已经提前手动完成了目标端Schema导入,但Streams预检查逻辑误判目标端Schema不存在,仍强制触发自动DataPump导入流程,如果执行用户没有
DATA_PUMP_DIR目录的读写权限,Oracle会偶发误抛942错误而非标准的权限/目录不存在错误。 - 自动生成的代码中Schema名存在拼写错误,比如示例块里写的
MY_CHEMA(正确应为MY_SCHEMA),会导致DataPump找不到对应Schema触发报错。
排查步骤
- 把报错中提到的自动生成PL/SQL块单独拷贝出来,定位到第43行,确认是
select value into local_compat from v$parameter where name = 'compatible';语句后,用执行Streams配置的用户单独运行这条SQL,若直接抛942即可确认是v$parameter权限问题。 - 执行
select * from dba_directories where directory_name='DATA_PUMP_DIR';确认目录路径有效,且执行配置的用户持有该目录的READ、WRITE权限。 - 核对自动生成块中
object_owner(1)赋值的Schema名,和实际要复制的Schema名完全一致,排除拼写错误。
解决方案
按优先级依次操作即可:
- 补全必要权限
用SYS用户执行以下授权,将<your_config_user>替换为你实际执行Streams配置的数据库用户:
如果你是直接用SYS用户执行配置仍报错,检查SYS是否被异常回收了grant select on v_$parameter to <your_config_user>; grant read, write on directory DATA_PUMP_DIR to <your_config_user>; grant select on dba_directories to <your_config_user>;v_$parameter的select权限,SYS默认持有该权限。 - 跳过自动实例化流程(推荐)
既然你已经手动完成了目标端Schema的全量导入,完全不需要Streams触发自动DataPump导入,配置Schema规则时直接关闭自动实例化参数即可,示例配置语句:
捕获、传播、应用进程的规则全部配置完成后,手动设置实例化SCN即可启动同步,不需要走自动导入流程:BEGIN DBMS_STREAMS_ADM.ADD_SCHEMA_RULES( schema_name => 'MY_SCHEMA', -- 替换为实际要复制的Schema名,注意核对拼写 streams_type => 'CAPTURE', streams_name => 'DB1_CAPTURE', queue_name => 'STRMADMIN.STREAMS_QUEUE', -- 替换为你实际创建的队列名 include_dml => TRUE, include_ddl => TRUE, instantiation => DBMS_STREAMS_ADM.INSTANTIATE_SCHEMA_NONE -- 关闭自动实例化 ); END; /-- 第一步:在源库查询当前SCN SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM DUAL; -- 第二步:在目标库执行实例化SCN设置,替换为上一步查到的SCN、实际Schema名、源库DB Link名 BEGIN DBMS_APPLY_ADM.SET_SCHEMA_INSTANTIATION_SCN( source_schema_name => 'MY_SCHEMA', source_database_name => 'DB1_TO_DB2_LINK', instantiation_scn => <替换为第一步查到的SCN值>, apply_database_link => NULL ); END; / - 清理残留的失败脚本
之前执行失败的可恢复脚本会残留在数据字典中,执行以下语句清理后再重新配置即可,脚本ID替换为你报错信息中返回的ID:BEGIN DBMS_RECOVERABLE_SCRIPT.DROP_SCRIPT( script_id => 'E367A59F534C71FAE050000AA11F7E9A' ); END; /
内容的提问来源于stack exchange,提问作者Tigran Shahnazaryan
相关产品推荐
相关产品推荐

