ORA-01578錯誤是Oracle中常見的物理壞塊損壞錯誤。在10g之後,可以使用完整的備份和歸檔日誌在線恢復壞塊,前提是數據塊所在的磁道仍然物理可用。
以下是在沒有足夠備份的情況下對ORA-01578錯誤的解決方案,前提是可以容忍壞塊所在位置的數據丟失:
SQL & gtexec DBMS_STATS。GATHER _ DATABASE _ STATS
開始DBMS_STATS。GATHER _ DATABASE _ STATS結束;
*
第1行出錯:
ORA-01578: ORACLE數據塊已損壞(文件# 4,塊# 870212)
ORA-01110:數據文件4:
/s 01/oradata/g 10r 25/datafile/o 1 _ MF _ users _ 7 ch 7d 4 NX _。dbf
ORA-06512: at“系統DBMS_STATS“,第15188行
ORA-06512: at“系統DBMS_STATS“,第15530行
ORA-06512: at“系統DBMS_STATS“,第15674行
ORA-06512: at“系統DBMS_STATS“,第15638行
ORA-06512:在第1行
使用RMAN blockreocver命令嘗試修改物理壞塊:
RMAN & gt;blockrecover數據文件4塊870212;
開始塊恢復於2002年11月8日65438+開始
通道ORA_DISK_1:從備份條目1還原的塊
塊
handle =/s 01/flash _ recovery _ area/g 10r 25/backupset/2012 _ 08 _ 06/o 1 _ MF _ nnndf _ tag 20120806t 075500 _ 81zd 4 njn _。bkp
標簽=標簽20120806T075500
通道ORA_DISK_1:塊恢復完成,耗時:00:01:16
開始媒體恢復
檔案館
日誌線程1序列467已經作為文件存在於磁盤上
/s 01/flash _ recovery _ area/g 10r 25/archive log/2012 _ 10 _ 31/o 1 _ MF _ 1 _ 467 _ 893571cm _。弧
檔案館
日誌線程1序列468已經作為文件存在於磁盤上
/s 01/flash _ recovery _ area/g 10r 25/archive log/2012 _ 10 _ 31/o 1 _ MF _ 1 _ 468 _ 893 PC 84 l _。弧
檔案館
日誌線程1序列469已經作為文件存在於磁盤上
/s 01/flash _ recovery _ area/g 10r 25/archive log/2012 _ 11 _ 01/o 1 _ MF _ 1 _ 469 _ 894 zs bym _。弧
檔案館
日誌線程1序列470已經作為文件存在於磁盤上
/s 01/flash _ recovery _ area/g 10r 25/archive log/2012 _ 11 _ 01/o 1 _ MF _ 1 _ 470 _ 896 b944 y _。弧
4_.弧
RMAN-00571:= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
RMAN-00569:= = = = = = = = = = = = = = = = = = =錯誤消息堆棧如下= = = = = = = = = = = = = = = = = =
RMAN-00571:= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
RMAN-03002:塊恢復命令在11/08/2012 06:19:40時失敗
RMAN-06053:由於缺少日誌,無法執行介質恢復
RMAN-06025:未找到要還原的日誌線程1 seq 466 low SCN 27762151的備份
RMAN-06025:未找到要還原的日誌線程1 seq 465 low SCN 27762145的備份
RMAN-06025:未找到要還原的日誌線程1 seq 464 low SCN 27762142的備份
由於缺少必要的歸檔日誌,Blockrecover無法成功,因此我們需要尋找另壹種方法。
首先,確認數據塊屬於哪個段。如果是索引數據,可以完全重建而不丟失數據,但如果是表數據,則需要容忍壞塊中的數據丟失:
SQL & gta20的col表空間名
SQL & gta10的列段類型
SQL & gta20的列段名
SQL & gta8的列所有者
SQL & gt選擇表空間名稱,段類型,所有者,段名稱
2來自dba_extents
3其中文件標識= & ampfileid
4和& ampblock_id和block_id + blocks之間的block id-1;
輸入fileid的值:4
舊3:其中文件標識= & ampfileid
新3:其中文件標識= 4
輸入blockid的值:870212
老四:和& amp塊標識和塊標識+塊之間的塊標識- 1
新4:塊標識和塊標識+塊之間的870212-1
表空間_名稱段_TY所有者段_名稱
- - - -
用戶表SYS CORRUPT_ME
SQL & gtselect count(*)from CORRUPT _ ME;
select count(*)from CORRUPT _ ME
*
第1行出錯:
ORA-01578: ORACLE數據塊已損壞(文件# 4,塊# 870212)
ORA-01110:數據文件4:
/s 01/oradata/g 10r 25/datafile/o 1 _ MF _ users _ 7 ch 7d 4 NX _。dbf
SQL & gt分析表corrupt_me驗證結構;
分析表corrupt_me驗證結構
*
第1行出錯:
ORA-01498:塊檢查失敗-請參閱跟蹤文件
SQL & gtoradebug setmypid
報表已處理。
SQL & gtoradebug跟蹤文件名稱
/s 01/admin/g 10r 25/udump/g 10r 25 _ ora _ 19749 . TRC
相對於dba的損壞塊:0x010d4744(文件4,塊870212)
讀取緩沖區時發現錯誤標題
壞塊中的數據:
類型:6格式:2 rdba: 0x000d4744
上次更改SCN:0x 0000.0000000 seq:0x ff flg:0x 04
spare 1:0x 0 spare 2:0x 0 spare 3:0x 0
尾部的壹致性值:0x000006ff
檢查塊頭中的值:0x6323
計算模塊校驗和:0x0
重新讀取rdba: 0x010d4744(文件4,塊870212)發現了相同的損壞數據
*** 2012-11-08 06:23:12.564
表掃描:段:文件# 4塊# 870211
跳過損壞的塊文件# 4塊# 870212
*** 2012-11-08 06:23:36.955
表掃描:段:文件# 4塊# 870211
跳過損壞的塊文件# 4塊# 870212
跳過rdba處損壞的塊:0x010d4744
使用10231級別10來避免ORA-01578錯誤並復制原始壞塊表:
SQL & gtalter session set事件“10231永遠跟蹤名稱上下文,級別10”;
會話已更改。
SQL & gtselect count(*)from CORRUPT _ ME;
計數(*)
-
50857
SQL & gt將表corrupt_me_copy表空間用戶創建為select * from CORRUPT _ ME
表已創建。
SQL & gt分析表corrupt_me_copy驗證結構;
表格已分析。
此後,您只需將新表重命名為舊表並重建索引:
SQL & gt將表corrupt_me重命名為corrupt _ me _ copy 1;
表格已更改。
SQL & gt將表corrupt_me_copy重命名為corrupt _ me;
表格已更改。
SQL & gt重建索引