用Oracle8i修復數(shù)據(jù)庫壞塊的三種方法
2010-08-28 10:51:18來源:西部e網(wǎng)作者:
在進行SUN CLUSTER雙機切換、意外斷電或其它情況下,有時會發(fā)生共享盤MOUNT不上的情況,需要使用FSCK對共享盤進行修復。修復完成后,在數(shù)據(jù)庫啟動過程中,卻又出現(xiàn)"數(shù)據(jù)塊損壞,無法啟動數(shù)據(jù)庫"的現(xiàn)象,此時,可以根據(jù)不同的數(shù)據(jù)塊損壞類型,檢測并修復錯誤。 在此介紹三種使用Oracle8i修復損壞數(shù)據(jù)塊的方法。
一、數(shù)據(jù)塊損壞,錯誤代碼為ORA-01578
ORA-1115 I/O ERROR READING BLOCK
通常后跟ORA-737X錯誤與操作系統(tǒng)錯誤(如UNIX中的錯誤號5)
產(chǎn)生原因:
1. 硬件問題(磁盤控制器問題或磁盤問題)
2. 物理級的數(shù)據(jù)塊損壞(通常由前一原因造成)
3. 處理巨型文件時,后跟錯誤代碼ORA-7371
確定故障原因與恢復的方法:
1. 查看alert.log文件中其它ORA-1115錯誤的發(fā)生情況:
1) 如果指向不同磁盤的文件,則是磁盤控制器的問題,查看V$DATAFILE,有哪些文件位于該控制器下,轉(zhuǎn)到第二步。
2) 如果指向相同磁盤的不同文件,則是磁盤的問題,轉(zhuǎn)到第二步。
3) 如果指向同一個文件,執(zhí)行以下語句查找文件名:
SELECT SEGMENT_NAME,SEGMENT_TYPE FROM DBA_EXTENTS WHERE FILE_ID=<文件號> AND <塊號> BETWEEN BLOCK_ID
AND BLOCK_ID+BLOCKS-1;
其中,文件號與塊號是ORA-1115中指出的,如果該查詢持續(xù)指向某表或索引,則重建它們即可。
2. 如果文件是SYSTEM表空間,或處于NOARCHIVELOG模式,關(guān)閉數(shù)據(jù)庫,轉(zhuǎn)到第四步。
3. 如果數(shù)據(jù)庫處于ARCHIVELOG模式,仍應關(guān)閉數(shù)據(jù)庫,如果不能關(guān)閉數(shù)據(jù)庫,則將相應的數(shù)據(jù)文件脫機:ALTER DATABASE DATAFILE '文件名' OFFLINE;
4. 試著將數(shù)據(jù)文件拷貝到別的磁盤。
5. 如果拷貝失敗,則文件將丟失。
6. STARTUP MOUNT;
7. 將數(shù)據(jù)文件重命名為成功拷貝到別的磁盤的文件名:
ALTER DATABASE RENAME FILE '老路徑文件名' TO '新路徑文件名';
8. ALTER DATABASE OPEN;
9. RECOVER DATAFILE 文件名;
ALTER DATABASE DATAFILE '文件名' ONLINE;
二、回滾段需要恢復
如果回滾段處于NEED RECOVERY狀態(tài),需要執(zhí)行以下步驟進行恢復:
1. 查看所有聯(lián)機的表空間與數(shù)據(jù)文件
2. 在init.ora文件中加入event = "10015 trace name context forever,level 10",這將生成一個追蹤文件,其中含有事務與回滾的信息。
3. 關(guān)閉并重新打開數(shù)據(jù)庫。
4. 查看TRACE文件,應有error recovery tx(#,#) object #.TX(#,#),指出事務信息,其中object #與sys.dba_objects中的object_id相同。
5. 使用以下查詢找出正在進行恢復的對象:
SELECT owner,object_name,object_type,status FROM dba_objects WHERE object_id=