【蓋國強】成功恢復案例:解決字典表誤Truncate故障

idba發表於2008-04-10
昨天,成功幫助客戶恢復了一個故障資料庫。

故障的原因是技術人員將資料庫中的幾個資料字典表Truncate掉,這直接導致了資料庫不可用。
資料庫環境為Oracle 9.2.0.7 RAC環境。由於資料庫的事務量巨大,所以資料庫沒有備份。

現場檢查確認,主要被截斷的表有這樣一些
SQL> select object_name,object_type from dba_objects where object_name like 'IDL%';

OBJECT_NAME                    OBJECT_TYPE
------------------------------ ------------------
IDL_CHAR$                      TABLE
IDL_SB4$                      TABLE
IDL_UB1$                      TABLE
IDL_UB2$                      TABLE

關於IDL_UB1$表,我以前討論過,這是非常重要的字典表,一旦出現故障,資料庫會出現大量的ORA-00600錯誤,所有事務不能進行:
ORA-00600: internal error code, arguments: [17069], [0xC0000000DDDFA690], [], [], [], [], [], []

ORA-600 17069錯誤是最頭疼的,客戶當時資料庫的一個跟蹤日誌已經暴漲到5G左右。

IDL系列字典表是記錄資料庫物件編譯資訊的,丟失了其中的資料,所有過程、Package等都將無法執行。
摘引一點關於這幾個字典表作用的說明:
IDL_UB1$ is one of four tables that hold compiled PL/SQL code:

IDL_UB1$
IDL_CHAR$
IDL_UB2$
IDL_SB4$

"PL/SQL is based on the programming language Ada. As a result, PL/SQL uses a
variant of Descriptive Intermediate Attributed Notation for Ada (DIANA), which
is a tree-structured intermediate language. It is defined using a meta-notation
called Interface Definition Language (IDL). DIANA provides for communication
internal to compilers and other tools.

"At compile time, PL/SQL source code is translated into machine-readable
m-code.Both the DIANA and m-code for a procedure or package are stored in the
database.At run time, they are loaded into the shared (memory) pool. The DIANA is
used to compile dependent procedures; the m-code is simply executed."

These four tables hold the DIANA and the so-code m-code. I think "m-code" is
short for machine-dependent byte code but there is a sizable machine-indenpendent part as well. If you have a look at sql.bsq, you can see
that Oracle documents the "type" column of these tables as follows:

part number not null,
/* part: 0 = diana, 1 = portable pcode, 2 = machine-dependentpcode */

更嚴重的情況可能會導致大量系統DBMS包失效,其重新編譯將更加複雜。

恢復進行了6個小時,成功幫助使用者恢復了資料庫,消除了所有ORA-600錯誤。
恢復最主要的是通過執行相關的指令碼,重建和重新編譯所有Procedure/Trigger/Package等物件,重新生成這些物件的DIANA和so-code m-code,這些主要的指令碼包括catlog.sql,catproc.sql等。

當然最重要的是,一些ORA-00600錯誤需要解決,這可能會花費大量的時間。

這一案例的恢復過程並不重要,重要的是DBA應該學會永遠不要讓我們的資料庫置於這樣的危險境地。
DBA四大守則之一:備份重於一切

DBA的基本素質之一:嚴謹

-The End-

作者:eygle | English Version 版權宣告:轉載時請務必以超連結形式標明文章和作者資訊及本宣告
連結:

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

相關文章