gdufo

           

          數據文件出現壞快的解決之三(做個小試驗)

          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)

          導航

          統計

          常用鏈接

          留言簿(6)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          收藏夾

          Hibernate

          友情鏈接

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 绍兴市| 吉木乃县| 绍兴县| 即墨市| 卢湾区| 阜平县| 察雅县| 泽普县| 庆阳市| 蓝山县| 白山市| 陈巴尔虎旗| 东方市| 南城县| 浙江省| 鄂伦春自治旗| 陆丰市| 朝阳市| 麦盖提县| 安仁县| 石泉县| 河南省| 平乡县| 定陶县| 巫山县| 原平市| 清流县| 扶风县| 江孜县| 鄯善县| 临夏市| 阿拉善左旗| 饶阳县| 安达市| 克什克腾旗| 惠安县| 麦盖提县| 汽车| 靖边县| 罗源县| 甘孜|