Oracle DBVERIFY 工具介紹
?
??? Oracle DBVERIFY是一個可以用來查看數據庫物理文件正確性的外部命令工具,由Oracle軟件自帶。可以在線/離線情況下對數據庫進行檢查,甚至可以對數據庫的備份文件進行檢查。并可以在數據發生錯誤或破壞時對數據庫進行診斷,以幫助進行恢復。當然數據庫可以直接使用DBMS_REPAIR來實現這個功能,但是兩者還是有所區別的,所以有必要來學習一下。
?
??? 首先給出Oracle官方對DBVERIFY的介紹:
?
DBVERIFY: Offline Database Verification Utility
?
DBVERIFY is an external command-line utility that performs a physical data structure integrity check. It can be used on offline or online databases, as well on backup files. You use DBVERIFY primarily when you need to ensure that a backup database (or datafile) is valid before it is restored, or as a diagnostic aid when you have encountered data corruption problems.
?
Because DBVERIFY can be run against an offline database, integrity checks are significantly faster.
?
DBVERIFY checks are limited to cache-managed blocks (that is, data blocks). Because DBVERIFY is only for use with datafiles, it will not work against control files or redo logs.
?
?
?
??? 接下來講一下DBVERIFY的用法。DBVERIFY可以有2種用法,一種是對datafile進行檢查,另一種是對segment進行檢查。兩者都是使用“dev”命令進行,但是所用的格式和結果都有所差異,下面看一下:
?
?
一、使用DBVERIFY檢查單個datafile的Disk Blocks
?
??? 在這個模式下面,DBVERIFY掃描某個datafile中的一個或者多個Disk Blocks,并生成一份結果。需要注意的是:如果datafile使用ASM(Automatic Storage Management)進行文件存儲,則需要提供一個USERID,因為DBVERIFY需要連接到這個ASM文件。
?
??? 對datafile的DBVERIFY命令語法如下:
?
??? dbv [ USERID=username/password ]
??????? FILE = filename
????? | { START = block_address | END = block_address }
????? | BLOCKSIZE = integer
????? | LOGFILE = filename
????? | FEEDBACK = integer
????? | HELP? = { Y | N }
????? | PARFILE = filename
???
?
??? 對語法做一些說明:
???
??? USERID:?? 指定用戶名/密碼,在ASM存儲環境下使用;
??? FILE:???? 提供需要檢測的datafile名(需要指定文件的完整路徑);
??? START:??? 指定verify開始的block地址。如果沒有指定,則默認從第一個block開始;
??? END:????? 指定verify結束的block地址。如果沒有指定,則默認為最后一個block;
??? BLOCKSIZE:如果你的block size不是2k,那么必須指定這個參數,否則返回DBV-00103錯誤;
??? LOGFILE:? 指定最終結果的輸出文本。如果不定義,則直接在執行終端顯示;
??? FEEDBACK: 回饋DBVERIFY在檢查過程中的信息,跟的參數n代表n頁。如果n=0則表示買有;
??? HELP:???? 提供在線幫助;
??? PARFILE:? 使用parameter file來存儲設定的參數,然后每次直接調用執行
?
?
??? 下面就是一個最簡單的例子來使用DBVERIFY:
?
% dbv FILE=t_db1.dbf FEEDBACK=100
DBVERIFY: Release 10.2.0.3.0 - Production on Mon Aug 17 12:21:58 2009
?
Copyright (c) 1982, 2005, Oracle.? All rights reserved.
DBVERIFY - Verification starting : FILE = t_db1.dbf
?
................................................................................
?
?
DBVERIFY - Verification complete
?
Total Pages Examined???????? : 9216
Total Pages Processed (Data) : 2044
Total Pages Failing?? (Data) : 0
Total Pages Processed (Index): 733
Total Pages Failing?? (Index): 0
Total Pages Empty??????????? : 5686
Total Pages Marked Corrupt?? : 0
?
Total Pages Influx?????????? : 0
??? 說明:
?
??? Pages = Blocks
??? Total Pages Examined = number of blocks in the file
??? Total Pages Processed = number of blocks that were verified (formatted blocks)
??? Total Pages Failing (Data) = number of blocks that failed the data block checking routine
??? Total Pages Failing (Index) = number of blocks that failed the index block checking routine
??? Total Pages Marked Corrupt = number of blocks for which the cache header is invalid, thereby making it impossible for DBVERIFY to identify the block type
??? Total Pages Influx = number of blocks that are being read and written to at the same time. If the database is open when DBVERIFY is run, DBVERIFY reads blocks multiple times to get a consistent image. But because the database is open, there may be blocks that are being read and written to at the same time (INFLUX). DBVERIFY cannot get a consistent image of pages that are in flux.
?
?
二、使用DBVERIFY檢查Segment
?
??? 在這個模式下面,可以使用DBVERIFY來檢測一個表or索引的segment的可用性。指定segment的所有鏈表均會被檢測。需要注意的是,該模式下需要提供一個SYSDBA的用戶和密碼,因為需要從數據庫中獲取的segment的信息。
?
??? 當使用這個模式時,針對的那個segment會被加鎖。如果是一個索引的segment,則所在的父表被加鎖。(IOT沒有父表)
?
??? 對segment的DBVERIFY命令語法如下:
??? dbverify_seg ::=
?
????? dbv USERID = username/password
????? | SEGMENT_ID = tsn.segfile.segblock
????? | LOGFILE = filename
????? | FEEDBACK = integer
????? | HELP? = { Y | N }
????? | PARFILE = filename?
???
?
??? 對語法做一些說明:
?
??? USERID:??? 必須指定用戶名和密碼;
??? SEGMENT_ID:需要指定segment id;
??????? 這個ID由3部分組成,分別是Tablespace_ID、Segment_Header_File_Number、Segment_Header_Block_Number
??????? 3者中間用'.'隔開。可以用這段SQL來直接查詢得到:
??????? select a.ts# || '.' || b.header_file || '.' || b.header_block
????????? from v$tablespace a, dba_segments b
???????? where a.name = b.tablespace_name
?????????? and b.segment_name = 'segment_name';
??? LOGFILE:??? 指定最終結果的輸出文本。如果不定義,則直接在執行終端顯示;
??? FEEDBACK:? 回饋DBVERIFY在檢查過程中的信息,跟的參數n代表n頁。如果n=0則表示買有;
??? HELP:????? 提供在線幫助;
??? PARFILE:?? 使用parameter file來存儲設定的參數,然后每次直接調用執行
?
??? 舉個例子:
?
% dbv USERID=hr/hr SEGMENT_ID=1.2.67
DBVERIFY - Verification starting : SEGMENT_ID = 1.2.67
?
DBVERIFY - Verification complete
?
Total Pages Examined???????? : 8
Total Pages Processed (Data) : 0
Total Pages Failing?? (Data) : 0
Total Pages Processed (Index): 1
Total Pages Failing?? (Index): 0
Total Pages Processed (Other): 2
Total Pages Processed (Seg)? : 1
Total Pages Failing?? (Seg)? : 0
Total Pages Empty??????????? : 4
Total Pages Marked Corrupt?? : 0
Total Pages Influx?????????? : 0
Highest block SCN??????????? : 7358 (0.7358)
??? 信息含義與上同。
?
?
?
?