我电脑上的个人Oracle数据库环境已经装了有5-6年了,平时偶尔用来进行测试一下。最近想用这个测试库进行expdp执行全库导出测试,谁料到,以前这个环境好好的,现在居然不能执行expdp导出,使用的导出parfile如下:
cat >exp_mysource_full_20231213.parUSERID='/ as sysdba'DIRECTORY=DBADUMPDUMPFILE=exp_mysource_full_20231213.dmpLOGFILE=exp_mysource_full_20231213.logFULL=yesCOMPRESSION=allCLUSTER=N或者cat >exp_mysource_suxingtab_20231213.parUSERID='/ as sysdba'DIRECTORY=DBADUMPDUMPFILE=exp_mysource_suxingtab_20231213.dmpLOGFILE=exp_mysource_suxingtab_20231213.logTABLES=(SUXING.EXEC_TASK_TBAK20200402)COMPRESSION=allCLUSTER=N
不管导出全库还是某个用户或者某个表,都报同样的错误,如下:
Export: Release 11.2.0.4.0 - Production on Wed Dec 13 05:48:13 2023Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing optionsORA-31626: job does not existORA-04063: package body "SYS.DBMS_INTERNAL_LOGSTDBY" has errorsORA-06508: PL/SQL: could not find program unit being called: "SYS.DBMS_INTERNAL_LOGSTDBY"ORA-06512: at "SYS.KUPV$FT", line 1009ORA-04063: package body "SYS.DBMS_INTERNAL_LOGSTDBY" has errorsORA-06508: PL/SQL: could not find program unit being called: "SYS.DBMS_INTERNAL_LOGSTDBY"
首先看到,第一想到是SYS.DBMS_INTERNAL_LOGSTDBY这个包体实效了,但是还不清楚什么原因导致实效。
由于这个环境在2019年的时候部署过OGG,开启了DDL同步功能,后面做完了测试,删除了一些东西。原计划是想把OGG的数据库用户所有的对象都清理干净,但当时简单删除了一些对象后,想直接删除整个用户删除不掉,就不再理会了。还有一个就是上2022年,闲得慌,想把dba_users这个视图删掉,进行一些还原测试,后面没时间弄,又不这个dba_users视图创建回来。
所以,现在想到这个环境现在连常用的expdp导数都不能执行,那还是情有可原的,是自己之前埋下了各种坑。以下就是这次报错的解决过程。
最开始是在MOS上找到了这个文章:ORA-31626 ORA-4063 Package Body DBMS_INTERNAL_LOGSTDBY Has Errors During DataPump Export (EXPDP) (Doc ID 799625.1)。按照这篇文章的方法,依然没有把报错解决掉。
06:01:17 sys@MYSOURCE > select * from dba_errors where name = 'DBMS_INTERNAL_LOGSTDBY';OWNER NAME TYPE SEQUENCE LINE POSITION TEXT ATTRIBUTE MESSAGE_NUMBER---------- ---------------------- ------------------------------ -------------------- -------------------- -------------------- -------------------------------------------------------------------------------- --------- --------------SYS DBMS_INTERNAL_LOGSTDBY PACKAGE BODY 1 5955 8 PL/SQL: ORA-00942: table or view does not exist ERROR 0SYS DBMS_INTERNAL_LOGSTDBY PACKAGE BODY 2 5954 3 PL/SQL: SQL Statement ignored ERROR 0Elapsed: 00:00:00.0106:01:18 sys@MYSOURCE >06:01:19 sys@MYSOURCE > select owner, table_name, column_name, data_type06:02:07 2 from dba_tab_columns06:02:07 3 where column_name = 'TIMESTAMP' and06:02:07 4 data_type like 'TIMESTAMP%';OWNER TABLE_NAME COLUMN_NAM DATA_TYPE---------- ----------------------------------- ---------- ---------------SYS REGISTRY$ERROR TIMESTAMP TIMESTAMP(6)06:02:10 sys@MYSOURCE > alter table sys.REGISTRY$ERROR modify (timestamp date);Table altered.06:02:10 sys@MYSOURCE > alter table system.logmnr_log$ modify (timestamp date);Table altered.
修改了以上两个表字段的数据类型之后,根据意见:Then the package DBMS_INTERNAL_LOGSTDBY can be compiled and DataPump export will work.尝试重新编译DBMS_INTERNAL_LOGSTDBY包体,未能成功。

重新编译后,DBMS_INTERNAL_LOGSTDBY包体依然无效。
select owner,object_name,object_type,created,status from dba_objects where object_name='DBMS_INTERNAL_LOGSTDBY';OWNER OBJECT_NAME OBJECT_TYPE CREATED STATUS---------- ------------------------------ ------------------- -------------------- ----------SYS DBMS_INTERNAL_LOGSTDBY PACKAGE 2013-08-24 11:38:57 VALIDSYS DBMS_INTERNAL_LOGSTDBY PACKAGE BODY 2013-08-24 11:41:50 INVALID
接着,又找到了一篇文章:ORA-942 Compiling Package SYS.DBMS_INTERNAL_LOGSTDBY (Doc ID 1112296.1)。这个初步帮我定位到了一个坑,那就是我的数据库没有dba_users视图,这是我自己挖的坑。其实上面查看报错的时候,也已经确定了错误方向了,内容就是:PL/SQL: ORA-00942: table or view does not exist,与Doc ID 799625.1描述的问题场景有所不一样。
SELECT referenced_owner,referenced_name,referenced_typeFROM DBA_DEPENDENCIESWHERE name ='DBMS_INTERNAL_LOGSTDBY'AND type ='PACKAGE BODY'AND OWNER ='SYS'AND referenced_type = 'NON-EXISTENT';REFERENCED_OWNER REFERENCED_NAME REFERENCED_TYPE------------------------------ ---------------------------------------------------------------- ------------------PUBLIC DBA_USERS NON-EXISTENTSYS DBA_USERS NON-EXISTENTselect count(*) from dba_users;select count(*) from dba_users*ERROR at line 1:ORA-00942: table or view does not exist
从这个查询结果看,问题已经是相当明确了,就是dba_users不存在。
接下来,就是想办法把dba_users创建出来。
因为dba_users是Oracle数据库系统重要的字典视图,就必须从安装包提供的脚本去创建,则要执行“?/rdbms/admin/catalog.sql”这个SQL脚本。如果想了解catalog.sql这个SQL脚本有什么内容,可以详细查看,片段如下:
more catalog.sqlRemRem $Header: catalog.sql 07-mar-2008.13:28:05 huagli Exp $ catalog.sqlRemRem Copyright (c) 1988, 2007, Oracle. All rights reserved.RemRem NAMERem CATALOG.SQLRem FUNCTIONRem Creates data dictionary views.Rem NOTESRem Must be run when connected AS SYSDBARemRem MODIFIED... ...--CATCTL -S Initial scripts single process@@cdstrt@@cdfixed.sql@@cdcore.sql--CATCTL -M@@cdplsql.sql@@cdsqlddl.sql@@cdmanage.sql@@cdtxnspc.sql@@cdenv.sql@@cdrac.sql@@cdsec.sql@@cdobj.sql@@cdjava.sql@@cdpart.sql@@cdrep.sql@@cdaw.sql@@cdsummgt.sql@@cdtools.sql@@cdexttab.sql@@cddm.sql@@catldr.sql--CATCTL -S Final scripts single process@@cdoptim.sql@@catsum.sql@@catexp.sql@@cddst.sql@@cdend.sql
创建dba_users的操作如下:
SQL> shutdown immediateSQL> startup upgradeSQL> @?/rdbms/admin/catalog.sqlSQL> shutdown immediateSQL> startupselect count(*) from dba_users;COUNT(*)--------------------46
可以看到,dba_users已经创建成功,可以正常查询使用。
但再继续看看上面的包体DBMS_INTERNAL_LOGSTDBY是否恢复有效状态呢?
select owner,object_name,object_type,created,status from dba_objects where object_name='DBMS_INTERNAL_LOGSTDBY';OWNER OBJECT_NAME OBJECT_TYPE CREATED STATUS---------- ------------------------------ ------------------- -------------------- ----------SYS DBMS_INTERNAL_LOGSTDBY PACKAGE 24-AUG-13 VALIDSYS DBMS_INTERNAL_LOGSTDBY PACKAGE BODY 24-AUG-13 INVALID00:55:32 idle > SELECT referenced_owner,00:56:15 2 referenced_name,00:56:15 3 referenced_type00:56:15 4 FROM DBA_DEPENDENCIES00:56:15 5 WHERE name ='DBMS_INTERNAL_LOGSTDBY'00:56:15 6 AND type ='PACKAGE BODY'00:56:15 7 AND OWNER ='SYS'00:56:15 8 AND referenced_type = 'NON-EXISTENT';no rows selected
通过查看,依然是失效状态,到了这一步,也没有依赖的对象存在问题了。
尝试重新编译DBMS_INTERNAL_LOGSTDBY包和包体
alter package SYS.DBMS_INTERNAL_LOGSTDBY compile;alter package SYS.DBMS_INTERNAL_LOGSTDBY compile body;
然后尝试进行expdp导数,发现上面的报错没了,但是换成了另外的报错,是跟OGG有关的报错。
[oracle@susource datadump]$ expdp parfile=exp_mysource_suxingtab_20231213.parExport: Release 11.2.0.4.0 - Production on Sat Dec 16 00:58:15 2023Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing optionsORA-31626: job does not existORA-04045: errors during recompilation/revalidation of SYS.DBMS_INTERNAL_LOGSTDBYORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-04045: errors during recompilation/revalidation of OGGADMIN.DDLREPLICATIONORA-04067: not executed, package body "OGGADMIN.DDLREPLICATION" does not existORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-06512: at line 1337ORA-04067: not executed, package body "OGGADMIN.DDLREPLICATION" does not existORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-04045: errors during recompilation/revalidation of SYS.DBMS_INTERNAL_LOGSTDBYORA-04067: not executed, package body "OGGADMIN.DDLREPLICATION" does not existORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-06512: at line 1337ORA-04067: not executed, package body "OGGADMIN.DDLREPLICATION" does not existORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-06512: at line 1198ORA-04045: errors during recompilation/revalidation of OGGADMIN.DDLREPLICATIONORA-04067: not executed, package body "OGGADMIN.DDLREPLICATION" does not existORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-06512: at line 1337ORA-04067: not executed, package body "OGGADMIN.DDLREPLICATION" does not existORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-04045: errors during recompilation/revalidation of OGGADMIN.DDLREPLICATIONORA-04067: not executed, package body "OGGADMIN.DDLREPLIC03:25:31 sys@MYSOURCE > drop user OGGADMIN cascade;drop user OGGADMIN cascade*ERROR at line 1:ORA-00604: error occurred at recursive SQL level 1ORA-04045: errors during recompilation/revalidation of OGGADMIN.DDLREPLICATIONORA-04067: not executed, package body "OGGADMIN.DDLREPLICATION" does not existORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-06512: at line 1337ORA-04067: not executed, package body "OGGADMIN.DDLREPLICATION" does not existORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-06512: at line 1198ORA-04045: errors during recompilation/revalidation of OGGADMIN.DDLREPLICATIONORA-04067: not executed, package body "OGGADMIN.DDLREPLICATION" does not existORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-06512: at line 1337ORA-04067: not executed, package body "OGGADMIN.DDLREPLICATION" does not existORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-04045: errors during recompilation/revalidation of OGGADMIN.DDLREPLICATIONORA-04067: not executed, package body "OGGADMIN.DDLREPLICATION" does not existORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-06512: at line 1337ORA-04067: not executed, package body "OGGADMIN.DDLREPLICATION" does not existORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"05:15:33 sys@MYSOURCE > drop PACKAGE BODY OGGADMIN.DDLREPLICATION;drop PACKAGE BODY OGGADMIN.DDLREPLICATION*ERROR at line 1:ORA-00604: error occurred at recursive SQL level 1ORA-04045: errors during recompilation/revalidation of OGGADMIN.DDLREPLICATIONORA-04067: not executed, package body "OGGADMIN.DDLREPLICATION" does not existORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-06512: at line 1337ORA-04067: not executed, package body "OGGADMIN.DDLREPLICATION" does not existORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-06512: at line 1198ORA-04045: errors during recompilation/revalidation of OGGADMIN.DDLREPLICATIONORA-04067: not executed, package body "OGGADMIN.DDLREPLICATION" does not existORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-06512: at line 1337ORA-04067: not executed, package body "OGGADMIN.DDLREPLICATION" does not existORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-04045: errors during recompilation/revalidation of OGGADMIN.DDLREPLICATIONORA-04067: not executed, package body "OGGADMIN.DDLREPLICATION" does not existORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-06512: at line 1337ORA-04067: not executed, package body "OGGADMIN.DDLREPLICATION" does not existORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"Elapsed: 00:00:00.0305:15:56 sys@MYSOURCE > drop PACKAGE BODY OGGADMIN.DDLAUX;drop PACKAGE BODY OGGADMIN.DDLAUX*ERROR at line 1:ORA-00604: error occurred at recursive SQL level 1ORA-04045: errors during recompilation/revalidation of OGGADMIN.DDLREPLICATIONORA-04067: not executed, package body "OGGADMIN.DDLREPLICATION" does not existORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-06512: at line 1337ORA-04067: not executed, package body "OGGADMIN.DDLREPLICATION" does not existORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-06512: at line 1198ORA-04045: errors during recompilation/revalidation of OGGADMIN.DDLREPLICATIONORA-04067: not executed, package body "OGGADMIN.DDLREPLICATION" does not existORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-06512: at line 1337ORA-04067: not executed, package body "OGGADMIN.DDLREPLICATION" does not existORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-04045: errors during recompilation/revalidation of OGGADMIN.DDLREPLICATIONORA-04067: not executed, package body "OGGADMIN.DDLREPLICATION" does not existORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-06512: at line 1337ORA-04067: not executed, package body "OGGADMIN.DDLREPLICATION" does not existORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"01:02:53 idle > alter package OGGADMIN.DDLREPLICATION compile body;alter package OGGADMIN.DDLREPLICATION compile body*ERROR at line 1:ORA-00604: error occurred at recursive SQL level 1ORA-04045: errors during recompilation/revalidation of OGGADMIN.DDLREPLICATIONORA-04067: not executed, package body "OGGADMIN.DDLREPLICATION" does not existORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-06512: at line 1337ORA-04067: not executed, package body "OGGADMIN.DDLREPLICATION" does not existORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-06512: at line 1198ORA-04045: errors during recompilation/revalidation of OGGADMIN.DDLREPLICATIONORA-04067: not executed, package body "OGGADMIN.DDLREPLICATION" does not existORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-06512: at line 1337ORA-04067: not executed, package body "OGGADMIN.DDLREPLICATION" does not existORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-04045: errors during recompilation/revalidation of OGGADMIN.DDLREPLICATIONORA-04067: not executed, package body "OGGADMIN.DDLREPLICATION" does not existORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-06512: at line 1337ORA-04067: not executed, package body "OGGADMIN.DDLREPLICATION" does not existORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"ORA-06508: PL/SQL: could not find program unit being called: "OGGADMIN.DDLREPLICATION"
刚开始的时候,尝试各种删除、重新编译操作,都报同样的错误,感觉就是OGG开启DDL的功能对数据库约束太多了,又太顽固。
到了这里,既然我强删不行,那我就用正规方法把OGG数据库相关的配置全部清理干净。
SQL> @ddl_remove.sqlDDL replication removal script.WARNING: this script removes all DDL replication objects and data.You will be prompted for the name of a schema for the Oracle GoldenGate database objects.NOTE: The schema must be created prior to running this script.Enter Oracle GoldenGate schema name:oggadminWrking, please wait ...Spooling to file ddl_remove_spool.txtScript complete.
进入OGG的软件目录,调用它自带的SQL脚本,把OGG的数据库配置删除掉。把OGGADMIN.DDLREPLICATION这个OGG的DDL同步的包和包体删除之后,其他OGG的数据库对象,迎刃而解,现在可以直接把OGG这个用户删除了。
SQL> drop user oggadmin cascade;
到了这步,删除OGG用户之后,感觉一切太平了,感觉看到了胜利的曙光一样。
尝试再次查看开始报错的包体的状态,如下:
select owner,object_name,object_type,created,status from dba_objects where object_name='DBMS_INTERNAL_LOGSTDBY';OWNER OBJECT_NAME OBJECT_TYPE CREATED STATUS---------- ------------------------------ ------------------- -------------------- ----------SYS DBMS_INTERNAL_LOGSTDBY PACKAGE 2013-08-24 11:38:57 VALIDSYS DBMS_INTERNAL_LOGSTDBY PACKAGE BODY 2013-08-24 11:41:50 VALID
删除了OGG的DDL同步相关的包体之后,包体DBMS_INTERNAL_LOGSTDBY不需要重新编译就直接恢复有效状态。也就是说,expdp可以正常导数了。
expdp \'/ as sysdba\' DIRECTORY=DBADUMP DUMPFILE=exp_mysource_suxingtab_20231213.dmp LOGFILE=exp_mysource_suxingtab_20231213.log TABLES=SUXING.EXEC_TASK_TBAK20200402 COMPRESSION=allExport: Release 11.2.0.4.0 - Production on Tue Dec 19 07:04:54 2023Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing optionsFLASHBACK automatically enabled to preserve database integrity.Starting "SYS"."SYS_EXPORT_TABLE_01": "/******** AS SYSDBA" DIRECTORY=DBADUMP DUMPFILE=exp_mysource_suxingtab_20231213.dmp LOGFILE=exp_mysource_suxingtab_20231213.log TABLES=SUXING.EXEC_TASK_TBAK20200402 COMPRESSION=allEstimate in progress using BLOCKS method...Processing object type TABLE_EXPORT/TABLE/TABLE_DATATotal estimation using BLOCKS method: 64 KBProcessing object type TABLE_EXPORT/TABLE/TABLEProcessing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS. . exported "SUXING"."EXEC_TASK_TBAK20200402" 6.593 KB 174 rowsMaster table "SYS"."SYS_EXPORT_TABLE_01" successfully loaded/unloaded******************************************************************************Dump file set for SYS.SYS_EXPORT_TABLE_01 is:home/oracle/datadump/exp_mysource_suxingtab_20231213.dmpJob "SYS"."SYS_EXPORT_TABLE_01" successfully completed at Tue Dec 19 07:05:07 2023 elapsed 0 00:00:12
可见,expdp导数报错问题,已经完全解决掉了。





