




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、 PAGE 67Oracle壞塊故障總結(jié) 最近處理了兩次典型的ora-01578,ora-01115,ora-01110故障,一次是平湖索引塊壞,一次是黃山數(shù)據(jù)文件壞、blob數(shù)據(jù)塊壞。平湖的警告日志文件中有以下信息:ORA-12012: error on auto execute of job 21ORA-01578: ORACLE data block corrupted (file # 10, block # 2558610)ORA-01110: data file 10: D:ORACLEORADATABSUSERS04.DBFORA-12012: error on auto exec
2、ute of job 1ORA-01578: ORACLE data block corrupted (file # 16, block # 2624066)ORA-01110: data file 16: D:ORACLEORADATABSUSERS10.DBF應(yīng)用軟件可以正常使用,偶爾會報(bào)錯(cuò)ora-01578。排錯(cuò)過程登錄數(shù)據(jù)庫檢查:select count(*) from ep_table t where ptimetrunc(sysdate)-30 and alarmtype=0784163select count(*) from ep_table t4281062看來全表掃描正常se
3、lect from ep_table t where ptimetrunc(sysdate)-33 and alarmtype=0 and rownum10001索引掃描報(bào)錯(cuò)了,推斷為索引上有壞塊!繼續(xù)查:select owner,file_id,segment_name, segment_type, block_id, blocksfrom dba_extentswhere file_id=16 and block_id= 2624066;OWNERFILE_IDSEGMENT_NAMESEGMENT_TYPEBLOCK_IDBLOCKSBS16VHINOINDEX262406616運(yùn)氣真好
4、重建相關(guān)索引后數(shù)據(jù)庫就恢復(fù)了。黃山壞塊故障就比較復(fù)雜了,硬盤壞導(dǎo)致多個(gè)數(shù)據(jù)文件的多個(gè)塊故障,其中還有blob對象。Count(*)一張表報(bào)錯(cuò):查詢某張表系統(tǒng)事件中有報(bào)錯(cuò):磁盤管理中報(bào)錯(cuò):Dell的服務(wù)器,2塊72G硬盤,沒有做raid,8i數(shù)據(jù)庫沒有備份。(上圖磁盤3為移動硬盤)初步檢查到這里我感覺這次壞的嚴(yán)重了,恢復(fù)可能比較麻煩。整理一下思路:不要隨意重啟記錄損壞的數(shù)據(jù)信息導(dǎo)出可用數(shù)據(jù)更換故障硬盤重做系統(tǒng)及數(shù)據(jù)庫恢復(fù)數(shù)據(jù)重傳丟失的數(shù)據(jù)(我們的系統(tǒng)架構(gòu)可以這樣做)排錯(cuò)過程select * from dba_extents where file_id=8 and 1461842 between
5、block_id and block_id+blocks-11BSSYS_LOB0000003770C00017$LOBSEGMENTUSERS3457081461842131072168解釋:block_id+blocks-1=1461842+這個(gè)區(qū)有多少個(gè)block-1查到故障段為LOBSEGMENT類型,SYS_LOB0000003770C00017$。select dl.table_name,dl.SEGMENT_NAME from dba_lobs dl where dl.owner= BS where dl.SEGMENT_NAME= SYS_LOB0000003770C00017
6、$查到有壞塊的表為EP_PECC。接著查出這張表的lob索引段Select A.TABLE_NAME,A.COLUMN_NAME,B.SEGMENT_NAME,B.SEGMENT_TYPE,B.HEADER_FILE,B.HEADER_BLOCK,B.BYTES from DBA_LOBS A,DBA_SEGMENTS B where A.INDEX_NAME=B.SEGMENT_NAME AND A.TABLE_NAME=EP_PECC當(dāng)時(shí)因?yàn)闆]有記錄,所以我隨便舉例:1EP_TABLETHIRDPICTSYS_IL0000052738C00018$LOBINDEX7155655362EP_
7、TABLEPANORAMAPICTSYS_IL0000052738C00017$LOBINDEX7139655363EP_TABLEPLATEPICTSYS_IL0000052738C00016$LOBINDEX712365536select rowid from BS.EP_PECC where dbms_rowid.rowid_to_absolute_fno(rowid,BS,EP_PECC)=8 and dbms_rowid.rowid_block_number(rowid)=1461842;這個(gè)塊無法找出blob段的rowid。本想找后我可以按照rowid清空故障的blob數(shù)據(jù)。選擇一
8、個(gè)范圍繼續(xù)找:select rowid,T.PTIME,T.PLATEPICT,T.PANORAMAPICT from BS.EP_PECC T where dbms_rowid.rowid_to_absolute_fno(rowid,BS,EP_PECC)=8 and dbms_rowid.rowid_block_number(rowid) BETWEEN 1461840 AND 1461842;還是沒有找到select rowid, dbms_rowid.rowid_object(rowid) obj_id, dbms_rowid.rowid_relative_fno(rowid) df#
9、, dbms_rowid.rowid_block_number(rowid) blknum, dbms_rowid.rowid_row_number(rowid) rowno ,T.PTIME,T.ALARMTYPE,T.PLATEPICT,T.PANORAMAPICTfrom EP_PECC T where dbms_rowid.rowid_to_absolute_fno(rowid,BS,EP_PECC)=8 AND dbms_rowid.rowid_block_number(rowid) BETWEEN 1461842 AND 1461842 +1024;還沒找到select rowid
10、, dbms_rowid.rowid_object(rowid) obj_id, dbms_rowid.rowid_relative_fno(rowid) df#, dbms_rowid.rowid_block_number(rowid) blknum, dbms_rowid.rowid_row_number(rowid) rowno ,T.PTIME,T.ALARMTYPE,T.PLATEPICT,T.PANORAMAPICTfrom EP_PECC T where dbms_rowid.rowid_to_absolute_fno(rowid,BS,EP_PECC)=8 AND dbms_r
11、owid.rowid_block_number(rowid) BETWEEN 1461742 AND 1461842;終于找到了一些AAAA66AAIAAFkrSAAJ37708146094692009-10-26 19:40:080省略一些結(jié)果集AAAA66AAIAAFk5JAAG37708146183362009-10-26 19:47:080查到以下記錄時(shí)出錯(cuò),看來按照rowid清空故障的blob數(shù)據(jù)不行AAAA66AAIAAFk5JAAGROWID_TYPE: 1OBJECT_NUMBER: 3770RELATIVE_FNO: 8BLOCK_NUMBER: 1461833ROW_NUM
12、BER: 6可以從obj#,rfile#,block#,row#計(jì)算得到理論上的rowid Obj# 3770Rfile# 8Block# 1461842Row# 0實(shí)際上就是將十進(jìn)制數(shù)轉(zhuǎn)化成64進(jìn)制數(shù),當(dāng)然,從二進(jìn)制轉(zhuǎn)化的規(guī)則比較簡單點(diǎn)。將二進(jìn)制數(shù)從右到左,6個(gè)bit一組,然后將這6個(gè)bit組轉(zhuǎn)成10進(jìn)制數(shù),就是AZ az 09 + /這64個(gè)字符的位置(從0開始),替換成base64的字符即可。rowid是base64編碼的,用AZ az 09 + /共64個(gè)字符表示。A表示0,B表示1,a表示26,0表示52,+表示62,/表示63可以將其看做一個(gè)64進(jìn)制的數(shù)。obj#=3770轉(zhuǎn)換成二
13、進(jìn)制,補(bǔ)足成6位base64編碼,左邊填0,結(jié)果為AAAA66rfile#=8=001000=I,補(bǔ)足成3位,得到AAIblock#=1461842=000101 100100 111001 010010=5 36 57 18,補(bǔ)足成6位,得到AAFk5Srow#=0,3位AAA合起來就是AAAA66AAIAAFk5SAAA但是不要忘了,這次壞的是blob它會跨多個(gè)塊的。所以這條理論rowid沒有找到!舉例子補(bǔ)充說明:select * from dba_lobs dl where dl.owner=TEST1TESTT_LOGRZSYS_LOB0000052726C00002$TESTSYS_
14、IL0000052726C00002$8192900NOYESYESNOT APPLICABLE NO2TESTEP_TABLEPLATEPICTSYS_LOB0000052738C00016$TESTSYS_IL0000052738C00016$8192900NOYESYESNOT APPLICABLE NO3TESTEP_TABLEPANORAMAPICTSYS_LOB0000052738C00017$TESTSYS_IL0000052738C00017$8192900NOYESYESNOT APPLICABLE NO4TESTEP_TABLETHIRDPICTSYS_LOB0000052
15、738C00018$TESTSYS_IL0000052738C00018$8192900NOYESYESNOT APPLICABLE NO5TESTEP_PECCPLATEPICTSYS_LOB0000052746C00016$TESTSYS_IL0000052746C00016$8192900NOYESYESNOT APPLICABLE NO6TESTEP_PECCPANORAMAPICTSYS_LOB0000052746C00017$TESTSYS_IL0000052746C00017$8192900NOYESYESNOT APPLICABLE NO7TESTEP_PECCTHIRDPIC
16、TSYS_LOB0000052746C00018$TESTSYS_IL0000052746C00018$8192900NOYESYESNOT APPLICABLE NO沒有任何數(shù)據(jù)時(shí):select dl.TABLE_NAME,dl.COLUMN_NAME,de.segment_name,de.segment_type,de.FILE_ID,de.BLOCK_ID from dba_extents de,dba_lobs dl where de.owner=TEST and dl.OWNER=TEST and de.segment_name=dl.SEGMENT_NAME1T_LOGRZSYS_
17、LOB0000052726C00002$LOBSEGMENT7172EP_TABLEPLATEPICTSYS_LOB0000052738C00016$LOBSEGMENT71133EP_TABLEPANORAMAPICTSYS_LOB0000052738C00017$LOBSEGMENT71294EP_TABLETHIRDPICTSYS_LOB0000052738C00018$LOBSEGMENT71455EP_PECCPLATEPICTSYS_LOB0000052746C00016$LOBSEGMENT71776EP_PECCPANORAMAPICTSYS_LOB0000052746C000
18、17$LOBSEGMENT71937EP_PECCTHIRDPICTSYS_LOB0000052746C00018$LOBSEGMENT7209向EP_TABLE表的PLATEPICT字段,插入一張9MB大小的圖片后結(jié)果:1T_LOGRZSYS_LOB0000052726C00002$LOBSEGMENT7172EP_TABLEPLATEPICTSYS_LOB0000052738C00016$LOBSEGMENT71133EP_TABLEPLATEPICTSYS_LOB0000052738C00016$LOBSEGMENT72734EP_TABLEPLATEPICTSYS_LOB0000052
19、738C00016$LOBSEGMENT72815EP_TABLEPLATEPICTSYS_LOB0000052738C00016$LOBSEGMENT72896EP_TABLEPLATEPICTSYS_LOB0000052738C00016$LOBSEGMENT72977EP_TABLEPLATEPICTSYS_LOB0000052738C00016$LOBSEGMENT73058EP_TABLEPLATEPICTSYS_LOB0000052738C00016$LOBSEGMENT73139EP_TABLEPLATEPICTSYS_LOB0000052738C00016$LOBSEGMENT
20、732110EP_TABLEPLATEPICTSYS_LOB0000052738C00016$LOBSEGMENT732911EP_TABLEPLATEPICTSYS_LOB0000052738C00016$LOBSEGMENT733712EP_TABLEPLATEPICTSYS_LOB0000052738C00016$LOBSEGMENT734513EP_TABLEPLATEPICTSYS_LOB0000052738C00016$LOBSEGMENT735314EP_TABLEPLATEPICTSYS_LOB0000052738C00016$LOBSEGMENT736115EP_TABLEP
21、LATEPICTSYS_LOB0000052738C00016$LOBSEGMENT736916EP_TABLEPLATEPICTSYS_LOB0000052738C00016$LOBSEGMENT737717EP_TABLEPLATEPICTSYS_LOB0000052738C00016$LOBSEGMENT738518EP_TABLEPLATEPICTSYS_LOB0000052738C00016$LOBSEGMENT6919EP_TABLEPLATEPICTSYS_LOB0000052738C00016$LOBSEGMENT739320EP_TABLEPLATEPICTSYS_LOB00
22、00052738C00016$LOBSEGMENT613721EP_TABLEPLATEPICTSYS_LOB0000052738C00016$LOBSEGMENT752122EP_TABLEPLATEPICTSYS_LOB0000052738C00016$LOBSEGMENT626523EP_TABLEPLATEPICTSYS_LOB0000052738C00016$LOBSEGMENT764924EP_TABLEPLATEPICTSYS_LOB0000052738C00016$LOBSEGMENT639325EP_TABLEPLATEPICTSYS_LOB0000052738C00016$
23、LOBSEGMENT777726EP_TABLEPLATEPICTSYS_LOB0000052738C00016$LOBSEGMENT652127EP_TABLEPANORAMAPICTSYS_LOB0000052738C00017$LOBSEGMENT712928EP_TABLETHIRDPICTSYS_LOB0000052738C00018$LOBSEGMENT714529EP_PECCPLATEPICTSYS_LOB0000052746C00016$LOBSEGMENT717730EP_PECCPANORAMAPICTSYS_LOB0000052746C00017$LOBSEGMENT7
24、19331EP_PECCTHIRDPICTSYS_LOB0000052746C00018$LOBSEGMENT7209查test用戶blob容量:select sum(de.BYTES/1024/1024) from dba_extents de,dba_lobs dl where de.owner=TEST AND dl.OWNER=TEST AND de.segment_name=dl.segment_name10.375顯示10MB檢查表建在那個(gè)數(shù)據(jù)文件那個(gè)塊上SELECT DISTINCT dbms_rowid.rowid_relative_fno(rowid) AS File, db
25、ms_rowid.rowid_block_number(rowid) AS Block FROM ep_table; FileBlock7110看起來這個(gè)表存放在文件號7,塊號110的地方查找存放圖片的blob段:select de.segment_name,de.EXTENT_ID,de.FILE_ID,de.BLOCK_ID,de.BYTES,de.BLOCKS,de.relative_fno from dba_extents de where de.owner=TEST and de.segment_name=SYS_LOB0000052738C00016$我已經(jīng)往這個(gè)段里存放了一張9M
26、B的圖片,占用了以下塊。 SEGMENT_NAME EXTENT_IDFILE_IDBLOCK_IDBYTESBLOCKSRELATIVE_FNO1SYS_LOB0000052738C00016$0711365536872SYS_LOB0000052738C00016$1727365536873SYS_LOB0000052738C00016$2728165536874SYS_LOB0000052738C00016$3728965536875SYS_LOB0000052738C00016$4729765536876SYS_LOB0000052738C00016$5730565536877SYS_
27、LOB0000052738C00016$6731365536878SYS_LOB0000052738C00016$7732165536879SYS_LOB0000052738C00016$87329655368710SYS_LOB0000052738C00016$97337655368711SYS_LOB0000052738C00016$107345655368712SYS_LOB0000052738C00016$117353655368713SYS_LOB0000052738C00016$127361655368714SYS_LOB0000052738C00016$1373696553687
28、15SYS_LOB0000052738C00016$147377655368716SYS_LOB0000052738C00016$157385655368717SYS_LOB0000052738C00016$16691048576128618SYS_LOB0000052738C00016$1773931048576128719SYS_LOB0000052738C00016$1861371048576128620SYS_LOB0000052738C00016$1975211048576128721SYS_LOB0000052738C00016$2062651048576128622SYS_LOB
29、0000052738C00016$2176491048576128723SYS_LOB0000052738C00016$2263931048576128624SYS_LOB0000052738C00016$2377771048576128725SYS_LOB0000052738C00016$24652110485761286根據(jù)上一步查出來的BLOCK_ID一陣狂找,終于找到了select rowid, dbms_rowid.rowid_object(rowid) obj_id, dbms_rowid.rowid_relative_fno(rowid) df#, dbms_rowid.rowi
30、d_block_number(rowid) blknum, dbms_rowid.rowid_row_number(rowid) rowno ,T.PTIME,T.ALARMTYPE,T.PLATEPICT,T.PANORAMAPICTfrom ep_table T where dbms_rowid.rowid_to_absolute_fno(rowid,TEST,EP_TABLE)=7 AND dbms_rowid.rowid_block_number(rowid) BETWEEN 1 AND 113; ROWIDOBJ_IDDF#BLKNUMROWNOPTIMEALARMTYPEPLATE
31、PICTPANORAMAPICT1AAAM4CAAHAAAABuAAA52738711002009-11-29 22:51:580看來它跨越了6號數(shù)據(jù)文件的9號塊到7號數(shù)據(jù)文件的777號塊根據(jù)rowid反過來驗(yàn)證一下塊信息:declarev_rowid_type number;v_OBJECT_NUMBER number;v_RELATIVE_FNO number;v_BLOCK_NUMBERE_FNO number;v_ROW_NUMBER number;begindbms_rowid.rowid_info(rowid_in = AAAM4CAAHAAAABuAAA,rowid_type =
32、 v_rowid_type,object_number = v_OBJECT_NUMBER,relative_fno = v_RELATIVE_FNO,block_number = v_BLOCK_NUMBERE_FNO,row_number = v_ROW_NUMBER);dbms_output.put_line(ROWID_TYPE: |to_char(v_rowid_type);dbms_output.put_line(OBJECT_NUMBER: |to_char(v_OBJECT_NUMBER);dbms_output.put_line(RELATIVE_FNO: |to_char(
33、v_RELATIVE_FNO);dbms_output.put_line(BLOCK_NUMBER: |to_char(v_BLOCK_NUMBERE_FNO);dbms_output.put_line(ROW_NUMBER: |to_char(v_ROW_NUMBER);end;/ROWID_TYPE: 1OBJECT_NUMBER: 52738RELATIVE_FNO: 7BLOCK_NUMBER: 110ROW_NUMBER: 0也就是說如果blob字段發(fā)生壞塊,可能壞塊的block_id為273,但是要查找記錄的rowid的話需要前后跨越一段block_id才有可能找到,例如這里的11
34、0。而從obj#,rfile#,block#,row#計(jì)算得到理論上的rowid可能不存在?;氐近S山壞塊故障上:SELECT COUNT(*) FROM EP_PECC WHERE TO_CHAR(PTIME,YYYYMMDD) 20091125 AND TO_CHAR(PTIME,YYYYMMDD) 20091127;ERROR 位于第 1 行:ORA-01115: 從文件 8 讀取塊時(shí)出現(xiàn) IO 錯(cuò)誤 (塊 # 1461842)ORA-01110: 數(shù)據(jù)文件 8: E:ORADATADZJCUSERS02.DBFORA-27091: skgfqio: 無法進(jìn)行 I/O 操作OSD-0400
35、6: ReadFile() 失敗,無法自文件讀取O/S-Error: (OS 23) 數(shù)據(jù)錯(cuò)誤 (循環(huán)冗余檢查)。驗(yàn)證了這個(gè)時(shí)間段區(qū)間內(nèi)的數(shù)據(jù)有壞塊!Select count(*) from EP_PECC t where PTIMETO_DATE(20091026 20:48:57,yyyymmdd HH24:MI:SS)沒有報(bào)錯(cuò)結(jié)論:1461833塊為 20091026 20:47:57到 20091026 20:48:57 之間。同時(shí)我也偷懶了沒有繼續(xù)查找因?yàn)檫B著壞了好多塊?;謴?fù)完數(shù)據(jù)庫后重傳這段時(shí)間的記錄就行了!備份時(shí)只需把期間的數(shù)據(jù)備份出來就可以。DELETE from EP_PEC
36、C t where PTIMETO_DATE(20091001 00:00:00,yyyymmdd HH24:MI:SS)和用戶溝通了一下,把以前的過期記錄全部刪除后來發(fā)現(xiàn)另外一張表EP_TABLE導(dǎo)出時(shí)也有壞塊。即將導(dǎo)出指定的表通過常規(guī)路徑 . . 正在導(dǎo)出表 EP_TABLEEXP-00056: ORACLE 錯(cuò)誤 1115 出現(xiàn)ORA-01115: 從文件 8 讀取塊時(shí)出現(xiàn) IO 錯(cuò)誤 (塊 # 1200338)ORA-27070: skgfdisp: 異步讀取/寫入失敗OSD-04016: 查詢非同步 I/O 請求發(fā)生錯(cuò)誤.O/S-Error: (OS 23) 數(shù)據(jù)錯(cuò)誤 (循環(huán)冗余檢查
37、)。ORA-01115: 從文件 8 讀取塊時(shí)出現(xiàn) IO 錯(cuò)誤 (塊 # 1200338)ORA-27070: skgfdisp: 異步讀取/寫入失敗OSD-04016: 查詢非同步 I/O 請求發(fā)生錯(cuò)誤.O/S-Error: (OS 23) 數(shù)據(jù)錯(cuò)誤 (循環(huán)冗余檢查)。導(dǎo)出成功終止,但出現(xiàn)警告。同理處理。找到壞塊所在記錄的時(shí)間段后exp時(shí)跳過。后面的恢復(fù)處理就不寫了。特別注意:試過dbms_repair,但是dbms_repair找不到錯(cuò)誤的記錄。試過ALTER SYSTEM SET EVENTS 10231 trace name context forever,level 10; 也不能成
38、功。奇怪了,只能猜硬盤壞的太厲害,產(chǎn)生了物理壞道。RMAN 可以備份包含損壞數(shù)據(jù)塊的數(shù)據(jù)文件,通過設(shè)置 set maxcorrupt 可以跳過指定個(gè)數(shù)的壞塊來避免備份失敗。 RMAN set maxcorrupt for datafile 1 to 10;在 Oracle9i中可以用 RMAN來執(zhí)行塊級的恢復(fù),而且恢復(fù)期間數(shù)據(jù)文件可以是聯(lián)機(jī)狀 態(tài)。RMAN通過 Block Media Recovery(簡稱 BMR)來執(zhí)行塊級恢復(fù)操作。假設(shè)我們在查 詢一個(gè) Oracle 表的時(shí)候接收到下面的錯(cuò)誤:ERROR 位于第 1 行:ORA-01578: ORACLE 數(shù)據(jù)塊損壞(文件號 5,塊號 97
39、) ORA-01110: 數(shù)據(jù)文件 5: E:xxxx.dbf那么我們就可以在 RMAN中用 BLOCKRECOVER 命令來修復(fù):RMAN BLOCKRECOVER DATAFILE 5 BLOCK97; 啟動 blockrecover 于 03-9月 -06 正在啟動全部恢復(fù)目錄的 resync完成全部 resync使用通道 ORA_DISK_1通道 ORA_DISK_1: 正在從數(shù)據(jù)文件副本 E:xxxx.bak 恢復(fù)塊 正在開始介質(zhì)的恢復(fù)完成介質(zhì)的恢復(fù)完成 blockrecover 于 03-9月 -06塊恢復(fù) Block Media Recovery (BMR),塊是恢復(fù)的最小單元,
40、通過塊可以減少恢復(fù) 時(shí)間,而且數(shù)據(jù)文件可以在線?;謴?fù)塊的時(shí)候,必須指定具體的塊號,如:RMAN blockrecoverdatafile 6 block 3;具體請見 4.7.4 塊媒體恢復(fù) Block Media Recovery (BMR)1)指示RMAN從文件的最新備份集或映像副本中還原與恢復(fù)一個(gè)指定的數(shù)據(jù)塊: RMAN blockrecover datafile 7 block 5;2)BLOCKRECOVER命令可以接受若干文件中的一列數(shù)據(jù)塊: RMAN blockrecover datafile 7 block 5,6,7 datafile 9 block 21,25;3)從指定備
41、份集中還原數(shù)據(jù)塊 RMAN blockrecover datafile 7 block 5 from backupset 1039;4)從使用標(biāo)記指定的備份中還原數(shù)據(jù)塊 RMAN blockrecover datafile 7 block 5 from tag monthly_whole;5)使用至少已生成一周的備份來還原和恢復(fù)前一個(gè)備份操作發(fā)現(xiàn)受損的所有數(shù)據(jù)塊: RMAN blockrecover corruption list until time sysdate - 7;注意:此處關(guān)鍵字UNTIL并非表示不完全恢復(fù)!這個(gè)關(guān)鍵字意味著必須從特定日期(序列號或SCN)之前生成的備份中還原數(shù)據(jù)
42、塊。下面系統(tǒng)的總結(jié)一下壞塊故障的處理:數(shù)據(jù)庫出現(xiàn)壞塊現(xiàn)象是指:在Oracle數(shù)據(jù)庫的一個(gè)或多個(gè)數(shù)據(jù)塊內(nèi)出現(xiàn)內(nèi)容混亂的現(xiàn)象。由于正常的數(shù)據(jù)塊都有固定的合法內(nèi)容格式,壞塊的出現(xiàn),導(dǎo)致數(shù)據(jù)庫進(jìn)程無法正常解析數(shù)據(jù)塊的內(nèi)容,進(jìn)而使數(shù)據(jù)庫進(jìn)程報(bào)錯(cuò)乃至掛起,并級聯(lián)導(dǎo)致整個(gè)數(shù)據(jù)庫實(shí)例出現(xiàn)異常。一壞塊的產(chǎn)生原因壞塊產(chǎn)生的原因大致有以下幾種:1.1 硬件問題Oracle進(jìn)程在處理一個(gè)數(shù)據(jù)塊時(shí),首先將其讀入物理內(nèi)存空間,在處理完成后,再由特定進(jìn)程將其寫回磁盤;如果在這個(gè)過程中,出現(xiàn)內(nèi)存故障,CPU計(jì)算失誤,都會導(dǎo)致內(nèi)存數(shù)據(jù)塊的內(nèi)容混亂,最后反映到寫回磁盤的數(shù)據(jù)塊內(nèi)容有誤。同樣,如果存儲子系統(tǒng)出現(xiàn)異常,數(shù)據(jù)塊損壞也就
43、隨之出現(xiàn)了。1.2 操作系統(tǒng)BUG由于Oracle進(jìn)程對數(shù)據(jù)塊的讀寫,都是以操作系統(tǒng)內(nèi)核調(diào)用(system call)的方式完成的,如果操作系統(tǒng)在內(nèi)核調(diào)用存在問題,必然導(dǎo)致Oracle進(jìn)程寫入非法的內(nèi)容。1.3 操作系統(tǒng)的I/O錯(cuò)誤或緩沖問題1.4 內(nèi)存或paging問題Oracle軟件BUGOracle軟件特定版本上,可能出現(xiàn)導(dǎo)致數(shù)據(jù)塊的內(nèi)容出現(xiàn)異常BUG。1.5 非Oracle進(jìn)程擾亂Oracle共享內(nèi)存區(qū)域如上文所述,在當(dāng)數(shù)據(jù)塊的內(nèi)容被讀入主機(jī)的物理內(nèi)存時(shí),如果其他非Oracle進(jìn)程,對Oracle使用的共享內(nèi)存區(qū)域形成了擾亂,最終導(dǎo)致寫回磁盤的數(shù)據(jù)塊內(nèi)容混亂。1.6 異常關(guān)機(jī),掉電,終
44、止服務(wù)異常關(guān)機(jī),掉電,終止服務(wù)使進(jìn)程異常終止,而破壞數(shù)據(jù)塊的完整性,導(dǎo)致壞塊產(chǎn)生。注:這也是為什么突然斷電會導(dǎo)致數(shù)據(jù)庫無法啟動由上可見,壞塊的形成原因復(fù)雜。當(dāng)出現(xiàn)壞塊時(shí),為了找到確切的原因,需要大量的分析時(shí)間和排查操作,甚至需要多次重現(xiàn)才能找出根本原因。但當(dāng)故障發(fā)生在生產(chǎn)系統(tǒng)上,我們?yōu)榱藴p少停機(jī)時(shí)間,會盡快實(shí)施應(yīng)急權(quán)變措施以保證系統(tǒng)的可用性,這樣就破壞了故障現(xiàn)場,對根本原因的分析因而也更加困難了。二壞塊的預(yù)防壞塊問題破壞性大,但并非不可預(yù)防。2.1 在M網(wǎng)站,Oracle定期發(fā)布基于特定軟件版本的“已知問題(known issues)說明”。對于可能導(dǎo)致壞塊的Oracle軟件BUG,在Orac
45、le公司內(nèi)部,是作為高嚴(yán)重級別的問題進(jìn)行處理,在“已知問題(known issues)說明”中,這些BUG以嚴(yán)重(Noticable)問題標(biāo)出(標(biāo)記為*或+),部分問題,Oracle還會發(fā)布警告(Alert)通告。在文檔中,Oracle會提供相應(yīng)的補(bǔ)丁或應(yīng)對措施。2.2 Oracle提供備份恢復(fù)工具Recovery Manager,提供了掃描文件檢查壞塊的功能。在Recovery Manager界面中,使用:RMAN BACKUP CHECK LOGICAL VALIDATE DATAFILE n ;可以檢查數(shù)據(jù)文件是否包含壞塊,同時(shí)并不產(chǎn)生實(shí)際的備份輸出。2.3 Dbv工具檢查注:因?yàn)閐bv
46、要求file后面跟的必須是一個(gè)文件擴(kuò)展名,所以如果用裸設(shè)備存儲的,就必須使用ln鏈接裸設(shè)備到一個(gè)文件,然后再用dbv對這個(gè)鏈接文件進(jìn)行檢查。ANALYZE TABLE tablename VALIDATE STRUCTURE CASCADE它執(zhí)行壞塊的檢查,但是不會標(biāo)記壞塊為corrupt,檢測的結(jié)果保存在USER_DUMP_DEST目錄下的用戶trace文件中。2.4 利用exp工具導(dǎo)出整個(gè)數(shù)據(jù)庫可以檢測壞塊對以下情況的壞塊是檢測不出來的:HWM以上的壞塊是不會發(fā)現(xiàn)的索引中存在的壞塊是不會發(fā)現(xiàn)的數(shù)據(jù)字典中的壞塊是不會發(fā)現(xiàn)的結(jié)合數(shù)據(jù)庫性能綜合考慮db_block_checksum和db_blo
47、ckchecking參數(shù)。當(dāng)我們使用Recovery Manager進(jìn)行實(shí)際的數(shù)據(jù)庫備份時(shí),同時(shí)也就進(jìn)行了壞塊檢查。但要注意的是,在線使用Recovery Manager掃描壞塊和備份時(shí),需要數(shù)據(jù)庫運(yùn)行在歸檔模式(archive log),否則只能在數(shù)據(jù)庫未打開的情況下進(jìn)行。對于操作系統(tǒng)問題和硬件故障,則需要相應(yīng)廠商的配合支持。同時(shí),避免在數(shù)據(jù)庫主機(jī)運(yùn)行其他用戶進(jìn)程,避免異常停機(jī),也會減少壞塊發(fā)生的幾率。三壞塊故障的識別遇到壞塊問題時(shí),數(shù)據(jù)庫的異常表現(xiàn)通常有:報(bào)告ORA-01578錯(cuò)誤。報(bào)告Ora-1110錯(cuò)誤。報(bào)告ORA-00600錯(cuò)誤,其中,第一個(gè)參數(shù)為2000-8000,Cache la
48、yer 2000 4000,Transaction layer 4000 6000,Data layer 6000 - 8000。Trace文件中出現(xiàn)Corrupt block dba: 0 x160c5958 . found。分析對象失敗。后臺進(jìn)程,如DBWR,LGWR出現(xiàn)長時(shí)間異常等待,如“LGWR wait for redo copy”。四Oracle數(shù)據(jù)塊損壞恢復(fù)總結(jié)可以用DBV 命令來檢測是否有壞塊:在恢復(fù)前使用DBV命令檢查數(shù)據(jù)文件是否存在壞塊dbv file=d:oracleoradatamydbRONLY.DBF blocksize=8192查看數(shù)據(jù)壞塊所在數(shù)據(jù)文件號及塊號可以
49、對表進(jìn)行一次全表掃描,如:select count(*) from tablename;關(guān)于DBV 命令的具體使用,請參考blog:/tianlesoftware/archive/2009/12/16/5015164.aspx4.1 沒有備份的情況下:4.1.1、使用exp/imp恢復(fù)在這種情況下肯定會造成數(shù)據(jù)的丟失,在這種情況下應(yīng)采取將數(shù)據(jù)導(dǎo)出然后重建表再進(jìn)行導(dǎo)入的方法,來盡量恢復(fù)損壞數(shù)據(jù)塊中的數(shù)據(jù),但是在有壞塊的情況下是不允許導(dǎo)出的,如下命令:Exp test/test file=t.dmp tables=t;導(dǎo)出命令在執(zhí)行中會報(bào)ORA-01578錯(cuò)誤,在這錯(cuò)誤提示中會提示那個(gè)文件號的文件
50、以及這個(gè)文件中的哪個(gè)塊被損壞,如:ORA01578:ORACLE 數(shù)據(jù)塊損壞(文件號 4,塊號 35)針對以上的提示首先查詢那些對象被損壞:Select tablespace_name,segment_type,owner,segment_name From dba_extents Where file_id=4 and 35 between block_id and block_id+blocks-1;如果被損壞的塊是索引,通??梢酝ㄟ^索引重建來解決,如果損壞的是數(shù)據(jù)(segment_type為table),那么通過設(shè)置如下內(nèi)部事件使得Exp操作跳過壞塊。Alter session set
51、events=10231 trace name context forever,level 10;然后重新執(zhí)行導(dǎo)出命令,導(dǎo)出相關(guān)的表,然后執(zhí)行Drop Table命令刪除相關(guān)表,之后重建表最后導(dǎo)入數(shù)據(jù)。4.1.2、使用DBMS_REPAIR恢復(fù)用DBMS_REPAIR當(dāng)然也會丟失數(shù)據(jù)。這里不做詳細(xì)的介紹,有興趣的可以查看oracle的在線文檔4.2 使用Rman進(jìn)行恢復(fù):首先要存在Rman的最新備份集,然后執(zhí)行如下命令:RMANbackup validate datafile 4;檢查4號數(shù)據(jù)文件是否存在壞塊執(zhí)行查詢:select * from v$database_block_corrupt
52、ion where file#=4;如果4號文件存在壞塊的話,那么將在結(jié)果集中有所顯示,會顯示損壞的塊號,根據(jù)顯示結(jié)果執(zhí)行如下命令進(jìn)行恢復(fù):RMANblockrecover datafile 4 block 35 from backupset;該命令執(zhí)行后即可恢復(fù)壞塊,并且不會造成數(shù)據(jù)丟失,但是要求數(shù)據(jù)庫必須要運(yùn)行在歸檔模式下,否則RMAN無法發(fā)揮作用,而且通過RMAN做過最新的數(shù)據(jù)庫備份4.3 使用bbed恢復(fù)使用bbed恢復(fù)時(shí)必須有數(shù)據(jù)文件的拷貝。bbed就是英文block browse edit的縮寫,用來直接查看和修改數(shù)據(jù)文件數(shù)據(jù)的一個(gè)工具。BBED在windows 8i中在$ORAC
53、LE_HOME/bin下可以找到,9i中似乎未隨軟件發(fā)布,故在windows沒有這個(gè)工具,linux下需要編譯,然后把$ORACLE_HOME/rdbms/lib加到環(huán)境變量的PATH里面,就可以直接在命令中bbed了。BBED的缺省口令為blockedit,For Oracle Internal Use only 請謹(jǐn)慎使用Oracle不做技術(shù)支持。BBED具體的使用,參考blog:/tianlesoftware/archive/2009/12/14/5006580.aspx五如何查找壞塊所含的數(shù)據(jù)表名稱和數(shù)據(jù)的rowidrowid的結(jié)構(gòu) HYPERLINK /diego76/prevPho
54、to.do?photoId=_fks_Lvu76spe6CPRQSZmfn9s_o9-Chr01BMR t _blank ROWID 格式擴(kuò)展的ROWID 在磁盤上需要10 個(gè)字節(jié)的存儲空間,并使用18 個(gè)字符來顯示。它包含下列組成元素: 數(shù)據(jù)對象編號:每個(gè)數(shù)據(jù)對象(如表或索引)在創(chuàng)建時(shí)都分配有此編號,并且此編號在數(shù)據(jù)庫中是唯一的 相關(guān)文件編號:此編號對于表空間中的每個(gè)文件是唯一的 塊編號:表示包含此行的塊在文件中的位置 行編號:標(biāo)識塊頭中行目錄位置的位置在內(nèi)部,數(shù)據(jù)對象編號需要32 位、相關(guān)文件編號需要10 位、塊編號需要22 位、行編號需要16 位,加起來總共是80 位或10 個(gè)字節(jié)。擴(kuò)展
55、的ROWID 使用以64 為基數(shù)的編碼方案來顯示,該方案將六個(gè)位置用于數(shù)據(jù)對象編號、三個(gè)位置用于相關(guān)文件編號、六個(gè)位置用于塊編號、三個(gè)位置用于行編號。以64 為基數(shù)的編碼方案使用字符“A-Z”、“a-z”、“0-9” 和“/”。共有64 個(gè)字符,如下例所示:SQL SELECT department_id, rowid FROM hr.departments;DEPARTMENT_ID ROWID 10 AAABQMAAFAAAAA6AAA20 AAABQMAAFAAAAA6AAB30 AAABQMAAFAAAAA6AAC40 AAABQMAAFAAAAA6AAD50 AAABQMAAFAAA
56、AA6AAE60 AAABQMAAFAAAAA6AAF在本例中: AAABQM 是數(shù)據(jù)對象編號 AAF 是相關(guān)文件編號 AAAAA6 是塊編號 AAA 是ID=10 的部分的行編號Oracle7 和更早版本中的受限ROWID:Oracle8 之前的Oracle 數(shù)據(jù)庫版本使用的是受限的ROWID 格式。受限的ROWID 在內(nèi)部僅使用六個(gè)字節(jié),不包含數(shù)據(jù)對象編號。此格式在Oracle7 或更早的發(fā)行版中是可以接受的,因?yàn)槲募幪栐谝粋€(gè)數(shù)據(jù)庫內(nèi)是唯一的。因此,較早的發(fā)行版不允許數(shù)據(jù)文件數(shù)超過1,022 個(gè)。目前,對表空間有此限制。即使Oracle8 通過使用與表空間相關(guān)的文件編號擺脫了這種限制,但
57、受限ROWID 仍用在非分區(qū)表上的非分區(qū)索引之類的對象中,其中所有索引條目指的是同一段中的行。3.行的結(jié)構(gòu) HYPERLINK /diego76/prevPhoto.do?photoId=_fks_gsQbIKD_wv8Z388VLgUUY_tT8x1Opc09 t _blank 行的結(jié)構(gòu)行數(shù)據(jù)作為長度可變的記錄存儲在數(shù)據(jù)庫塊中。通常,一個(gè)行的各列按其定義時(shí)的順序存儲,并且不存儲尾隨的NULL 列。注:對于非尾隨的NULL 列,列長度需要占用一個(gè)字節(jié)。表中的每行具有: 行頭:用來存儲行中的列數(shù)、鏈接信息和行鎖定狀態(tài) 行數(shù)據(jù):對于每一列,Oracle 服務(wù)器存儲列的長度和值(如果該列不超過250
58、 個(gè)字節(jié),則需要一個(gè)字節(jié)來存儲列長度;如果該列超過250 個(gè)字節(jié),則需要三個(gè)字節(jié)來存儲列長度。列值在緊靠列長度字節(jié)后面存儲。)相鄰的行之間不需要任何空格。塊中的每一行在行目錄中都有一個(gè)位置。目錄位置指向行首。5.1. 首先肯定知道那個(gè)數(shù)據(jù)文件壞了,查出該文件的file_id,relative_fno,tablespace_name利用dba_data_files可以查詢file_id(整個(gè)數(shù)據(jù)庫唯一序號),RELATIVE_FNO(相對一個(gè)表空間內(nèi)的序號)5.2. 找到壞塊的ID(可以運(yùn)行dbverify實(shí)現(xiàn)),假設(shè)找到的壞塊ID為1234。5.3.運(yùn)行下面的查詢,根據(jù),壞塊的file_id,
59、block id查找該塊對應(yīng)的owner,segment_type,segment_name等信息 select owner,file_id,segment_name, segment_type, block_id, blocksfrom dba_extentswhere file_id=13 and block_id= 1234;5.4. 根據(jù)壞塊的file_id,owner,segment_name,block_id,如果是數(shù)據(jù)表的話,用下面的查詢來得到對應(yīng)壞塊的rowid假設(shè)owner : DAVE segment_name: BL file_id : 13 block_id : 162
60、運(yùn)行下面的查詢來獲得該塊所含的rowid(如果沒有索引,可能就不能用下面的方式了):select /*+ index(DAVE, i_test) */ rowidfrom DAVE.BLwhere dbms_rowid.rowid_to_absolute_fno(rowid,DAVE,BL)=13and dbms_rowid.rowid_block_number(rowid)=162; 六,如何模擬壞塊DBA 的基本知識,制造壞塊的方法很多的,可以用ultraedit,也可以用dd命令,同時(shí)也可以用orapatch工具6.1 orapatch 工具:$orapatch open tools00
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 注塑車間夜間管理制度
- 大數(shù)據(jù)傳輸?shù)木W(wǎng)絡(luò)解決方案試題及答案
- 報(bào)告編制員管理制度
- 快遞站點(diǎn)員工管理制度
- 汕頭市中考試題及答案
- 收費(fèi)餐具后續(xù)管理制度
- 廚房個(gè)人分管理制度
- 黨史連廊管理制度
- 果園滴水灌溉管理制度
- 度假區(qū)財(cái)務(wù)管理制度
- 理論聯(lián)系實(shí)際闡述文化在社會發(fā)展中具有什么樣的作用?參考答案 二
- 學(xué)前兒童德育課件
- 大學(xué)生外賣消費(fèi)現(xiàn)狀與趨勢分析
- 數(shù)據(jù)投資、數(shù)據(jù)共享與數(shù)據(jù)產(chǎn)權(quán)的法律問題探討
- 2025國家開放大學(xué)《商務(wù)英語1》綜合測試形考任務(wù)答案
- 浪潮軟件開發(fā)面試題目及答案
- 《天然植物化學(xué)成分與抗腫瘤機(jī)制》課件
- 山東綜招試題大全及答案
- 2025年中考語文??甲魑难侯}《10個(gè)主題+15篇范文》
- 2025年《中央一號文件》參考試題庫資料100題及答案(含單選、多選、判斷題)
- 2024年廣西高考?xì)v史試卷真題(含答案解析)
評論
0/150
提交評論