Oracle 19c执行expdp/impdp因SYS包报错如何解决
Oracle 19c expdp/impdp报DBMS_LOGREP_UTIL无效、同义词循环链修复方案
故障表现
- 所有expdp/impdp命令执行失败,返回错误栈如下:
ORA-31626: job does not exist ORA-31637: cannot create job SYS_EXPORT_SCHEMA_01 for user SYSTEM ORA-06512: at "SYS.DBMS_SYS_ERROR", line 95 ORA-06512: at "SYS.KUPV$FT", line 1145 ORA-04045: errors during recompilation/revalidation of SYS.DBMS_LOGREP_UTIL ORA-01775: looping chain of synonyms ORA-06508: PL/SQL: could not find program unit being called: "SYS.DBMS_LOGREP_UTIL" ORA-06512: at "SYS.KUPV$FT", line 957
- 排查确认
SYS.DBMS_LOGREP_UTIL包为无效状态,该包为加密包装,无法直接查看源码定位触发循环同义词的关联对象。 - 报错截图:

修复步骤
该问题本质是公共同义词存在错误配置,和SYS下的内置字典表重名且指向不存在的对象,触发编译时的循环引用,按以下步骤修复即可:
- 用SYS用户登录数据库,执行SQL定位异常的公共同义词:
select owner, synonym_name, table_owner, table_name from dba_synonyms where owner = 'PUBLIC' and synonym_name in ( select object_name from dba_objects where owner='SYS' and object_type in ('TABLE','VIEW','PACKAGE') ) and (table_owner is null or not exists ( select 1 from dba_objects b where b.owner = table_owner and b.object_name = table_name ));
绝大多数场景下,查询结果会返回
LOGMNR_LOG$、LOGMNR_SESSION$、LOGREP$这类和日志挖掘、逻辑复制相关的异常公共同义词,均为误操作创建的无效公共同义词。
- 逐个删除查询到的异常公共同义词,语法示例:
-- 替换成实际查到的同义词名称 drop public synonym LOGMNR_LOG$;
- 清理完成后手工编译无效包:
alter package SYS.DBMS_LOGREP_UTIL compile; alter package SYS.DBMS_LOGREP_UTIL compile body;
- 验证包状态:
select object_name, status from dba_objects where owner='SYS' and object_name='DBMS_LOGREP_UTIL';
如果返回结果中包规范、包体状态均为VALID,直接测试expdp/impdp命令即可恢复正常。
5. 如果编译后包仍为无效状态,执行Oracle内置字典修复脚本重建相关组件:
-- 以SYS AS SYSDBA身份执行 @?/rdbms/admin/catlog.sql @?/rdbms/admin/dbmslrep.sql @?/rdbms/admin/utlrp.sql
脚本执行完成后会自动重编译所有SYS下的无效对象,等待执行完成后再验证数据泵功能即可。
内容的提问来源于stack exchange,提问作者Vishal5364
相关产品推荐
相关产品推荐

