Oracle运维笔记之有关外部表的ORA-20011错误

最近测试服务器在迁移后,每天的22点多就会出现以下错误:

Wed Nov 04 22:17:48 2020
DBMS_STATS: GATHER_STATS_JOB encountered errors. Check the trace file.
Errors in file /oracle/app/diag/rdbms/ofsaa/ofsaa1/trace/ofsaa1_j001_54452.trc:
ORA-20011: Approximate NDV failed: ORA-29913: error in executing ODCIEXTTABLEOPEN callout
KUP-11024: This external table can only be accessed from within a Data Pump job.

从错误信息上看,是在对外部表收集统计信息时出现的错误。通过oerr ora命令没有找到20011的相关信息,接下来就只有查看MOS了。在文档1274653.1,ORA-20011 ORA-29913 and ORA-29400 with Associated KUP-XXXXX Errors from DBMS_STATS.GATHER_STATS_JOB中,是这样介绍错误原因的:

Oracle运维笔记之有关外部表的ORA-20011错误

内部表文件丢失,但是数据库字典信息中由于某些原因没有及时更新,仍然保留着内部表的信息。当用DBMS_STATS收集该内部表的统计信息时,调用内部表信息,但由于文件已经不存在导致了报错。
看到这里也就确定了问题所在,测试库有一张外部表,在迁移后,外部表文件没有迁移到新服务器上,还在之前的服务器,这就导致了在新服务器上只有外部表的定义,而没有文件,所以在收集统计信息时才会报错。
在知道原因后,跟测试人员确认,得知这张外部表不是必要的表,那么只需要在数据库中删除掉这张外部表了,参考MOS的步骤如下:
1.定位外部表的文件路径

define owner
undefine table_pattern
select el.table_name, el.owner, dir.directory_path||'/'||dir.directory_name "path"
from dba_external_locations el, dba_directories dir
where el.owner like '%ETL_ADMIN%'
and el.directory_owner = dir.owner
and el.directory_name = dir.directory_name
order by 1, 2;

2.锁定收集统计信息或删除表

DBMS_STATS.LOCK_TABLE_STATS ('ownname','tabname');
AND/OR
DROP TABLE ownname.tabname;

上一篇:Oracle学习笔记之12C中的PDB自启动


下一篇:Redis学习笔记之有序集合