Oracle後設資料物件Invalid修復過程
在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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 伺服器斷電Oracle資料庫修復資料過程伺服器Oracle資料庫
- 【資料庫資料恢復】透過恢復NDF檔案修復資料庫的資料恢復過程資料庫資料恢復
- Jtti:如何修復Oracle資料庫執行過程的問題JttiOracle資料庫
- Oracle 業務資料unload恢復過程Oracle
- 資料恢復記錄:硬碟分割槽損壞修復SqlServer資料庫過程資料恢復硬碟SQLServer資料庫
- 一次Oracle資料庫恢復過程Oracle資料庫
- 資料分析過程中後設資料該如何管理
- 資料庫恢復過程資料庫
- OS 刪除oracle資料檔案恢復過程Oracle
- MySQL資料庫INNODB表損壞修復處理過程分享MySql資料庫
- Oracle資料庫壞塊修復Oracle資料庫
- tinker熱修復——資源補丁載入過程
- DUL恢復資料庫過程資料庫
- ORACLE中修復資料塊損壞Oracle
- 資料庫修復資料恢復資料庫資料恢復
- 【資料庫資料恢復】透過資料頁恢復Sql Server資料庫資料的過程資料庫資料恢復SQLServer
- 儲存崩潰資料恢復過程;資料恢復案例資料恢復
- 儲存硬碟故障後強制上線恢復所有資料過程硬碟
- 伺服器癱瘓後的初檢和資料恢復過程伺服器資料恢復
- oracle goldengate 恢復過程OracleGo
- Oracle中truncate table後的資料恢復(Oracle資料恢復工具-ODU)Oracle資料恢復
- vsan儲存資料恢復過程—虛擬機器故障恢復過程資料恢復虛擬機
- Oracle資料庫啟動過程Oracle資料庫
- oracle 寫入資料的過程Oracle
- 資料庫的一次資料恢復過程資料庫資料恢復
- ORACLE 11G透過SCN做增量備份修復standby庫詳細過程Oracle
- ORACLE 11G通過SCN做增量備份修復standby庫詳細過程Oracle
- Checkpoint log:invalid bitmap page錯誤修復
- Oracle中匯出修復資料塊損壞Oracle
- Oracle中模擬修復資料塊損壞Oracle
- 伺服器Oracle資料庫損壞修復伺服器Oracle資料庫
- MySQL資料庫表損壞後的修復方法MySql資料庫
- MySQL GTID複製中斷修復過程MySql
- 檔案系統修復的一個過程
- tinker熱修復——dex補丁載入過程
- raid5硬碟掉線,重建raid並同步資料後恢復資料過程AI硬碟
- 勒索病毒資料修復恢復
- 資料庫開發---常用物件-儲存過程資料庫物件儲存過程