用ORACLE8i修復資料庫壞塊的三種方法

oracle_ace發表於2009-11-20
用ORACLE8i修復資料庫壞塊的三種方法 在進行SUN CLUSTER雙機切換、意外斷電或其它情況下,有時會發生共享盤MOUNT不上的情況,需要使用FSCK對共享盤進行修復。修復完成後,在資料庫啟動過程中,卻又出現"資料塊損壞,無法啟動資料庫"的現象,此時,可以根據不同的資料塊損壞型別,檢測並修復錯誤。在此介紹三種使用Oracle8i修復損壞資料塊的方法。
  一、資料塊損壞,錯誤程式碼為ORA-01578
  ORA-1115 I/O ERROR READING BLOCK
  通常後跟ORA-737X錯誤與作業系統錯誤(如UNIX中的錯誤號5)
  產生原因:
  1. 硬體問題(磁碟控制器問題或磁碟問題)
  2. 物理級的資料塊損壞(通常由前一原因造成)
  3. 處理巨型檔案時,後跟錯誤程式碼ORA-7371
  確定故障原因與恢復的方法:
  1. 檢視alert.log檔案中其它ORA-1115錯誤的發生情況:
  1) 如果指向不同磁碟的檔案,則是磁碟控制器的問題,檢視V$DATAFILE,有哪些檔案位於該控制器下,轉到第二步。
  2) 如果指向相同磁碟的不同檔案,則是磁碟的問題,轉到第二步。
  3) 如果指向同一個檔案,執行以下語句查詢檔名:
  SELECT SEGMENT_NAME,SEGMENT_TYPE FROM DBA_EXTENTS WHERE FILE_ID= AND BETWEEN BLOCK_ID
  AND BLOCK_ID+BLOCKS-1;
  其中,檔案號與塊號是ORA-1115中指出的,如果該查詢持續指向某表或索引,則重建它們即可。
  2. 如果檔案是SYSTEM表空間,或處於NOARCHIVELOG模式,關閉資料庫,轉到第四步。
  3. 如果資料庫處於ARCHIVELOG模式,仍應關閉資料庫,如果不能關閉資料庫,則將相應的資料檔案離線:ALTER DATABASE DATAFILE '檔名' OFFLINE;
  4. 試著將資料檔案拷貝到別的磁碟。
  5. 如果拷貝失敗,則檔案將丟失。
  6. STARTUP MOUNT;
  7. 將資料檔案重新命名為成功拷貝到別的磁碟的檔名:
  ALTER DATABASE RENAME FILE '老路徑檔名' TO '新路徑檔名';
  8. ALTER DATABASE OPEN;
  9. RECOVER DATAFILE 檔名;
  ALTER DATABASE DATAFILE '檔名' ONLINE;
  二、回滾段需要恢復
  如果回滾段處於NEED RECOVERY狀態,需要執行以下步驟進行恢復:
  1. 檢視所有聯機的表空間與資料檔案
  2. 在init.ora檔案中加入event = "10015 trace name context forever,level 10",這將生

成一個追蹤檔案,其中含有事務與回滾的資訊。
  3. 關閉並重新開啟資料庫。
  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=;
  6. 必須刪除該物件以釋放回滾塊。
  三、檢測與修復損壞塊的常用方法:
  (一)使用初始化引數DB_BLOCK_CHECKING與DB_BLOCK_CHECKSUM。
  當塊改變時,DB_BLOCK_CHECKING對塊進行邏輯校驗。將防止發生10210 與10211錯誤。
  (二)使用DBMS_REPAIR包,由dbmsrpr.sql與prvtrpr.plb生成該包在特定表中生成損壞塊的資訊。
  1.DBMS_REPAIR.ADMIN_TABLES用於建立與刪除儲存損壞塊的表。其中TABLE_TYPE 為:REPAIR_TABLE(表),ORPHAN_TABLE(索引);ACTION為:CREATE_ACTION(建立表),PURGE_ACTION(刪除無關資料),DROP_ACTION(刪除表)。例:
  dbms_repair.admin_tables('REPAIR_TABLE',DBMS_REPAIR.REPAIR_TABLE,DBMS_REPAIR.CREATE_ACTION,'temp_data');
  2.DBMS_REPAIR.CHECK_OBJECT檢查表、索引、分割槽中的塊損壞。其中OBJECT_TYPE為:TABLE_OBJECT(表),INDEX_OBJECT(索引), REPAIR_TABLE_NAME(用於儲存損壞塊資訊的表)。例:
  dbms_repair.check_object('ORATRAIN','LOCATIONS',corrupt_count=>:cc);
  3.使用以下語句查詢塊損壞資訊:
  SELECT object_name, relative_file_no, block_id, marked_corrupt, corrupt_description, repair_description FROM repair_table;
  4.將塊標誌為損壞的:dbms_repair.fix_corrupt_blocks('ORATRAIN','LOCATIONS',fix_count=>:fc);
  5.跳過損壞塊:dbms_repair.skip_corrupt_blocks('ORATRAIN', 'LOCATIONS');
  其中OBJECT_TYPE為 :TABLE_OBJECT(表),CLUSTER_OBJECT(索引)。
  6.使用REBUILD_FREELISTS重建損壞的空閒列表:DBMS_REPAIR.rebuild_freelists
  7.使用以下方法查詢指向損壞塊的索引:
  (1) 建立存放指向壞塊索引的表
  (2) dbms_repair.dump_orphan_keys('ORATRAIN','LOC_PK',
  orphan_table_name=>'ORPHAN_TAB1',key_count=>:kc);
  (3) SELECT index_name, count(*) FROM orphan_key_table WHERE table_name = 'CLASSES' GROUP BY index_name;
  (4) 重建具有orphan keys的索引
  限制:不能分析Index-organized tables 與 LOB indexes,DUMP_ORPHAN_KEYS不能對bitmap與 function-based indexes操作。
  (三)使用SQL命令ANALYZE TABLE|INDEX … VALIDATE STRUCTURE
  utlvalid.sql.建立含有損壞塊資訊的INVALID_ROWS表,ANALYZE TABLE VALIDATE STRUCTURE CASCADE同時校驗表與索引。
  (四)使用DBVERIFY
  DBVERIFY是一個外部工具,所以對資料庫影響很小。可用於在將備份檔案拷貝回原位置前檢驗備份檔案的完好性,並定位資料塊損壞。命令如下:
  dbv /opt/oracle/db02/oradata/data01.dbf start=1 end=500 logfile=dbv.log

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12361284/viewspace-620156/,如需轉載,請註明出處,否則將追究法律責任。

相關文章