天天看點

ORA-20000故障排除手記

ORA-20000故障排除手記

1、發現故障。

   在Oracle10.2.0.1的alert.log檔案中發現如下錯誤。

Wed Jul  8 22:00:08 2009

Errors in file /export/home/oracle/admin/ora10g/bdump/ora10g_j000_1472.trc:

ORA-12012: error on auto execute of job 8888

ORA-20000: ORA-20000: Content of the tablespace specified is not permanent or tablespace name is invalid

ORA-06512: at "SYS.PRVT_ADVISOR", line 1624

ORA-06512: at "SYS.DBMS_ADVISOR", line 186

ORA-06512: at "SYS.DBMS_SPACE", line 1338

ORA-06512: at "SYS.DBMS_SPACE", line 1554

    仔細檢查,幾乎每天晚上10點都報這個錯。顯然是某個job出錯了。

2、檢視trc檔案,發現如下錯

*** ACTION NAME:(AUTO_SPACE_ADVISOR_JOB) 2009-07-07 22:00:08.968

*** MODULE NAME:(DBMS_SCHEDULER) 2009-07-07 22:00:08.968

*** SERVICE NAME:(SYS$USERS) 2009-07-07 22:00:08.968

*** SESSION ID:(1005.30306) 2009-07-07 22:00:08.968

是Oracle AUTO_SPACE_ADVISOR_JOB任務。

3、再現并驗證錯誤

SQL> exec dbms_space.auto_space_advisor_job_proc;

BEGIN dbms_space.auto_space_advisor_job_proc; END;

*

ERROR at line 1:

ORA-20000: Content of the tablespace specified is not permanent or tablespace

name is invalid

ORA-06512: at "SYS.PRVT_ADVISOR", line 1624

ORA-06512: at "SYS.DBMS_ADVISOR", line 186

ORA-06512: at "SYS.DBMS_SPACE", line 1338

ORA-06512: at "SYS.DBMS_SPACE", line 1554

ORA-06512: at line 1

    果然出現同樣的錯誤。

4、找出問題表空間名:參見( otn的一篇文章 )

SQL> select distinct tablespace_name from DBA_AUTO_SEGADV_CTL;

TABLESPACE_NAME

------------------------------

TBS_DNINMSV30

...

SQL> select tablespace_name from dba_tablespaces;

TABLESPACE_NAME

------------------------------

...

TBS_DNINMSV3

果然,存在不一緻情況(這是Oracle的一個Bug所緻,Oracle10.2.0.1沒有自動的更新字典表)。

繼續

SQL> select count(*) from DBA_AUTO_SEGADV_CTL where tablespace_name = ' TBS_DNINMSV3 ';

COUNT(*)

1

SQL> select segment_owner, segment_name, status from DBA_AUTO_SEGADV_CTL where tablespace_name=' TBS_DNINMSV3 ';

SEGMENT_OWNER SEGMENT_NAME STATUS

BEING_PROCESSED

5、三步搞定,解決問題 ( 參考文檔 )

建立DBA_AUTO_SEGADV_CTL中存在,但實際卻不存在的表空間(100K就夠了,目的也就是借用它的“名字”):

    create tablespace TBS_DNINMSV30 datafile '/export/home/oracle/tmp/dninsmv30temp.dbf' size 100k;

運作

    exec dbms_space.auto_space_advisor_job_proc;   ----果然不報錯了

删除表空間

    drop tablespace TBS_DNINMSV30

6、再次驗證

運作

    exec dbms_space.auto_space_advisor_job_proc;   ----依然不報錯,說明問題解決。

另注:

直接删除DBA_AUTO_SEGADV_CTL中的條目是是不可以的。

delete DBA_AUTO_SEGADV_CTL where tablespace_name='TBS_DNINMSV30';

一旦運作exec dbms_space.auto_space_advisor_job_proc; TBS_DNINMSV30又會出現