使用dbms_stats收集统计信息时因为修改了包内容导致执行时出现问题,删除dbms_stats包后打算重建;未重建,中途使用数据泵expdp时报错,使用 expdp 导出数据时,没有指定exclude=statistics 所以自动包含了表的优化器统计信息,虽然dump文件导出到directory目录下,但是可能存在错误数据,报错提示代码如下:ORA-39127 ORA-04045 ORA-01775 ORA-06508 ORA-06512;
ORA-39127:unexpected error from call to export_string :=SYS.DBMS_AW_EXP.INSTANCE_EXTENDED_INFO_EXP
ORA-39127: unexpected error from call to export_string :=SYS.DBMS_CUBE_EXP.INSTANCE_EXTENDED_INFO_EXP

按照常规方法
1.检查失效对象
select owner, object_type, status, count(*)
from dba_objects
where status='INVALID'
group by owner, object_type, status
order by owner, object_type;

查看具体失效对象
col owner for a20;
col object_name for a32;
col object_type for a16
col status for a8
select owner, object_name, object_type, status
from dba_objects
where status='INVALID'
order by 1, 2,3;

编译无效对象
@?/rdbms/admin/utlrp
我这里出现报错不存在SYS.DBMS_REGISTRY_SYS这个包,可能还是dbms_stats包不存在导致的,后续重建dbms_stats包后再次编译正常

2.检查数据泵用于导入导出的特殊用户EXFSYS
SELECT username, account_status FROM dba_users WHERE username = 'EXFSYS';

发现状态为EXPIRED & LOCKED
删除EXFSYS无效事务
DELETE FROM exppkgact$ WHERE SCHEMA='EXFSYS';

重新执行expdp时还是同样的报错提示
3.检查SYS.EXPPKGACT$表 主要用于跟踪和管理数据泵作业的活动和状态
SELECT * FROM SYS.EXPPKGACT$ WHERE PACKAGE = 'DBMS_CUBE_EXP';
SELECT * FROM SYS.EXPPKGACT$ WHERE PACKAGE = 'DBMS_AW_EXP';

通过创建备份表,将原表存储的数据泵信息delete执行解决

重新执行expdp时导出正常

重新创建dbms_stats包
drop package dbms_stats;
@?/rdbms/admin/dbmsstat.sql
@?/rdbms/admin/prvtstas.plb
@?/rdbms/admin/prvtstai.plb
@?/rdbms/admin/prvtstat.plb


重新编译无效对象@?/rdbms/admin/utlrp正常执行,查询剩下四个是我自己增加测试的无需管理

重新手动统计信息正常





