°®Òâ·Ò·Ò

19 04, 2005

³åÍ»¿éµÄ´¦ÀíÖ®¶þ

¸öÈ˼¼Êõ — ×÷Õß pradagu @ 13:06

5.2 ROWID RANGE SCAN 

ÕâÀ¼òµ¥µØ½éÉÜÒ»ÏÂrowidµÄÏà¹ØÖªÊ¶£º


ROWID ÔÚ´ÅÅÌÉÏÐèÒª10 ¸ö×ֽڵĴ洢¿Õ¼ä²¢Ê¹ÓÃ18 ¸ö×Ö·ûÀ´ÏÔʾËü°üº¬ÏÂÁÐ×é¼þ,¸ñʽΪ¡¯ OOOOOOFFFBBBBBBSSS¡¯£º

 Êý¾Ý¶ÔÏó±àºÅ(OOOOOO)£ºÃ¿¸öÊý¾Ý¶ÔÏóÈç±í»òË÷ÒýÔÚ´´½¨Ê±¶¼·ÖÅäÓд˱àºÅ£¬²¢ÇҴ˱àºÅÔÚÊý¾Ý¿âÖÐÊÇΨһµÄ£»

Ïà¹ØÎļþ±àºÅ(FFF)£º´Ë±àºÅ¶ÔÓÚÒ»¸ö±í¿Õ¼äÖеÄÿ¸öÎļþÊÇΨһµÄ,ÊÇÏà¶ÔÎļþ±àºÅ(RFN)£»

¿é±àºÅ(BBBBBB)£º±íʾ°üº¬´ËÐеĿéÔÚÎļþÖеÄλÖã»

ÐбàºÅ(SSS)£º±êʶ¿éÍ·ÖÐÐÐĿ¼λÖõÄλÖã»

ÔÚÄÚ²¿Êý¾Ý¶ÔÏó±àºÅÐèÒª32 룬Ïà¹ØÎļþ±àºÅÐèÒª10 룬¿é±àºÅÐèÒª22£¬Î»ÐбàºÅÐèÒª16 룬¼ÓÆðÀ´×ܹ²ÊÇ80 λ»ò10 ¸ö×Ö½Ú£¬ROWID ʹÓÃÒÔ64 Ϊ»ùÊýµÄ±àÂë·½°¸À´ÏÔʾ¸Ã·½°¸½«Áù¸öλÖÃÓÃÓÚÊý¾Ý¶ÔÏ󣬱àºÅÈý¸öλÖÃÓÃÓÚÏà¹ØÎļþ±àºÅÁù¸öλÖÃÓÃÓÚ¿é±àºÅÈý¸öλÖÃÓÃÓÚÐбàºÅÒÔ64 Ϊ»ùÊýµÄ±àÂë·½°¸Ê¹ÓÃ×Ö·ûA-Z a-z 0-9 + ºÍ/¹²64 ¸ö×Ö·û£¬ÈçÏÂÀýËùʾ£º

AAAH7J AAL AAAAAU AAA

ÔÚ±¾ÀýÖÐ

AAAH7J   ÊÇÊý¾Ý¶ÔÏó±àºÅ

AAL       ÊÇÏà¹ØÎļþ±àºÅ

AAAAAU  ÊÇ¿é±àºÅ

AAA       ÊÇÐбàºÅ

 

ΪÁËʹÓÃrowid range scan À´»ñÈ¡ÉдæµÄÊý¾Ý,ÐèÒªÔ¤Ïȵõ½Èçϼ¸¸öÐÅÏ¢

- Original Error     

- Absolute File#     - Referred to as <AFN> in this article

- Relative File#      - Referred to as <RFN> in this article

- Block#              - Referred to as <BL> in this article    

- Object Type       - eg: TABLE , TABLE PARTITION or CLUSTER      

- Object Owner.Name        

- Related Objects    - eg: Indexes, Foreign key constraints , Partition Name etc.. 

º¯Êý ROWID_CREATEÓÐÈçϼ¸¸ö²ÎÊý:

function ROWID_CREATE(rowid_type    IN number,

 object_number IN number,

 relative_fno  IN number,

 block_number  IN number,

 row_number    IN number)

 return ROWID;      

 -- rowid_type      - type (restricted=0/extended=1)     

 -- object_number   - data object number     

 -- relative_fno    - relative file number     

 -- block_number    - block number in this file     

 -- row_number      - row number in this block

 

ÿ¸ö²ÎÊýµÄ»ñÈ¡·½·¨ÔòÈçÏÂ

ROWID_TYPE:

      rowid_typeΪ1£¬ÊÇÒòΪÎÒÃÇÔÚʹÓÃÀ©Õ¹µÄrowid¸ñʽ¡£

     RELATIVE_FNO:

       ÎÒÃÇ¿ÉÒÔ´ÓÊÓͼDBA_EXTENTSÖеõ½RFNºÍ³åÍ»µÄ¿éÊý

       SELECT tablespace_name, relative_fno,                    segment_type, owner, segment_name, partition_name                   FROM dba_extents WHERE file_id = <AFN>   AND <BL> between block_id and block_id + blocks -1 ; 

       ÐèÒª¼ÇסµÄÊÇÔÚoracle8ÖдíÎóORA-1578ÖмǼµÄÊÇRFN,¶ø ORA-1110È´ÊÇAFN. 

     OBJECT_NUMBER:

       ¶ÔÓÚÒ»¸ö·Ç·ÖÇø±í£¬´ÓÊÓͼdba_objectsÖмì²éÁÐDATA_OBJECT_ID ¿ÉµÃÖª

          SELECT data_object_id  FROM dba_objects  WHERE object_name = '<TABLE-NAME>'  AND owner = '<TABLE-OWNER>' ; 

        ¶ø¶ÔÓÚ·ÖÇø±íÀ´Ëµ£¬Ôòÿ¸ö·ÖÇø¶ÔÓ¦Ò»¸ö¶ÔÏóºÅ¡£

           SELECT data_object_id

           FROM dba_objects

          WHERE object_name = '<TABLE-NAME>'

            AND owner = '<TABLE-OWNER>'

           AND subobject_name = '<PARTITION-NAME>' ; 

      BLOCK_NUMBER and ROW_NUMBER:

       ³åÍ»¿éµÄ¿éÊý½«¿ÉÒÔÔÚORA-1578µÄ´íÎóÈÕÖ¾¼°DBV¹¤¾ß¼ì²âµ½µÃµ½£¬   µ±Ê¹ÓÃROWIDʱ£¬ÎÒÃǽ«Éè·¨µÃµ½¿é¿éǰµÄÊý¾Ý(low_id)ºÍ»µ¿éºóµÄÊý¾Ý(high_id)¡£

LOW_RIDÊDZȳåÍ»¿é×îµÍµÄROWID

       SELECT dbms_rowid.rowid_create(1,<DATA_OBJECT_ID>,<RFN>,<BL>,0) LOW_RID from DUAL; 

     HI_RIDÔòÊǸձȳåÍ»¿éROWID´óÒ»µÄROWID

       SELECT dbms_rowid.rowid_create(1,<DATA_OBJECT_ID>,<RFN>,<BL>+1,0) HI_RID       from DUAL;

ÏÖÔÚ¿ÉÒÔͨ¹ýCREATE TABLE AS SELECT or INSERT ... SELECT À´µÃµ½¶ÔÏóÖгýÁ˳åÍ»¿éÖ®ÍâµÄÊý¾Ý¡£

      CREATE TABLE salvage_table AS

        SELECT /*+ ROWID(A) */ * FROM <owner.tablename> A

         WHERE rowid < '<low_rid>' ;

 

       INSERT INTO salvage_table 

        SELECT /*+ ROWID(A) */ * FROM <owner.tablename> A

         WHERE rowid >= '<hi_rid>';

¶ÔÓÚ·ÖÇø±í£¬ÔòÒªÈçÏ´¦Àí

CREATE TABLE salvage_table AS

        SELECT /*+ ROWID(A) */ * 

          FROM <owner.tablename> PARTITION (<partition_name>) A

         WHERE rowid < '<lo_rid>';

 

       INSERT INTO salvage_table 

        SELECT /*+ ROWID(A) */ * 

          FROM <owner.tablename> PARTITION (<partition_name>) A

         WHERE rowid >= '<hi_rid>';

×Ô´Ë£¬³åÍ»±íÖеÄÊý¾Ý¼º±£´æ³öÀ´£¬ÔòÔ­À´µÄ±í¿ÉÒÔͨ¹ýÖØÃüÃû»òɾ³ý¡£ÔÙ°Ñд´½¨µÄ±í¸Ä³ÉÔ­À´µÄ±íÃû¡£

ÏÂÃæÁгöÁËROWID´¦ÀíµÄÒ»¸öÍêÕûµÄÀý×Ó¡£

SQL> select * from scott.partitionexample; 

       ORA-01578: ORACLE data block corrupted (file # 7, block # 12698)

       ORA-01110: data file 7: '/oracle1/oradata/V816/oradata/V816/users01.dbf' 

    >>  <RFN> = 7 , <BL> = 12698 , <AFN> = 7

        ÔÚÕâ¸öÀý×ÓÖУ¬AFNºÍRFNÊÇÒ»ÑùµÄ¡£

       SQL> SELECT tablespace_name, segment_type, owner, segment_name

               FROM dba_extents

              WHERE file_id =7

              AND 12698 between block_id AND block_id + blocks - 1 ; 

        TABLESPACE_NAME  SEGMENT_TYPE       OWNER   SEGMENT_NAME

        ---------------  ------------       -----   ------------

        USERS            TABLE PARTITION    SCOTT   PARTITIONEXAMPLE

 

        SQL> SELECT partition_name FROM dba_extents

              WHERE file_id =7

               AND 12698 between block_id AND block _id + blocks - 1;

 

       PARTITION_NAME

       ------------------------------

       PARTEX2

 

        SQL> SELECT data_object_id

              FROM dba_objects

             WHERE object_name = 'PARTITIONEXAMPLE'  and owner='SCOTT'

               AND subobject_name= 'PARTEX2'; 

       DATA_OBJECT_ID

      ---------------

          88145 

    >> Use the block number in the error first 

       SQL> select dbms_rowid.rowid_create(1, 88145,7,12698,0) from dual; 

       DBMS_ROWID.ROWID_C

       ------------------

       AAAVhRAAHAAADGaAAA

     >> Use the block number +1 next

      SQL>  select dbms_rowid.rowid_create(1, 88145,7,12699,0) from dual;

 

       DBMS_ROWID.ROWID_C

       ------------------

       AAAVhRAAHAAADGbAAA

 

    >> Now we can use the ROWID in SELECT, CTAS, INSERT AS SELECT etc..

 

       SQL> SELECT /*+ ROWID(A) */ * 

              FROM scott.partitionexample A

                WHERE rowid < 'AAAVhRAAHAAADGaAAA';

 

       COLUMN1    COLUMN2

       ---------- ----------

               15 a

              ...

       Èç´ËÔò²»ÔÙÓдíÎóÏÔʾÁË¡£

    >> We can also attempt to see what data WAS in the corrupt block.

    >> Eg: Assume we have an index "PARTEXAM" on "COLUMN1" of our

    >>     "PARTITIONEXAMPLE" table, and COLUMN1 is NOT NULL then we can:

 

       SQL> SELECT /*+ INDEX_FFS(A PARTEXAM) */  column1

              FROM  scott.partitionexample A

             WHERE  rowid >= 'AAAVhRAAHAAADGaAAA'

              AND  rowid <  'AAAVhRAAHAAADGbAAA' ;

        

       COLUMN1

       ----------

               25

       ...

 

5.3 ÉèÖÃʼþ10231 

Ò»°ãÀ´Ëµ,»µ¿é´íÎóºÅΪora-01578,»òÊÇ600´íÎó,»òÊÇÆôÓôËʼþʱ,»µ¿éµÄÊý¾Ý±ØÐëÊÇÓ¦ÓÃÊý¾Ý,¶ø²»ÊÇÊý¾Ý×ÖµäµÄÄÚÈÝ¡£

ÉèÖôËʼþÔÊÐíORACLEÔÚ×öÈ«±íɨÃèʱ,Ìø¹ýÒ»¶¨ÖÖÀàµÄ»µ¿é,´Ëʱδ±»ÆÆ»µµÄÊý¾Ý¿ÉÒÔͨ¹ýexp »òÊÇctasµÄ·½Ê½µ¼³ö

ÔÚsession »òdatabase¼¶Éè10231 event,×öÈ«±íɨÃèʱ£¬¿ÉÒÔÌø¹ý»µ¿é

Session level:

ALTER SESSION SET EVENTS '10231 TRACE NAME CONTEXT FOREVER, LEVEL 10';

CREATE TABLE salvage_emp AS SELECT * FROM corrupt_emp;

 database level:

event="10231 trace name context forever, level 10"

 

Àý×Ó¿ÉÒԲο¼eygleµÄÒ»¸öÀý×Óhttp://www.itpub.net/showthread.php?threadid=201766 £¬Ð»Ð»eygle)

5.4  dbms_repair

±ê¼ÇÓлµ¿éµÄ±í£¬×öÈ«±íɨÃèʱ£¬¿ÉÒÔÌø¹ý»µ¿é

Execute

 DBMS_REPAIR.SKIP_CORRUPT_BLOCKS

('<schema>','<tablename>');

±£´æ±íÖÐÊý¾Ý

EXPORT the table.

 CREATE TABLE salvage_emp

 AS SELECT * FROM corrupt_emp;

 DBMS_REPAIR °ü±»ÓÃÀ´´¦ÀíÔڻỰ²ãºÍÊý¾Ý²ãµÄ³åÍ»(Èí³åÍ»)£¬ÎïÀí³åÍ»µÄ¿é±»±ê¼Ç³öÀ´²¢±»°üËùºöÂÔ¡£

Àý×Ó¿ÉÒԲμûyangtingkunµÄblog

http://blog.itpub.net/post/468/9121

5.5 blockrecover

񻂗

Êý¾Ý¿â9.2

catalog ºÍrman

Êý¾Ý¿âΪ¹éµµ·½Ê½£¬ÓÐÍêÕûµÄÎïÀí±¸·Ý¡£

¿é»Ö¸´Block Media Recovery (BMR)£¬¿éÊǻָ´µÄ×îСµ¥Ôª£¬Í¨¹ý¿é¿ÉÒÔ¼õÉÙ»Ö¸

×îлظ´


·¢±íÆÀÂÛ