³åÍ»¿éµÄ´¦ÀíÖ®¶þ
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
ÒªÇó Êý¾Ý¿â9.2 catalog ºÍrman Êý¾Ý¿âΪ¹éµµ·½Ê½£¬ÓÐÍêÕûµÄÎïÀí±¸·Ý¡£ ¿é»Ö¸´Block Media Recovery (BMR)£¬¿éÊǻָ´µÄ×îСµ¥Ôª£¬Í¨¹ý¿é¿ÉÒÔ¼õÉÙ»Ö¸
5.5 blockrecover