Oracle後設資料物件Invalid修復過程

realkid4發表於2012-06-25

 

Oracle的執行過程中,由於操作失誤可能會造成內部後設資料的損壞,進而影響到系統的一些基礎功能和正常處理。一旦發生這種故障,對內部資料字典的重建就是我們需要進行的處理。

 

本篇從一個損壞故障為入手點,介紹瞭如何進行Oracle後設資料物件的重建。

 

1、故障場景

 

一個朋友的測試庫最近出現很多“古怪”的錯誤,比如exp/imp操作異常中斷、pl/sql中後設資料資訊無法展現和異常報錯。這種情況下,筆者向朋友索要的對應的alert_log日誌檔案。結果發現很多錯誤資訊。

 

Sat Jun 23 06:36:37 2012

Errors in file /u01/diag/rdbms/wilson/wilson/trace/wilson_m001_3667.trc:

ORA-00604: error occurred at recursive SQL level 1

ORA-04063: package body "SYS.PRVT_HDM" has errors

ORA-06508: PL/SQL: could not find program unit being called: "SYS.PRVT_HDM"

ORA-06512: at line 1

(篇幅原因,有省略…..

Sat Jun 23 06:53:39 2012

Exception [type: SIGSEGV, Address not mapped to object] [ADDR:0x34] [PC:0x92C0E13, kzpchkc()+4425] [flags: 0x0, count: 1]

Errors in file /u01/diag/rdbms/wilson/wilson/trace/wilson_ora_3619.trc  (incident=12215):

ORA-07445: 出现异常错误: 核心转储 [kzpchkc()+4425] [SIGSEGV] [ADDR:0x34] [PC:0x92C0E13] [Address not mapped to object] []

Incident details in: /u01/diag/rdbms/wilson/wilson/incident/incdir_12215/wilson_ora_3619_i12215.trc

Sat Jun 23 06:53:40 2012

Trace dumping is performing id=[cdmp_20120623065340]

Sat Jun 23 06:53:45 2012

Sweep [inc][12215]: completed

Sweep [inc2][12215]: completed

Sat Jun 23 06:55:23 2012

ORA-942 encountered when generating server alert SMG-4120

ORA-942 encountered when generating server alert SMG-4121

 

 

如此型別的錯誤資訊,遍佈在近幾天錯誤日誌中。但執行一些失敗的命令時(如desc),還會有異常錯誤資訊在日誌中展現。

 

在上面的錯誤日誌中,還有是關於MMON程式異常中斷之後,反覆重新啟動。

MMON程式是AWR報告庫收集程式,定期(每小時)收集系統狀態儲存在資料庫字典中。MMON異常中斷後反覆重啟,似乎意味著AWR收集受到影響。

 

和朋友聯絡,獲取進一步資訊。

 

當日的AWR snapshot只有兩條,看來真正出現了問題。同時,發現自動作業中的sys.standard包失效(invalid),合併的還有很多包和方法失效。

 

經過朋友回憶,應該是執行了exp/imp的重置指令碼catexp.sql。看來是該指令碼在執行中,破壞了內部的字典資訊和資料,導致了一系列問題。

 

2、問題解決準備

 

發現了問題的根源,我們就可以有解決問題的基本思路:重新建立資料字典檢視和程式物件。我們在Oracle程式安裝目錄中,均有儲存建庫指令碼和程式,所以可以呼叫對應指令碼,來更新資料字典和程式物件。

 

由於處理資訊比較敏感,所以在處理之前,要進行一次完全備份。筆者選擇停機冷備的方法。

 

首先,定位控制檔案和資料檔案位置資訊,準備複製。

 

 

[root@bsplinux /]# chown -R oracle:oinstall backup

[root@bsplinux /]# ls -l | grep backup

drwxr-xr-x  2 oracle oinstall  4096 Jun 25 20:23 backup

 

--控制檔案

SQL> select 'cp '||name||' /backup' from v$controlfile;

'CP'||NAME||'/BACKUP'

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

cp /u01/app/oradata/ORA11G/controlfile/o1_mf_7vpyvypo_.ctl /backup

cp /u01/app/flash_recovery_area/ORA11G/controlfile/o1_mf_7vpyw16z_.ctl /backup

 

--資料檔案

SQL> select 'cp '||file_name||' /backup' from dba_data_files;

'CP'||FILE_NAME||'/BACKUP'

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

cp /u01/app/oradata/ORA11G/datafile/o1_mf_users_7vpyc2xd_.dbf /backup

cp /u01/app/oradata/ORA11G/datafile/o1_mf_undotbs1_7vpyc2py_.dbf /backup

cp /u01/app/oradata/ORA11G/datafile/o1_mf_sysaux_7vpyc2hb_.dbf /backup

cp /u01/app/oradata/ORA11G/datafile/o1_mf_system_7vpyc1x7_.dbf /backup

 

 

之後,關機將檔案複製到備份目錄上。

 

 

[oracle@bsplinux ~]$ sqlplus /nolog

SQL*Plus: Release 11.2.0.1.0 Production on Mon Jun 25 20:42:06 2012

Copyright (c) 1982, 2009, Oracle.  All rights reserved.

 

SQL> conn / as sysdba

Connected.

SQL> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL>

 

 

使用生成指令碼語句,實現複製。

 

 

[oracle@bsplinux backup]$ ls -l

total 1720628

-rw-r----- 1 oracle oinstall   9748480 Jun 25 20:44 o1_mf_7vpyvypo_.ctl

-rw-r----- 1 oracle oinstall   9748480 Jun 25 20:44 o1_mf_7vpyw16z_.ctl

-rw-r----- 1 oracle oinstall 723525632 Jun 25 20:55 o1_mf_sysaux_7vpyc2hb_.dbf

-rw-r----- 1 oracle oinstall 744497152 Jun 25 21:08 o1_mf_system_7vpyc1x7_.dbf

-rw-r----- 1 oracle oinstall 267395072 Jun 25 20:47 o1_mf_undotbs1_7vpyc2py_.dbf

-rw-r----- 1 oracle oinstall   5251072 Jun 25 20:45 o1_mf_users_7vpyc2xd_.dbf

 

 

冷備份完成。

 

注意:在進行所有的修復操作前,如果有可能,一定要進行資料現場保留備份!這樣起碼可以做到不會將情況惡化。

 

3、恢復後設資料資訊

 

下面就可以執行相關的指令碼,來恢復資料物件。首先,需要將資料庫啟動到upgrade模式。

 

 

SQL> conn / as sysdba

Connected to an idle instance.

SQL> startup upgrade

ORACLE instance started.

 

Total System Global Area  422670336 bytes

Fixed Size                  1336960 bytes

Variable Size             318769536 bytes

Database Buffers           96468992 bytes

Redo Buffers                6094848 bytes

Database mounted.

Database opened.

SQL>

 

 

資料字典和基礎程式相關的是三個程式指令碼,按照順序分別執行。

 

 

SQL> spool res.log

SQL> @?/rdbms/admin/catalog.sql

SQL> @?/rdbms/admin/catproc.sql

SQL> @?/rdbms/admin/utlrp.sql

 

 

三個程式的作用是:catalog.sql負責建立基礎資料檢視物件,catproc.sql負責建立基礎程式包,而utlrp.sql負責將相關的程式進行編譯處理。

 

完成之後,如果沒有明顯的錯誤,就可以重新啟動系統。

 

 

SQL> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup

ORACLE instance started.

 

Total System Global Area  422670336 bytes

Fixed Size                  1336960 bytes

Variable Size             327158144 bytes

Database Buffers           88080384 bytes

Redo Buffers                6094848 bytes

Database mounted.

Database opened.

SQL>

 

 

 

4、總結

 

在進行處理的時候,有一個重要問題需要注意。我們執行的指令碼,一定是伺服器端上的Oracle程式目錄對應的指令碼檔案,而不是客戶端對應的指令碼檔案。因為版本的原因,我們往往客戶端版本與伺服器不匹配。特別是程式指令碼,如果存在版本差異,甚至會引起更大規模的錯誤故障。

 

 

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

相關文章