數據文件出現壞快的解決之三(做個小試驗)
http://blog.chinaunix.net/u1/50863/showart_400576.html試驗的目的:
1.查找含壞塊的數據的所有的rowid,從而得到損壞的數據量
2.查找損壞表的現在可用的數據量
3.根據1和2得到該表的本來的總的數據量
試驗步驟:
1)參照 數據文件出現壞塊時之五(如何利用dbms_repair來標記和跳過壞塊)的第一步和第二部
建了表空間block,用戶test1107,表test,初始化了數據4512行,模擬了數據壞塊,
并用dbv得到所有的壞塊ID(34~52,68~87)
2)參照 數據文件出現壞快時之三(如何查找壞塊所含的數據表名稱和數據的rowid)的步驟,查找出所有的壞塊包含的rowid
select /*+ index(test1107, i_test)*/ rowid
from test1107.test
where dbms_rowid.rowid_to_absolute_fno(rowid,'TEST1107','TEST')=13
and (dbms_rowid.rowid_block_number(rowid) between 34 and 52 or
dbms_rowid.rowid_block_number(rowid) between 68 and 87);
結果返回了1598行壞記錄
3)參照 數據文件出現壞塊時之六(設置內部事件使exp跳過壞塊)
先exp報錯,后來設置了events事件,然后exp出來,顯示有 2914行,抓屏幕如下:
C:\Documents and Settings\liguohua>exp test1107/aaaa tables=test file=d:\work\temp\test.dmp
即將導出指定的表通過常規路徑 ...
. . 正在導出表 TEST
EXP-00056: 遇到 ORACLE 錯誤 1578
ORA-01578: ORACLE 數據塊損壞(文件號13,塊號34)
ORA-01110: 數據文件 13: 'D:\ORACLE\ORADATA\BLOCK.DBF'
導出成功終止,但出現警告。
C:\Documents and Settings\liguohua>alter system set events='10231 trace name context forever,level 10';
C:\Documents and Settings\liguohua>exp test1107/aaaa tables=test file=d:\work\temp\test.dmp
即將導出指定的表通過常規路徑 ...
. . 正在導出表 TEST 2914 行被導出
在沒有警告的情況下成功終止導出。
結果表示有2914行記錄可用
另外一種方法,其實可以用
select count(1) from test1107.test where rowid not in
(
select /*+ index(test1107, i_test)*/ rowid
from test1107.test
where dbms_rowid.rowid_to_absolute_fno(rowid,'TEST1107','TEST')=13
and (dbms_rowid.rowid_block_number(rowid) between 34 and 52 or
dbms_rowid.rowid_block_number(rowid) between 68 and 87)
);
來查詢可用的記錄數,這樣比較簡單
4)1598 + 2914 = 4512,正好和原表總記錄數吻合!
5)恢復events參數
alter system set events='10231 trace name context off';
posted on 2009-11-25 22:30 gdufo 閱讀(257) 評論(0) 編輯 收藏 所屬分類: Database (oracle, sqlser,MYSQL)