最近測試伺服器在遷移後,每天的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中,是這樣介紹錯誤原因的:
内部表檔案丢失,但是資料庫字典資訊中由于某些原因沒有及時更新,仍然保留着内部表的資訊。當用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;