程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> 字典表誤Truncate故障成功恢復案例

字典表誤Truncate故障成功恢復案例

編輯:Oracle數據庫基礎

昨天,成功幫助客戶恢復了一個故障數據庫。

故障的原因是技術人員將數據庫中的幾個數據字典表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-

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved