--**********************
-- DBVERIFY 工具的使用
--**********************
Oracle 資料庫運行過程中由於硬體故障或作業系統故障導致導致Oracle無法以Oracle格式來識別或所包含的內容即為出現資料區塊損壞
故障,這個壞塊可以分為介質損壞以及邏輯損壞。下面給出了塊的檢查,以及使用DBVERIFY 工具實施塊檢查。
一、塊檢查
1.何時檢查塊
當一個資料區塊被讀或寫的時候,將對塊的進行一致性檢查,檢查的內容包括
塊的版本
比較塊在cache與block buffer中的資料區塊地址
根據要求進行校正(checksum)
2.損壞的資料區塊的錯誤提示
可以從警示記錄檔中找到該錯誤提示,以及在會話中發現損壞的資料區塊時也會給出類似的提示
ORA-01578: ORACLE data block corrupted (file # 6, block # 11)
ORA-01110: data file 6: '/u01/app/oracle/oradata/orcl/tbs01.dbf'
3.與塊損壞的相關特性(幾種檢查工具)
------------------------------------------------------------------------------------------------
特性 壞塊偵測類型 能否修複損壞塊
------------------------------------------------------------------------------------------------
DBVERIFY 物理 否
ANALYZE 邏輯 否
DB_BLOCK_CHECKING 邏輯 否
DB_BLOCK_CHECKSUM 物理 否
exp 物理 否
FlashBack 邏輯 是
DBMS_REPAIR 邏輯 是
Block media recovery 未知 是
二、DBVERIFY工具介紹
特性
是一個運行於作業系統提示符下的外部程式,用於驗證資料檔案,檢查塊的一致性錯誤
僅僅針對資料檔案,能夠校正open階段的資料檔案以及shutdown狀態下的資料檔案
可以驗證複製的資料檔案,也可以驗證備份的鏡像副本
不支援聯機記錄檔,控制檔案,歸檔日誌,RMAN備份組驗證
被驗證的檔案可以位於檔案系統,ASM磁碟或原始裝置
在Unix系統中位於:$ORACLE_HOME/bin/dbv
在Windows系統中位於:%ORACLE_HOME%/bin/dbv.exe
對於DBVERIFY工具,高版本可以自動識別低版本資料庫,比如11g的dbv訪問9i的資料庫,但是低版本的dbv訪問高版本會報錯
三、DBVERIFY工具用法
1.擷取dbv的協助資訊,直接在提示符下輸入dbv即可 或者輸入dbv help=y
[oracle@oradb orcl]$ dbv
DBVERIFY: Release 10.2.0.4.0 - Production on Tue Oct 26 18:21:09 2010
Copyright (c) 1982, 2007, Oracle. All rights reserved.
Keyword Description (Default)
----------------------------------------------------
FILE File to Verify (NONE)
START Start Block (First Block of File)
END End Block (Last Block of File)
BLOCKSIZE Logical Block Size (8192)--指定資料檔案的尺寸,預設值為8192,對於非8192塊將收到DBV-00103錯誤
LOGFILE Output Log (NONE) --用於顯示驗證進度
FEEDBACK Display Progress (0)
PARFILE Parameter File (NONE) --可以指定參數檔案
USERID Username/Password (NONE) --校正段、ASM檔案需要使用
SEGMENT_ID Segment ID (tsn.relfile.block) (NONE) --校正段,需要資料表空間ID,資料檔案ID,段的頭部ID
HIGH_SCN Highest Block SCN To Verify (NONE)
(scn_wrap.scn_base OR scn)
2.校正online,offline資料檔案,使用下面的方法
dbv file=
[oracle@oradb orcl]$ dbv file=$ORACLE_BASE/oradata/orcl/tbs01.dbf
DBVERIFY: Release 10.2.0.4.0 - Production on Tue Oct 26 18:29:39 2010
Copyright (c) 1982, 2007, Oracle. All rights reserved.
DBVERIFY - Verification starting : FILE = /u01/app/oracle/oradata/orcl/tbs01.dbf
DBVERIFY - Verification complete
Total Pages Examined : 128 --校正的總頁面數,一個頁面即是一個資料區塊
Total Pages Processed (Data) : 96 --已處理的資料頁面數
Total Pages Failing (Data) : 0 --已處理資料頁面的失敗數
Total Pages Processed (Index): 1 --已處理的索引頁面數
Total Pages Failing (Index): 0 --已處理索引頁面失敗數
Total Pages Processed (Other): 31 --已處理的其它頁面數
Total Pages Processed (Seg) : 0
Total Pages Failing (Seg) : 0
Total Pages Empty : 0
Total Pages Marked Corrupt : 0
Total Pages Influx : 0
Highest block SCN : 1152518 (0.1152518)
注意:如果Total Pages Influx的值大於零,且未存在壞塊的情況下,是由於針對open狀態的檔案運行dbv
程式遇到了一個當前正在被DBWn進程寫入的資料區塊
[oracle@oradb orcl]$ dbv file=$ORACLE_BASE/oradata/orcl/tbs01.dbf feedback=1000
上面這句在執行時每驗證1000個塊將顯示一個"."號
--下面的校正發現了I/O錯誤
[oracle@oradb orcl]$ dbv file=/u01/app/oracle/oradata/orcl/tbs01.dbf
DBVERIFY: Release 10.2.0.4.0 - Production on Tue Oct 26 18:26:21 2010
Copyright (c) 1982, 2007, Oracle. All rights reserved.
DBV-00102: File I/O error on FILE (/u01/app/oracle/oradata/orcl/tbs01.dbf)
during end read operation (-1)
3.驗證指定段
該方法需要獲得段所在資料表空間的ID,段所在資料檔案的ID,段的頭部ID
如下面的查詢資料表空間的ID為7,檔案ID為6,段的頭部ID為35
sys@ORCL> select tablespace_id,tablespace_name,header_file,header_block
2 from sys_dba_segs
3 where segment_name='TB3';
TABLESPACE_ID TABLESPACE_NAME HEADER_FILE HEADER_BLOCK
------------- --------------- ----------- ------------
7 TBS1 6 35
注意:sys使用者的段可以查詢sys_user_segs,而普通使用者的段資訊,需要查詢sys_dba_segs
[oracle@oradb orcl]$ dbv userid=scott/tiger segment_id=7.6.35
DBVERIFY: Release 10.2.0.4.0 - Production on Tue Oct 26 18:50:01 2010
Copyright (c) 1982, 2007, Oracle. All rights reserved.
DBVERIFY - Verification starting : SEGMENT_ID = 7.6.35
DBVERIFY - Verification complete
Total Pages Examined : 8
Total Pages Processed (Data) : 5
Total Pages Failing (Data) : 0
Total Pages Processed (Index): 0
Total Pages Failing (Index): 0
Total Pages Processed (Other): 2
Total Pages Processed (Seg) : 1
Total Pages Failing (Seg) : 0
Total Pages Empty : 0
Total Pages Marked Corrupt : 0
Total Pages Influx : 0
Highest block SCN : 1152518 (0.1152518)
4.驗證複製的資料檔案或驗證備份的鏡像副本
RMAN> backup as copy datafile 6 --使用RMAN備份鏡像副本
2> format='/u01/app/oracle/bk/rmbk/cp_dfile6'
3> tag='Copy_datafile6';
[oracle@oradb orcl]$ dbv file=/u01/app/oracle/bk/rmbk/cp_dfile6
DBVERIFY: Release 10.2.0.4.0 - Production on Tue Oct 26 18:59:17 2010
Copyright (c) 1982, 2007, Oracle. All rights reserved.
DBVERIFY - Verification starting : FILE = /u01/app/oracle/bk/rmbk/cp_dfile6
DBVERIFY - Verification complete
Total Pages Examined : 128
Total Pages Processed (Data) : 96
Total Pages Failing (Data) : 0
Total Pages Processed (Index): 1
Total Pages Failing (Index): 0
Total Pages Processed (Other): 31
Total Pages Processed (Seg) : 0
Total Pages Failing (Seg) : 0
Total Pages Empty : 0
Total Pages Marked Corrupt : 0
Total Pages Influx : 0
Highest block SCN : 1152518 (0.1152518)
RMAN命令中的BACKUP VALIDATE DATABASE命令通常用於檢查全庫,該命令不產生任何備份組,可以通過
Validate命令來檢查是否能備份,如資料檔案是否存在,是否存在壞塊不能被備份,查詢檢視
v$database_block_corruption,此視圖將檢查過程中存在的壞塊
如使用下面的查詢
RMAN> backup validate database;
RMAN> backup validate database archivelog all;
sys@ORCL> select * from v$database_block_corruption;
no rows selected
視圖v$database_block_corruption將列出損壞的壞塊所在的檔案位置,損壞塊的起始位置,損壞快的大
小以及損壞類型如果上述視圖中發現了壞塊,則可以通過SQL查詢獲得壞塊所影響的範圍,以及確定壞塊
所影響的是索引段還是UNDO段
select owner,segment_name,segment_type from dba_extents where file_id= and
between block_id and block_id+blocks-1;
(和分別是ORA-01578報出的壞塊出現的檔案號和塊號)
下面使用rman 來修複受損的資料區塊
RMAN> run{
2> allocate channel ch1 device type disk;
3> blockrecover datafile 6 block 37;
4> release channel ch1;}
released channel: ORA_DISK_1
allocated channel: ch1
channel ch1: sid=139 devtype=DISK
Starting blockrecover at 26-OCT-10
starting media recovery
media recovery complete, elapsed time: 00:00:00
Finished blockrecover at 26-OCT-10
released channel: ch1
flasher@ORCL> alter table tb3 add constraint empno_tb3_pk
2 primary key(empno);
四、其它
1.事實上使用dbv工具可以對控制檔案進行驗證(資料庫處於OPEN狀態),參見下面的例子
[oracle10g:oracle:orcl]$ dbv file=control01.ctl
DBVERIFY: Release 10.2.0.4.0 - Production on Sun Jun 5 14:56:31 2011
Copyright (c) 1982, 2007, Oracle. All rights reserved.
DBV-00103: Specified BLOCKSIZE (8192) differs from actual (16384) --根據提示知道blocksize的值為16384
[oracle@oradb orcl]$ dbv file=control01.ctl blocksize=16384
DBVERIFY: Release 10.2.0.4.0 - Production on Sun Jun 5 14:53:01 2011
Copyright (c) 1982, 2007, Oracle. All rights reserved.
DBVERIFY - Verification starting : FILE = control01.ctl
DBVERIFY - Verification complete
Total Pages Examined : 404
Total Pages Processed (Data) : 0
Total Pages Failing (Data) : 0
Total Pages Processed (Index): 0
Total Pages Failing (Index): 0
Total Pages Processed (Other): 40
Total Pages Processed (Seg) : 0
Total Pages Failing (Seg) : 0
Total Pages Empty : 364
Total Pages Marked Corrupt : 0
Total Pages Influx : 0
Highest block SCN : 775 (65535.775)
2.對聯機記錄檔的驗證(資料庫處於OPEN狀態),不支援
[oracle10g:oracle:orcl]$ dbv file=redo01.log
DBVERIFY: Release 10.2.0.4.0 - Production on Sun Jun 5 15:01:09 2011
Copyright (c) 1982, 2007, Oracle. All rights reserved.
DBV-00103: Specified BLOCKSIZE (8192) differs from actual (512)
[oracle10g:oracle:orcl]$ dbv file=redo01.log blocksize=512 --可以執行,但出現下面很多的提示(介質錯誤)
Page 88441 is influx - most likely media corrupt
Corrupt block relative dba: 0x00015979 (file 0, block 88441)
Fractured block found during dbv:
Data in bad block:
type: 1 format: 2 rdba: 0x00015979
last change scn: 0x8010.00000010 seq: 0x51 flg: 0x55
spare1: 0x0 spare2: 0x0 spare3: 0x0
consistency value in tail: 0xc2037800
check value in block header: 0x108
computed block checksum: 0x0
oracle視頻教程請關注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html