oracle判斷block corruption的依據是啥?
oracle判斷block corruption的依據是啥也一直是困擾我的問題,今天看到一puber再次提到類似這樣的問題:
http://www.itpub.net/viewthread.php?tid=1303542&pid=15794986&page=1&extra=#pid15794986
搜了下老熊的文章
再次模擬了block corruption,不過由於對block結構瞭解的有些,所以要
準確的徹底搞清楚oracle判斷block corruption的依據目前還比較困難,下面記錄
一個大致的過程
--==========================
C:>sqlplus
SQL*Plus: Release 11.1.0.6.0 - Production on 星期一 5月 17 12:25:11 2010
Copyright (c) 1982, 2007, Oracle. All rights reserved.
連線到:
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> create tablespace test datafile 'G:APPOWNERORADATAORCLtest.dbf' size 1
m;
表空間已建立。
SQL> col file_name format a60
SQL> select file_id,file_name from dba_data_files;
FILE_ID FILE_NAME
---------- ------------------------------------------------------------
1 G:APPOWNERORADATAORCLSYSTEM01.DBF
2 G:APPOWNERORADATAORCLSYSAUX01.DBF
3 G:APPOWNERORADATAORCLUNDOTBS01.DBF
4 G:APPOWNERORADATAORCLUSERS01.DBF
5 G:APPOWNERORADATAORCLTEST.DBF
SQL> show user
USER 為 "TEST"
SQL> create table tt tablespace test as select * from dba_objects where object_i
d<=1000;
表已建立。
SQL> select min(rowid),max(rowid) from tt;
MIN(ROWID) MAX(ROWID)
------------------ ------------------
AAAD+GAAFAAAAAMAAA AAAD+GAAFAAAAAXABB
SQL> select dbms_rowid.rowid_relative_fno(min(rowid)) min_fno,dbms_rowid.rowid_b
lock_number(min(rowid)) min_bno , dbms_rowid.rowid_relative_fno(max(rowid)) max_
fno,dbms_rowid.rowid_block_number(max(rowid)) max_bno from tt;
MIN_FNO MIN_BNO MAX_FNO MAX_BNO
---------- ---------- ---------- ----------
5 12 5 23
SQL> alter system dump datafile 5 block min 12 block max 23;
系統已更改。
--==========================
BH (0x11FE921C) file#: 5 rdba: 0x0140000f (5/15) class: 1 ba: 0x11CCA000
set: 11 bsz: 8192 bsi: 0 sflg: 0 pwc: 121 lid: 0x00000000,0x00000000
dbwrid: 0 obj: 16262 objn: 16262 tsn: 5 afn: 5
hash: [0x2154769C,0x2154769C] lru: [0x11FE934C,0x11FE91AC]
ckptq: [NULL] fileq: [NULL] objq: [0x1F35ACA4,0x11FE920C]
st: XCURRENT md: NULL tch: 2
flags: only_sequential_access
LRBA: [0x0.0.0] LSCN: [0x0.0] HSCN: [0xffff.ffffffff] HSUB: [65535]
cr pin refcnt: 0 sh pin refcnt: 0
buffer tsn: 5 rdba: 0x0140000f (5/15)
scn: 0x0000.002f650a seq: 0x02 flg: 0x04 tail: 0x650a0602
frmt: 0x02 chkval: 0xda1a type: 0x06=trans data
--==========================
--上面的dump資訊是block沒有損壞時的情況
SQL> shutdown immediate
ORA-01031: 許可權不足
SQL> connect as sysdba
已連線。
SQL> shutdown immediate
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup mount
ORACLE 例程已經啟動。
Total System Global Area 313860096 bytes
Fixed Size 1332892 bytes
Variable Size 188746084 bytes
Database Buffers 117440512 bytes
Redo Buffers 6340608 bytes
資料庫裝載完畢。
SQL> select 15*8192 from dual;
15*8192
----------
122880
--尋找第15個block的位置並且透過ultraedit來修改第15個block的header,把
他們都該為a,修改之後自動變成了61:
SQL> alter database open;
資料庫已更改。
SQL> connect
已連線。
SQL> select count(*) from tt;
select count(*) from tt
*
第 1 行出現錯誤:
ORA-01578: ORACLE 資料塊損壞 (檔案號 5, 塊號 15)
ORA-01110: 資料檔案 5: 'G:APPOWNERORADATAORCLTEST.DBF'
SQL> hostname
SP2-0042: 未知命令 "hostname" - 其餘行忽略。
SQL> host
Microsoft Windows XP [版本 5.1.2600]
(C) 版權所有 1985-2001 Microsoft Corp.
C:>dbv file=G:APPOWNERORADATAORCLTEST.DBF
DBVERIFY: Release 11.1.0.6.0 - Production on 星期一 5月 17 13:04:54 2010
Copyright (c) 1982, 2007, Oracle. All rights reserved.
DBVERIFY - 開始驗證: FILE = G:APPOWNERORADATAORCLTEST.DBF
頁 15 標記為損壞
Corrupt block relative dba: 0x0140000f (file 5, block 15)
Bad header found during dbv:
Data in bad block:
type: 97 format: 1 rdba: 0x61616161
last change scn: 0x6161.61616161 seq: 0x61 flg: 0x61
spare1: 0x61 spare2: 0x61 spare3: 0x6161
consistency value in tail: 0x650a0602
check value in block header: 0x6161
block checksum disabled
DBVERIFY - 驗證完成
檢查的頁總數: 128
處理的頁總數 (資料): 11
失敗的頁總數 (資料): 0
處理的頁總數 (索引): 0
失敗的頁總數 (索引): 0
處理的頁總數 (其它): 11
處理的總頁數 (段) : 0
失敗的總頁數 (段) : 0
空的頁總數: 105
標記為損壞的總頁數: 1
流入的頁總數: 0
加密的總頁數 : 0
最高塊 SCN : 3106062 (0.3106062)
C:>
--======================
Corrupt block relative dba: 0x0140000f (file 5, block 15)
Bad header found during buffer read
Data in bad block:
type: 97 format: 1 rdba: 0x61616161
last change scn: 0x6161.61616161 seq: 0x61 flg: 0x61
spare1: 0x61 spare2: 0x61 spare3: 0x6161
consistency value in tail: 0x650a0602
check value in block header: 0x6161
block checksum disabled
Reread of rdba: 0x0140000f (file 5, block 15) found same corrupted data
DDE rules only execution for: ORA 1110
----- START Event Driven Actions Dump ----
---- END Event Driven Actions Dump ----
----- START DDE Actions Dump -----
----- DDE Action: 'DB_STRUCTURE_INTEGRITY_CHECK' (Async) -----
Successfully dispatched
----- (Action duration in csec: 0) -----
----- END DDE Actions Dump -----
Incident 16977 created, dump file: g:appownerdiagrdbmsorclorclincidentincdir_16977orcl_ora_5404_i16977.trc
ORA-01578: ORACLE 資料塊損壞 (檔案號 5, 塊號 15)
ORA-01110: 資料檔案 5: 'G:APPOWNERORADATAORCLTEST.DBF'
DDE: Problem Key 'ORA 1110' was flood controlled (0x1) (no incident)
ORA-01110: 資料檔案 5: 'G:APPOWNERORADATAORCLTEST.DBF'
Incident 16978 created, dump file: g:appownerdiagrdbmsorclorclincidentincdir_16978orcl_ora_5404_i16978.trc
ORA-01578: ORACLE 資料塊損壞 (檔案號 5, 塊號 15)
ORA-01110: 資料檔案 5: 'G:APPOWNERORADATAORCLTEST.DBF'
*** 2010-05-17 13:05:41.187
Start dump data blocks tsn: 5 file#:5 minblk 15 maxblk 15
Block dump from cache:
Dump of buffer cache at level 4 for tsn=5, rdba=20971535
Block dump from disk:
buffer tsn: 5 rdba: 0x61616161 (389/2187617)
scn: 0x6161.61616161 seq: 0x61 flg: 0x61 tail: 0x650a0602
frmt: 0x01 chkval: 0x6161 type: 0x61=unknown
--======================
目前我們看到的結果是block header獲得的資訊和tail的不一致,嘗試修改
tail使其和block header獲得資訊一致:
--嘗試修改tail的值:
修改前tail:02 06 0a 65
修改後tail:61 61 61 61
修改tail之後一致了都是61,重啟db之後再次查詢tt的資料驗證block 15:
SQL> select count(*) from tt;
select count(*) from tt
*
第 1 行出現錯誤:
ORA-01578: ORACLE 資料塊損壞 (檔案號 5, 塊號 15)
ORA-01110: 資料檔案 5: 'G:APPOWNERORADATAORCLTEST.DBF'
SQL> alter system dump datafile 5 block 15;
系統已更改。
SQL>
--=======================
Start dump data blocks tsn: 5 file#:5 minblk 15 maxblk 15
Block dump from cache:
Dump of buffer cache at level 4 for tsn=5, rdba=20971535
BH (0x14BF7A7C) file#: 5 rdba: 0x0140000f (5/15) class: 1 ba: 0x14B06000
set: 9 bsz: 8192 bsi: 0 sflg: 2 pwc: 3 lid: 0x00000000,0x00000000
dbwrid: 0 obj: 16262 objn: 16262 tsn: 5 afn: 5
hash: [0x2154769C,0x2154769C] lru: [0x215BF358,0x13BF974C]
lru-flags: moved_to_tail on_auxiliary_list
ckptq: [NULL] fileq: [NULL] objq: [NULL]
st: FREE md: NULL tch: 0
flags:
cr pin refcnt: 0 sh pin refcnt: 0
Buffer contents not dumped
Block dump from disk:
buffer tsn: 5 rdba: 0x61616161 (389/2187617)
scn: 0x6161.61616161 seq: 0x61 flg: 0x61 tail: 0x61616161
frmt: 0x01 chkval: 0x6161 type: 0x61=unknown
Hex dump of corrupt header 4 = CORRUPT
--========================
從block header獲得資訊和tail處獲得資訊看起來一致(當然僅僅是數值上一致),
oracle依然把這個block標記為corruption...
--=========================
根據老熊描述的再次模擬一下,這次直接修改block 16的seq_kcbh的值:
按照老熊的描述seq_kcbh偏移14位佔用1個位元組,所以找到這個位置
之後把原來的00改為ff,啟動db之後透過dbv檢查發現oracle確實標記了16號block為
corruption,看來seq_kcbh就是oracle的block corruption標記。
C:>dbv file=G:APPOWNERORADATAORCLTEST.DBF
DBVERIFY: Release 11.1.0.6.0 - Production on 星期一 5月 17 14:24:22 2010
Copyright (c) 1982, 2007, Oracle. All rights reserved.
DBVERIFY - 開始驗證: FILE = G:APPOWNERORADATAORCLTEST.DBF
頁 15 標記為損壞
Corrupt block relative dba: 0x0140000f (file 5, block 15)
Bad header found during dbv:
Data in bad block:
type: 170 format: 2 rdba: 0xaaaaaaaa
last change scn: 0xaaaa.aaaaaaaa seq: 0xaa flg: 0xaa
spare1: 0xaa spare2: 0xaa spare3: 0x6161
consistency value in tail: 0x61616161
check value in block header: 0x61a1
block checksum disabled
頁 16 標記為損壞
Corrupt block relative dba: 0x01400010 (file 5, block 16)
Bad check value found during dbv:
Data in bad block:
type: 6 format: 2 rdba: 0x01400010
last change scn: 0xff00.002f650a seq: 0x2 flg: 0x04
spare1: 0x0 spare2: 0x0 spare3: 0x0
consistency value in tail: 0x650a0602
check value in block header: 0x889
computed block checksum: 0xff00
DBVERIFY - 驗證完成
檢查的頁總數: 128
處理的頁總數 (資料): 10
失敗的頁總數 (資料): 0
處理的頁總數 (索引): 0
失敗的頁總數 (索引): 0
處理的頁總數 (其它): 11
處理的總頁數 (段) : 0
失敗的總頁數 (段) : 0
空的頁總數: 105
標記為損壞的總頁數: 2
流入的頁總數: 0
加密的總頁數 : 0
最高塊 SCN : 3106062 (0.3106062)
C:>
--=====================
再次把16號block的seq_kcbh改成原來的00之後用dbv檢查發現16號block好了
顯然seq_kcbh就是block corruption的標記,但是oracle標記block corruption的依據
我依然比較困惑...
C:>dbv file=G:APPOWNERORADATAORCLTEST.DBF
DBVERIFY: Release 11.1.0.6.0 - Production on 星期一 5月 17 14:40:41 2010
Copyright (c) 1982, 2007, Oracle. All rights reserved.
DBVERIFY - 開始驗證: FILE = G:APPOWNERORADATAORCLTEST.DBF
頁 15 標記為損壞
Corrupt block relative dba: 0x0140000f (file 5, block 15)
Bad header found during dbv:
Data in bad block:
type: 170 format: 2 rdba: 0xaaaaaaaa
last change scn: 0x00aa.aaaaaaaa seq: 0xaa flg: 0xaa
spare1: 0xaa spare2: 0xaa spare3: 0x6161
consistency value in tail: 0x61616161
check value in block header: 0x61a1
block checksum disabled
DBVERIFY - 驗證完成
檢查的頁總數: 128
處理的頁總數 (資料): 11
失敗的頁總數 (資料): 0
處理的頁總數 (索引): 0
失敗的頁總數 (索引): 0
處理的頁總數 (其它): 11
處理的總頁數 (段) : 0
失敗的總頁數 (段) : 0
空的頁總數: 105
標記為損壞的總頁數: 1
流入的頁總數: 0
加密的總頁數 : 0
最高塊 SCN : 3106062 (0.3106062)
C:>
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/19602/viewspace-1033653/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 關於php依據使用者當前定位判斷距離最近的商家或者別的PHP
- [翻譯]-Detect And Repair Corruption in an Oracle DatabaseAIOracleDatabase
- 根據指定月份判斷有多少天
- JDK是如何判斷兩個物件是否相同的?判斷的流程是什麼?JDK物件
- 根據年月日判斷星期幾的c程式C程式
- 請問 httprunner 的 yaml file 是根據什麼格式判斷是否符合規格的?HTTPYAML
- 判斷是什麼字元字元
- 【ASK_ORACLE】一眼判斷出Oracle的dmp檔案是用expdp匯出還是exp匯出Oracle
- update 修改資料時,依賴或者說需要根據另一個值來進行判斷l
- 判斷使用的是 x11 還是 wayland
- JavaScript 判斷是否是陣列JavaScript陣列
- 01-什麼是判斷?
- 新手發問 ! Laravel admin 根據ID判斷資料Laravel
- 點選按鈕時根據select的值判斷是否是需要的選項並顯示div
- JS的判斷語句:判斷、迴圈JS
- 如何避免UITableView重寫大量delegate以及n多if-else判斷和BlockUIViewBloC
- 傳入http請求的UserAgent 根據它判斷是手機還是電腦傳送過來的請求HTTP
- 判斷是否是陣列的幾種方法陣列
- 判斷日期是該年的第幾天
- 根據登錄檔鍵值判斷本機EXCEL版本Excel
- javascript如何判斷Object是空物件JavaScriptObject物件
- this是什麼以及如何判斷它
- 使用帶型別判斷的比較判斷型別
- js函式中的if判斷和a==b判斷JS函式
- js根據字尾判斷檔案檔案型別的程式碼JS型別
- Oracle Block Cleanouts 塊清除OracleBloC
- JS 判斷客戶端是iOS還是AndroidJS客戶端iOSAndroid
- fastjson判斷JSON字串是Object還是List<Object>ASTJSON字串Object
- 判斷客戶端是iOS還是Android,判斷是不是在微信瀏覽器開啟客戶端iOSAndroid瀏覽器
- Linux下判斷磁碟是SSD還是HDD的3種方法Linux
- JavaScript判斷數字是否是質數JavaScript
- 【ASP】判斷是否是手機訪問
- python學習----判斷是否是閏年Python
- JavaScript 判斷變數是否是函式JavaScript變數函式
- 判斷自身開方是否是整數
- 判斷a是否是int型別資料型別
- ORACLE中使用SQL的正規表示式判斷郵箱格式OracleSQL
- 如何判斷股票有沒有主力?主力的判斷方法
- 判斷NaN的真假NaN