• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    數據庫相關:如何使用DBMS_REPAIR檢測和修補數據壞塊

    發布: 2008-5-06 09:53 | 作者: GOD | 來源: 希賽網 | 查看: 86次 | 進入軟件測試論壇討論

    領測軟件測試網

     五、使用DBMS_REPAIR.DUMP_ORPHAN_KEYS來修補相關的index

      DUMP_ORPHAN_KEYS將會顯示指向數據壞塊中記錄的index entries

      下列查詢顯示與壞塊相關的index。

      SQL> select index_name from dba_indexes
      2 where table_name in (select distinct object_name from repair_table);
      INDEX_NAME
      ------------------------------
      T1_PK
      SQL> @dumpOrphanKeys
      SQL> set serveroutput on
      SQL>
      SQL> declare
      2 key_count int;
      3 begin
      4 key_count := 0;
      5 dbms_repair.dump_orphan_keys (
      6 schema_name => 'SYSTEM',
      7 object_name => 'T1_PK',
      8 object_type => dbms_repair.index_object,
      9 repair_table_name => 'REPAIR_TABLE',
      10 orphan_table_name => 'ORPHAN_KEY_TABLE',
      11 key_count => key_count);
      12 dbms_output.put_line('orphan key count: ' || to_char(key_count));
      13 end;
      14 /
      orphan key count: 3
      PL/SQL procedure successfully completed.
      orphan_key_table的結構如下:
      SQL> desc orphan_key_table
      Name Null? Type
      ----------------------------------------- -------- ----------------------------
      SCHEMA_NAME NOT NULL VARCHAR2(30)
      INDEX_NAME NOT NULL VARCHAR2(30)
      IPART_NAME VARCHAR2(30)
      INDEX_ID NOT NULL NUMBER
      TABLE_NAME NOT NULL VARCHAR2(30)
      PART_NAME VARCHAR2(30)
      TABLE_ID NOT NULL NUMBER
      KEYROWID NOT NULL ROWID
      KEY NOT NULL ROWID
      DUMP_TIMESTAMP NOT NULL DATE
      下列查詢顯示t1_pk index中有3個index entries與壞塊有關:
      SQL> select index_name, count(*) from orphan_key_table
      2 group by index_name;
      INDEX_NAME COUNT(*)
      ------------------------------ ----------
      T1_PK 3

      在orphan_key_table 中的Index entry意味著該index應該重建,以保證一個table的指針和它的index指針返回同樣的結果集合。

      六、使用DBMS_REPAIR.SKIP_CORRUPT_BLOCKS來跳過壞塊

      SKIP_CORRUPT_BLOCKS用來決定在對指定object的index和table做搜索時是否跳過壞塊。

      如果index和table不同步,那么一個‘SET TRANSACTION READ ONLY'的transaction可能會出現不一致的情況,例如一個查詢僅僅指向index,而它的子查詢卻同時指向index和table。 如果table的block已經被標識為壞了,那么這兩個查詢將會返回不同的結果。

      建議:如果SKIP_CORRUPT_BLOCKS被enable,那么必須重建orphan_key_table中確定的所有indexes(或所有與該object相關的indexes,如果在DUMP_ORPHAN_KEYS被忽略的情況下)。

      SQL> @skipCorruptBlocks
      SQL> declare
      2 begin
      3 dbms_repair.skip_corrupt_blocks (
      4 schema_name => 'SYSTEM',
      5 object_name => 'T1',
      6 object_type => dbms_repair.table_object,
      7 flags => dbms_repair.skip_flag);
      8 end;
      9 /
      PL/SQL procedure successfully completed.

      下列查詢顯示跳過壞塊已經enable。

      SQL> select table_name, skip_corrupt from dba_tables
      2 where table_name = 'T1';
      TABLE_NAME SKIP_COR
      ------------------------------ --------
      T1 ENABLED

      壞塊中的記錄被跳過后,全表掃描不再顯示錯誤。

      SQL> select * from system.t1;
      COL1 COL2
      --------------------------------------------
      4 dddd
      5 eeee

      注意此時pk index還沒有被修正。不能往t1 table中插入數據

      SQL> insert into system.t1 values (1,'aaaa');
      insert into system.t1 values (1,'aaaa')
      *
      SQL> select * from system.t1 where col1 = 1;
      no rows selected

      七、使用DBMS_REPAIR.REBUILD_FREELISTS重建freelists

      REBUILD_FREELISTS重建指定object的freelists。

      SQL> declare
      2 begin
      3 dbms_repair.rebuild_freelists (
      4 schema_name => 'SYSTEM',
      5 object_name => 'T1',
      6 object_type => dbms_repair.table_object);
      7 end;
      8 /
      PL/SQL procedure successfully completed.

      八、重建Index

      在orphan_key_table中確定的每一個index都必須重建,以保證查詢結果的一致。

      SQL> alter index system.t1_pk rebuild online;
      Index altered.

      重建index后,就能往t1 table中插入數據。

      SQL> insert into system.t1 values (1, 'aaaa');
      1 row created.
      SQL> select * from system.t1;
      COL1 COL2
      --------------------------------------------
      4 dddd
      5 eeee
      1 aaaa

      以上的insert語句只是提供一個簡單的例子。如果我們真能知道丟失的數據內容,那當然是最好的。臨時表(temp_t1)應該用來存放所有從壞塊中抽取的記錄。

      到此時table T1已經可以被再用,但同時數據也有丟失。一般來說,在使用DBMS_REPAIR package之前,應認真考慮數據的丟失問題,因為從index segment和table dump中采集信息非常復雜,同時邏輯上的不一致也可能被引入。要記。涸贒BMS_REPAIR package 初始版本中,“修補壞塊”的功能僅僅是“將塊標識為由軟件引起的壞塊”而已。

      在進行上述操作前,必須先閱讀〈Oracle8i Administrator's Guide〉中“Detecting and Repairing Data Block Corruption"章節,同時對風險進行評估。所有操作最好是在Oracle工程師的指導下進行。

     

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/

    33/3<123

    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>