Oracle後設資料重構實驗

realkid4發表於2015-10-04

 

後設資料是幾乎所有資料庫都具有的基礎資料,其中包括基礎資料字典、系統功能檢視和函式結構等內容。越是功能強大成熟的資料庫產品,其後設資料資訊越是眾多複雜。在Oracle世界中,我們經常使用的效能工具AWR、作業SchedulerRMAN工具,甚至Data Pump工具,都是建立在資料字典的基礎上。

 

大部分資料字典是在syssystem使用者schema下,普通使用者只是透過同義詞呼叫和訪問物件,刪除破壞的風險的是比較低的。在實踐工作中,主要有兩種情況會破壞後設資料:管理員帳號誤操作和系統內部執行資料損壞。無論是哪一種情況,後設資料損壞的故障通常是很麻煩的,越是基礎的後設資料損壞,故障現象就越是緊急複雜和多變。

 

資料庫元件之間,存在嚴格的依賴關係。一個基礎後設資料損壞,可能導致若干依賴的元件不能成功編譯使用。如果是一些單純的元件,如XDBData Pump的損壞,可以呼叫特定的建立指令碼重建物件。但是如果是一些基礎的元件錯誤,連帶骨牌效應,就需要重建資料字典了。

 

重建資料字典是需要終止暫停資料庫服務的,而且存在一定的風險,所以一定要慎重行事,選擇適當的時間視窗進行操作。本篇主要介紹11gR2環境下如何進行後設資料恢復。

 

1、環境說明

 

筆者使用Oracle 11gR2進行測試,版本編號為11.2.0.4

 

 

[oracle@localhost ~]$ sqlplus /nolog

 

SQL*Plus: Release 11.2.0.4.0 Production on Sun Sep 27 11:18:12 2015

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

 

 

在進行回覆之前,要繼續完善的備份操作,確保一旦操作失敗,起碼可以恢復到操作之前的情況,不會讓問題變得更糟。

 

備份手段很多,筆者使用冷備份手段。注意:如果我們可以實現shutdown immediate完全關閉,只需要關閉後備份資料檔案、控制檔案就可以了。

 

首先自動生成備份語句。

 

 

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

 

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

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

cp /u01/app/oradata/SICSDB/controlfile/o1_mf_b0m00wf1_.ctl /backup

cp /u01/app/fast_recovery_area/SICSDB/controlfile/o1_mf_b0m00wfq_.ctl /backup

 

 

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

 

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

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

cp /u01/app/oradata/SICSDB/datafile/o1_mf_users_b0lzzg2m_.dbf /backup

(篇幅原因,有省略……

cp /u01/app/oradata/SICSDB/datafile/o1_mf_uattestt_byr5560d_.dbf /backup

 

16 rows selected

 

 

關閉資料庫,最好是完全關閉。

 

 

[oracle@localhost ~]$ sqlplus /nolog

 

SQL*Plus: Release 11.2.0.4.0 Production on Sun Sep 27 11:08:58 2015

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

 

SQL> conn / as sysdba

Connected.

SQL> shutdown immediate;  

Database closed.

Database dismounted.

ORACLE instance shut down.

 

 

在作業系統層面執行語句。

 

 

[oracle@localhost ~]$ cp /u01/app/oradata/SICSDB/datafile/o1_mf_users_b0lzzg2m_.dbf /backup

(篇幅原因,有省略……

 [oracle@localhost ~]$ cd /backup/

[oracle@localhost backup]$ ls -l

total 33586456

-rw-r-----. 1 oracle oinstall    9748480 Sep 27 11:09 o1_mf_b0m00wf1_.ctl

-rw-r-----. 1 oracle oinstall    9748480 Sep 27 11:10 o1_mf_b0m00wfq_.ctl

(篇幅原因,有省略……

-rw-r-----. 1 oracle oinstall  406331392 Sep 27 11:10 o1_mf_users_b0lzzg2m_.dbf

 

 

完成了備份,就可以開始進行修復。

 

2、修復後設資料

 

首先啟動資料庫,進入upgrade模式。

 

 

[oracle@localhost ~]$ sqlplus /nolog

SQL*Plus: Release 11.2.0.4.0 Production on Sun Sep 27 11:18:12 2015

 

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

 

SQL> conn / as sysdba

Connected to an idle instance.

SQL> startup upgrade

ORACLE instance started.

 

Total System Global Area 5344731136 bytes

Fixed Size                  2262656 bytes

Variable Size            1207961984 bytes

Database Buffers         4127195136 bytes

Redo Buffers                7311360 bytes

Database mounted.

Database opened.

 

 

系列執行指令碼一共有三個,分別進行不同的資料建立。執行指令碼一定要在Server端進行,確保版本的一致性。首先執行catalog.sql指令碼。

 

 

SQL> spool test.log

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

 

Grant succeeded.

PL/SQL procedure successfully completed.

 

 

TIMESTAMP

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

COMP_TIMESTAMP CATALOG    2015-09-27 11:20:34

 

 

第二步執行catproc.sql指令碼。

 

 

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

 

PL/SQL procedure successfully completed.

 

SQL>

SQL> SELECT dbms_registry_sys.time_stamp('CATPROC') AS timestamp FROM DUAL;

 

TIMESTAMP

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

COMP_TIMESTAMP CATPROC    2015-09-27 11:29:12

 

1 row selected.

 

 

最後,重新編譯compile所有的物件。

 

 

SQL> SET SERVEROUTPUT OFF

 

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

 

DOC>

DOC>   1. Query showing jobs created by UTL_RECOMP

DOC>         SELECT job_name FROM dba_scheduler_jobs

DOC>            WHERE job_name like 'UTL_RECOMP_SLAVE_%';

DOC>

DOC>   2. Query showing UTL_RECOMP jobs that are running

DOC>         SELECT job_name FROM dba_scheduler_running_jobs

DOC>            WHERE job_name like 'UTL_RECOMP_SLAVE_%';

DOC>#

SQL>

SQL> DECLARE

  2     threads pls_integer := &&1;

  3  BEGIN

  4     utl_recomp.recomp_parallel(threads);

  5  END;

  6  /

 

 

 

在三個指令碼中,筆者認為第三個指令碼最重要。如果有元件在重構之後還存在問題,就體現在這個環節中。因為這個過程會將所有的後設資料物件依次並行進行編譯,如果元件有問題,是會有編譯故障的。我們從輸出的結果,可以看出是否是成功的。

 

如果有問題,通常第三個指令碼會有明確的錯誤列表。

 

 

SQL> EXECUTE dbms_registry_sys.validate_components;

FAILED CHECK FOR PACKAGE BODY CTX_ADM

Warning: XDB now invalid, invalid objects found:

object_name                                 object_type

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

DBMS_XDBZ0                                 PACKAGE BODY

DBMS_XDBZ                                  PACKAGE BODY

DBMS_XDB                                   PACKAGE BODY

DBMS_XDBUTIL_INT                           PACKAGE BODY

XDB$PATCHUPSCHEMA                             PROCEDURE

XDB$ACL_PKG_INT                            PACKAGE BODY

ORDIM INVALID OBJECTS: ORDIMAGE - INVALID - TYPE BODY

ORDIM INVALID OBJECTS: SI_STILLIMAGE - INVALID - TYPE BODY

ORDIM INVALID OBJECTS: ORDDICOM - INVALID - TYPE BODY

ORDIM INVALID OBJECTS: ORDPLSGWYUTIL - INVALID - PACKAGE BODY

ORDIM INVALID OBJECTS: ORDIMGSI_PKG - INVALID - PACKAGE BODY

ORDIM INVALID OBJECTS: ORD_DICOM_PKG - INVALID - PACKAGE BODY

ORDIM INVALID OBJECTS: ORD_DICOM_CT - INVALID - PACKAGE BODY

ORDIM INVALID OBJECTS: ORD_DICOM_ADMIN_PRV - INVALID - PACKAGE BODY

ORDIM INVALID OBJECTS: ORD_DICOM_ADMIN - INVALID - PACKAGE BODY

FAILED CHECK FOR FUNCTION APEX_APPLICATION_GET_PG_TNAME

 

PL/SQL procedure successfully completed.

 

 

完成了編譯之後,就可以重新啟動資料庫。如果沒有進一步的問題,就可以恢復使用。

 

 

[oracle@localhost backup]$ sqlplus /nolog

 

SQL*Plus: Release 11.2.0.4.0 Production on Sun Sep 27 11:42:52 2015

 

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

 

SQL> conn / as sysdba

Connected.

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup

ORACLE instance started.

 

Total System Global Area 5344731136 bytes

Fixed Size                  2262656 bytes

Variable Size            1207961984 bytes

Database Buffers         4127195136 bytes

Redo Buffers                7311360 bytes

Database mounted.

Database opened.

 

 

3、結論

 

重構資料庫後設資料,是我們修復一些資料庫故障的方法之一。但是,這種方法並不能完全解決所有後設資料問題。一些由於Oracle Bug潛在引起的問題,是不能透過這種途徑進行解決的。

 


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

相關文章