通過健康檢查讓妳的Oracle數據庫遠離損壞
俗話說 解決壹件事往往能有 種辦法 那麽我們如何按照這些方法去做?
甲骨文公司發布Oracle g時 在被稱作為健康監控器的框架下推出了數據庫健康檢查功能 在這個框架內健康檢查運行目的是診斷檢查妳的Oracle數據庫 它將監測數據庫的各個不同組成部分—主要是檢查損壞 包括物理和邏輯上的 雖然沒有 種方式 但甲骨文有的是 正如我們在過去關於自動診斷庫(Automatic Diagnostic Repository ADR)的文章上看到的那些 還試圖通過ADR執行和接入到健康檢查 然而 正如我們將看到 它也許不是最好的辦法做到這壹點
所以 在妳的數據庫中有數據文件 塊 撤消 重做 字典 或坐標系損壞嗎?妳實際上可能運行得很好 因此甚至我們不知道這些損壞的存在 正如我們將看到 在下面的例子中 我有壹個新安裝的Oracle並且有些損壞在其中 我真正地希望搜尋那些錯誤; 但那是在另壹天 當運行健康檢查 妳作為壹個數據庫管理員 可以決定是使用臨時模式還是使用完全反應模式運行 當以完全反應模式運行時會有人會抱怨錯誤訊息或妳可能會看到壹個Oracle警報警告運行健康檢查所出現的錯誤 妳還可以通過使用DBMS_HM PL/SQL軟件包進行健康檢查操作 依賴於這些是如何運行在妳的系統上 他們將花費多久 妳如何頻繁看到損壞信息 妳可能要安排這些作為壹個任務 不過 請註意 這是壹個新功能 並附帶所有其他的新功能 妳應該 %相信他們不會造成損壞或鎖定妳的系統 只要適當低測試和監視那些操作 同樣值得註意的是 這些健康檢查可以運行在在線和現有的據庫上 或者當數據庫是離線( NOMOUNT )時 由於有多種類型的健康檢查 因此有些健康檢查 只能運行在離線數據庫的上 舉例來說 重做完整性檢查只能是脫機運行 當仔細想想就能明白這其中的奧秘 不用進行各個不同的損壞/完整性檢查 妳可以使用下列SQL查看他們 它可以讓妳知道那些檢查是可以在線進行的 那些檢查是要在脫機的情況下進行的
?SQL> SELECT name internal_check offline_capable description FROM v$hm_check; NAME I O DESCRIPTION HM Test Check Y Y Check for HM Functionality DB Structure Integrity Check N Y Checks integrity of all database files Data Block Integrity Check N Y Checks integrity of a datafile block Redo Integrity Check N Y Checks integrity of redo log content Logical Block Check Y N Checks logical content of a block Transaction Integrity Check N N Checks a transaction for corruptions Undo Segment Integrity Check N N Checks integrity of an undo segment All Control Files Check Y Y Checks all control files in the database CF Member Check Y Y Checks a multiplexed copy of the control file All Datafiles Check Y Y Check for all datafiles in the database Single Datafile Check Y Y Checks a datafile Log Group Check Y Y Checks all members of a log group Log Group Member Check Y Y Checks a particular member of a log group Archived Log Check Y Y Checks an archived log Redo Revalidation Check Y Y Checks redo log content IO Revalidation Check Y Y Checks file accessability Block IO Revalidation Check Y Y Checks file accessability Txn Revalidation Check Y N Revalidate corrupted txn Failure Simulation Check Y Y Creates dummy failures Dictionary Integrity Check N N Checks dictionary integrity 由於壹些健康檢查需要額外的輸入參數 為了簡便起見 我決定只演示那裏有不需要輸入參數的檢查 如果妳想要看看那些需要輸入參數的檢查 妳可以執行下列SQL中 我在Oracle文件中發現的
?SELECT c name check_name p name parameter_name p type p default_value p description FROM v$hm_check_param p v$hm_check c WHERE p check_id = c id and c internal_check = N ORDER BY c name; 我不知道我已經遭遇多少次字典問題 從字典表的錯誤信息到鎖定問題 所以我對字典完整性檢查比較興奮 字典完整性檢查將檢查字典的核心對象完整性 包括 tab$ clu$ fet$ uet$ seg$ undo$ ts$ file$ obj$ ind$ icol$ col$ user$ con$ cdef$ ccol$ bootstrap$ objauth$ ugroup$ tsq$ syn$ view$ typed_view$ superobj$ seq$ lob$ coltype$ subcoltype$ ntab$ refcon$ opqtype$ dependency$ access$ viewcon$ icoldep$ dual$ sysauth$ objpriv$ defrole$ 和 ecol$ 這是我很關心的壹個很好很長的列表 以及檢查應該看看字典的條目內容 制約因素和參照完整性
通過手動運行字典完整性檢查 我們需要分配下列DBMS_HM RUN_CHECK PL/SQL軟件包—給予該操作額外的名稱 在這個例子中 我將命名我的操作為DICTIONARY_CHECK_
?BEGIN DBMS_HM RUN_CHECK( Dictionary Integrity Check DICTIONARY_CHECK_ ); END; /現在 這是它得到壹些有趣的 DBMS_HM RUN_CHECK在ADR存貯其相關信息 因此使用DBMS_HM PL/SQL軟件包或ADRCI功能生成的報告 對我來說 當DBMS_HM PL/SQL軟件包將以HTML XML或文本格式輸出報告時 我們已經沒有多少選擇 因為ADRCI功能只以XML的形式輸出報告 然而 我們通過對比這兩種方法能使我們看到ADR存在的不足以及知道ADR和DBMS_HM在什麽地方功能有重疊
由於DBMS_HM RUN_CHECK將其信息存儲在ADR中 我們可以很容易地看到HM_RUN 通過輸入下列ADRCI命令
?adrci> show hm_run ADR Home = /opt/app/oracle/diag/rdbms/db fs/db FS: ***************************************************** ********************************************************** HM RUN RECORD ********************************************************** RUN_ID RUN_NAME DICTIONARY_CHECK_ CHECK_NAME Dictionary Integrity Check NAME_ID MODE START_TIME : : : RESUME_TIME END_TIME : : : MODIFIED_TIME : : : TIMEOUT FLAGS STATUS SRC_INCIDENT_ID NUM_INCIDENTS ERR_NUMBER REPORT_FILE
這最顯著的信息 或缺失信息 是REPORT_FILE為 此欄只有當報告生成時才能被填充 建立壹個報告可以通過DBMS_HM包或通過ADRCI的 CREATE REPORT命令
使用DBMS_HM包
?SET LONG SET LONGCHUNKSIZE SET PAGESIZE SET LINESIZE SELECT DBMS_HM GET_RUN_REPORT( DICTIONARY_CHECK_ ) FROM DUAL;
使用ADRCI CREATE REPORT命令 ?
?CREATE REPORT hm_run DICTIONARY_CHECK_ When using the DBMS_HM package the output looks like: 當使用DBMS_HM包時輸出結果如下 DBMS_HM GET_RUN_REPORT( DICTIONARY_CHECK_ ) Basic Run Information Run Name : DICTIONARY_CHECK_ Run Id : Check Name : Dictionary Integrity Check Mode : MANUAL Status : PLETED Start Time : : : : End Time : : : : Error Encountered : Source Incident Id : Number of Incidents Created : Input Paramters for the Run TABLE_NAME=ALL_CORE_TABLES CHECK_MASK=ALL Run Findings And Remendations Finding Finding Name : Dictionary Inconsistency Finding ID : Type : FAILURE Status : OPEN Priority : CRITICAL Message : SQL dictionary health check: file$ pk on object FILE$ failed Message : Damaged rowid is AAAAARAABAAAAByAAF description: No further damage description available Finding Finding Name : Dictionary Inconsistency Finding ID : Type : FAILURE Status : OPEN Priority : CRITICAL Message : SQL dictionary health check: dependency$ dobj# fk on object DEPENDENCY$ failed Message : Damaged rowid is AAAABnAABAAAOiHABI description: No further damage description available Finding Finding Name : Dictionary Inconsistency Finding ID : Type : FAILURE Status : OPEN Priority : CRITICAL Message : SQL dictionary health check: dependency$ dobj# fk on object DEPENDENCY$ failed Message : Damaged rowid is AAAABnAABAAAQXqAA description: No further damage description available
運行後DBMS_HM包或ADRCI 的CREATE REPORT命令後 我們可以重新輸入ADRCI顯示hm_run命令 現在可以看到REPORT_FILE信息被填充了
REPORT_FILE /opt/app/oracle/diag/rdbms/db fs/db FS/hm/HMREPORT_DICTIONARY_CHECK_ hm
當使用ADRCI功能 妳必須先運行生成報告文件的命令 如果該文件不存在 那麽運行另壹個命令 以顯示其內容 妳還可以查看該報告通過ADRCI輸入以下命令 因為輸出的結果在XML文檔中 因此它不會在這裏顯示
show report hm_run DICTIONARY_CHECK_
lishixinzhi/Article/program/Oracle/201311/18140