一次ORA-00704的處理

action929發表於2009-10-20

一次ORA-00704的處理

[@more@]

今天早上,發現有個資料庫無法啟動了,錯誤資訊如下:
102db]$ sqlplus "/as sysdba"
SQL*Plus: Release 10.2.0.1.0 - Production on 星期日 10月 18 00:18:27 2009
Copyright (c) 1982, 2005, Oracle. All rights reserved.
已連線到空閒例程。
SQL> startup
ORACLE 例程已經啟動。
Total System Global Area 536870912 bytes
Fixed Size 1220432 bytes
Variable Size 150995120 bytes
Database Buffers 381681664 bytes
Redo Buffers 2973696 bytes
資料庫裝載完畢。
ORA-01092: ORACLE 例項終止。強制斷開連線

看日誌中的錯誤資訊:
SMON: enabling cache recovery
Sun Oct 18 01:15:31 2009
Errors in file /u01/oracle/102db/admin/hectrain/udump/hectrain_ora_12850.trc:
ORA-00704: 載入程式程式失敗
ORA-39700: 必須用 UPGRADE 選項開啟資料庫
Sun Oct 18 01:15:31 2009
Error 704 happened during db open, shutting down database
USER: terminating instance due to error 704
Instance terminated by USER, pid = 12850
ORA-1092 signalled during: ALTER DATABASE OPEN...

看.trc檔案中的錯誤資訊:
[oracle@mas238 bdump]$ cat /u01/oracle/102db/admin/hectrain/udump/hectrain_ora_12789.trc
/u01/oracle/102db/admin/hectrain/udump/hectrain_ora_12789.trc
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
ORACLE_HOME = /u01/oracle/102db
System name: Linux
Node name: mas238
Release: 2.6.9-42.ELsmp
Version: #1 SMP Wed Jul 12 23:27:17 EDT 2006
Machine: i686
Instance name: hectrain
Redo thread mounted by this instance: 1
Oracle process number: 13
Unix process pid: 12789, image: (TNS V1-V3)

*** SERVICE NAME:(SYS$USERS) 2009-10-18 01:05:23.436
*** SESSION ID:(1645.3) 2009-10-18 01:05:23.436
ORA-00704: 載入程式程式失敗
ORA-39700: 必須用 UPGRADE 選項開啟資料庫

用 startup upgrade 確實可以啟動資料庫。
網上查詢了下資料,一般這種錯誤是由於升級了資料庫軟體,而沒有升級資料庫的系統字典表導致的。

但是我不是這種情況,分析下,之前系統出現過異常,資料庫異常關閉過,難道是字典表的資料異常導致的錯誤?
修改 initxxx.ora檔案,增加引數 sql_trace = true
然後再次執行 startup 啟動資料庫,檢視錯誤資訊中.trc檔案
.tra檔案的最後部分是:
PARSING IN CURSOR #5 len=63 dep=1 uid=0 oct=3 lid=0 tim=1226366925317451 hv=3748897726 ad='3fb20db8'
SELECT NULL FROM REGISTRY$ WHERE CID='CATPROC' AND VERSION = :1
END OF STMT
PARSE #5:c=13998,e=13389,p=11,cr=24,cu=0,mis=1,r=0,dep=1,og=4,tim=1226366925317444
EXEC #5:c=0,e=325,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,tim=1226366925317846
FETCH #5:c=1000,e=707,p=2,cr=3,cu=0,mis=0,r=0,dep=1,og=4,tim=1226366925318582
STAT #5 id=1 cnt=0 pid=0 pos=1 obj=891 op='TABLE ACCESS FULL REGISTRY$ (cr=3 pr=2 pw=0 time=708 us)'
ORA-00704: 載入程式程式失敗
ORA-39700: 必須用 UPGRADE 選項開啟資料庫
EXEC #1:c=287956,e=1487908,p=34,cr=544,cu=0,mis=0,r=0,dep=0,og=1,tim=1226366926337645
ERROR #1:err=1092 tim=433413726
說明是執行 SELECT NULL FROM REGISTRY$ WHERE CID='CATPROC' AND VERSION = :1 之後出問題了,導致載入程式程式失敗,我將資料庫用 startup upgrade 啟動起來,然後執行 SELECT NULL FROM REGISTRY$ WHERE CID='CATPROC',發現沒有抱錯,但是沒有記錄,所以我到一個好的資料庫中查詢了 SELECT * FROM REGISTRY$ WHERE CID='CATPROC' 發現是有記錄的,懷疑問題就出在這裡 沒有找到 CATPROC 的記錄導致 資料庫載入程式程式失敗。
查了下 rdbms/admin 下的.sql 指令碼,看到有個 catproc.sql 指令碼是關於 CATPROC 的建立指令碼
在 upgrade 啟動之後,重新執行了 catproc.sql 指令碼,然後關閉資料庫,再啟動成功。
趕緊備份下,問題解決。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/133835/viewspace-1027982/,如需轉載,請註明出處,否則將追究法律責任。

相關文章