程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> 用ORACLE8i修復數據庫壞塊的三種方法

用ORACLE8i修復數據庫壞塊的三種方法

編輯:Oracle數據庫基礎

在進行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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved