oracle 11g expdp导出作业调用失败,提示丢包。

2020-12-02 08:38发布

问题:

win7 oracle版本


BANNER
--------------------------------------------------------------------------------

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0      Production
TNS for 32-bit Windows: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

3报错

C:\Users\Administrator>expdp his1/HIS1@BP DUMPFILE=HIS1.DMP DIRECTORY=DATA_DIR LOGFILE=HIS1.LOG

Export: Release 11.2.0.1.0 - Production on 星期一 11月 30 17:19:44 2020

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

连接到: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
ORA-31626: 作业不存在
ORA-04063: package body "SYS.DBMS_INTERNAL_LOGSTDBY" 有错误
ORA-06508: PL/SQL: 无法找到正在调用 : "SYS.DBMS_INTERNAL_LOGSTDBY" 的程序单元
ORA-06512: 在 "SYS.KUPV$FT", line 991
ORA-04063: package body "SYS.DBMS_LOGREP_UTIL" 有错误
ORA-06508: PL/SQL: 无法找到正在调用 : "SYS.DBMS_LOGREP_UTIL" 的程序单元

尝试使用dba权限重编译包无效

ALTER  PACKAGE SYS.DBMS_INTERNAL_LOGSTDBY COMPILE;

ALTER  PACKAGE SYS.DBMS_LOGREP_UTIL COMPILE;

回答1:

出现这种情况的原因是因为
对于全局变量,每一个session会生成一个本地copy,如果程序重新编译的话,就会因程序里原变量找不到而丢弃该变量,继而导致这个错误。
也就是说在一个会话中调用程序包package时,会生成package中全局变量的副本,如果在另一个会话中对此package进行编译就会使前一个会话中的副本失效,故而产生错误。
要想避免这个错误,可以使程序捕获ORA-06508:的错误进行处理,也可以重新初始化会话

参考:https://blog.csdn.net/weiwangsisoftstone/article/details/44172955