Oracle後設資料重構實驗
後設資料是幾乎所有資料庫都具有的基礎資料,其中包括基礎資料字典、系統功能檢視和函式結構等內容。越是功能強大成熟的資料庫產品,其後設資料資訊越是眾多複雜。在Oracle世界中,我們經常使用的效能工具AWR、作業Scheduler和RMAN工具,甚至Data Pump工具,都是建立在資料字典的基礎上。
大部分資料字典是在sys和system使用者schema下,普通使用者只是透過同義詞呼叫和訪問物件,刪除破壞的風險的是比較低的。在實踐工作中,主要有兩種情況會破壞後設資料:管理員帳號誤操作和系統內部執行資料損壞。無論是哪一種情況,後設資料損壞的故障通常是很麻煩的,越是基礎的後設資料損壞,故障現象就越是緊急複雜和多變。
資料庫元件之間,存在嚴格的依賴關係。一個基礎後設資料損壞,可能導致若干依賴的元件不能成功編譯使用。如果是一些單純的元件,如XDB、Data 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle asm 資料塊重構恢復OracleASM
- MySQL、Oracle後設資料抽取分析MySqlOracle
- 資料結構,雜湊表hash設計實驗資料結構
- 資料結構實驗(4)資料結構
- 資料結構實驗1資料結構
- 資料治理實踐:後設資料管理架構的演變架構
- Oracle實驗6--掌握Oracle資料庫的日誌操作Oracle資料庫
- ORACLE資料校驗文件Oracle
- oracle刪除重資料方法Oracle
- 資料結構實驗課五-1資料結構
- 資料結構實驗三:線性表綜合實驗資料結構
- 資料結構實驗三 2024_樹與圖實驗資料結構
- 資料治理之後設資料管理實踐
- Oracle:重複資料去重,只取最新的一條資料Oracle
- 資料庫實驗五:資料庫程式設計資料庫程式設計
- 資料庫實驗八 資料庫程式設計資料庫程式設計
- MySQL和Oracle的後設資料抽取例項分析KRGXMySqlOracle
- SACC2017:資料庫架構設計與實踐的後半生資料庫架構
- 資料結構實驗 多維陣列的實現資料結構陣列
- 資料結構實驗 二維矩陣的實現資料結構矩陣
- 資料治理--後設資料
- 【Oracle 12c資料庫支援閃回庫功能】實驗Oracle資料庫
- 資料結構實驗:連結串列的應用資料結構
- 《資料結構》實驗08--樹及其應用資料結構
- 信管117128許盛迪資料結構實驗一資料結構
- Oracle insert大量資料經驗之談Oracle
- mybatis oracle資料庫批次插入資料,忽略主鍵重複MyBatisOracle資料庫
- Oracle資料庫實訓後的大三上總結Oracle資料庫
- 資料結構實驗之連結串列七:單連結串列中重複元素的刪除資料結構
- 重學資料結構之棧資料結構
- 重學資料結構(二、棧)資料結構
- 重溫資料結構系列--樹資料結構
- 重學資料結構(七、圖)資料結構
- 前端資料校驗後,後端介面是否需要再次校驗?前端後端
- 【Oracle設定bct備份,效率有多高】實驗Oracle
- (C++)資料結構實驗二——迷宮問題C++資料結構
- 資料結構實驗5、鏈佇列的基本操作資料結構佇列
- 資料結構實驗之連結串列八:Farey序列資料結構
- ORACLE批量刪除無主鍵重複資料Oracle