天天看點

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;