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

2021-03-31 08:57:01 字數 3597 閱讀 6626

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

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

在進行sun cluster雙機切換 意外斷電或其它情況下,有時會發生共享盤mount不上的情況,需要使用fsck對共享盤進行修復。修復完成後,在資料庫啟動過 程中,卻又出現 資料塊損壞,無法啟動資料庫 的現象,此時,可以根據不同的資料塊損壞型別,檢測並修復錯誤。在此介紹三種使用oracle8i修復...

修復資料庫

如果備份的資料庫有2個檔案,分別是.ldf 和 mdf,開啟企業管理器,在例項上右擊 所有任務 附加資料庫,然後選擇那個.mdf檔案,就可以了。或者在查詢分析器中輸入 sp attach db 資料庫名稱 路徑 檔名.ldf 路徑 檔名.mdf sql server資料庫備份有兩種方式,一種是使用b...

SQL資料庫修復 資料庫置疑修復

sql資料庫修復的三大核心技術 1 磁碟陣列分析重組技術 2 資料庫恢復與修復技術 3 scsi盤物理故障開盤技術。至今已經成功恢復數百台伺服器的sql資料庫,使用者覆蓋全國。導致sql資料庫丟失的原因 1 各種原因 誤刪除 誤格式化 斷電等造成的ms sql server資料庫檔案破壞。2 ms ...