數據塊損壞後修復 ora-01578



報錯ora-01578
      ora-01110
如果數據庫運行在歸檔模式、有備份,則可以使用RMAN的塊恢復。可以在數據文件在線時進行
RMAN>blockrecover datafile 1 block 28618;

如果沒有備份、歸檔日誌丟失或處於非歸檔模式。DBA只能儘可能減少數據丟失了
ORA-01578中提示的文件號是RFN,
ORA-01110中提示的文件號是AFN
ORA-00600中也是使用AFN

1、確定文件號
可以根據RFN 確認 AFN
select tablespace_name,file_id "AFN",relative_fno "RFN" from dba_data_files;

TABLESPACE_NAME                 AFN     RFN
------------------------------ ---------- ----------
EXAMPLE                               5        5
USERS                                   4        4
SYSAUX                                 3        3
UNDOTBS1                             2        2
SYSTEM                                  1        1


獲得臨時文件的AFN和RFN
SQL> select file_id+value "AFN",relative_fno "RFN" from dba_temp_files,v$parameter where name='db_files';

       AFN       RFN
----------   ----------
       201         1


2、確認受損數據塊所屬的段名、類型、schema、所在表空間。如果ORA錯誤中提示了的文件號和數據塊號,則可以使用下面語句獲得數據塊所在的對象及屬性:
select segment_name,segment_type,owner,tablespace_name
from sys.dba_extents
where file_id=&AFN
and &bad_block_id between block_id and block_id+blocks-1;

3、用DBV或其他工具對數據文件做一個檢查,以儘可能發現是否有更多壞塊。


設計恢復方法(將壞塊跳過,將其他正常數據恢復回來)

處理數據表的壞塊時,還要考慮關聯對象的後續處理。關聯對象包括索引、主鍵約束、外鍵約束,下面討論一下對各種對象的影響及處理方法。
1、如果受損的對象是索引,那麼簡單的把索引刪掉重建就可以了
     如果這個索引是主鍵索引,需要查看是否有外鍵指向這個索引;
     SELECT owner,constraint_name,constraint_type,table_name
     FROM dba_constraints WHERE r_constraint_name='&INDEX_NAME';
     如果是分區索引,要看看屬於哪個分區
     SELECT partition_name
     FROM dba_extents
     WHERE file_id=
     
     修復:
     alter index xxx rebuild online(不帶online會依據久索引(包含壞塊)重建索引)
     alter index xxx rebuild partition yyy 的語句,分區索引重建不會使用舊索引。不用帶online
2、如果壞的是

壞塊表的索引要重建。索引項和數據記錄一般是1:1蛋關係,也就是每條數據記錄都會有一個索引項對應。如果因爲數據塊損壞導致記錄丟失,那麼這些索引項也就失效了,應該被刪除。所以索引要重建。
SQL>select owner,index_name,index_type 
from dba_indexes
where table_owner='&OWNER' and table_name='&SEGMENT_NAME';


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章