Email: service@parnassusdata.com 7 x 24 online support!
ORA-1578/RMAN/DBVERIFYによって報告された破損オブジェクトの識別方法
ORACLEデータベース によくあるエラ の解決策
プロのOracle Databaseの復旧サービスを提供
携帯番号: +86 13764045638 メール:service@parnassusdata.com
適用範囲:
Oracle Database - Enterprise Edition - バージョン 8.1.5.0 から 12.1.0.1 [リリース 8.1.5 から 12.1]
この文書の内容はすべてのプラットフォームに適用されます。
本文書利用上のご注意
本文書は英語の文書 Document 819533.1 (最終メジャー更新日: 2016年02月17日) の日本語翻訳版です。
英語の文書のメジャー更新に応じて本文書を随時更新いたします。
目的
このノートの目的はエラーORA-1578またはRMAN / DBVERIFYなどのツールによって報告された破損オブジェクトを識別する手順を提供することです。
解決策
絶対ファイル番号(AFN)とブロック番号(BL)を指定します
絶対ファイル番号および相対ファイル番号(RFN)の同じ場合が多くありますが、異なる場合があります(特にデータベースがOracle7 から移行された場合またはトランスポータブル表領域が使用される場合)。正しいAFNおよびRFNを取得することが重要です。そうしないと、間違ったオブ ジェクトを特定する可能性があります。
ORA-1578からAFNの取得
ORA-1578の後に作成された ORA-1110によってAFNが提供されます。 次の例では AFNは5で、BLは34です。
select * from scott.dept_view
*
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 11, block # 34)
ORA-01110: data file 5: '/home/oracle/oradata/users.dbf'
DBVERIFYの出力からAFNの取得
異 なる方法で dbverify によって破損ブロックが報告される場合があります。 通常、DBVERIFY は影響を受けるブロックに関連付 けられた RDBA を提供します。 RFN は dba_data_files から次の問合せで AFN を取得するために使用されます。 いくつか例を挙げます。
RFN=11 BL=34:
Corrupt block relative dba: 0x02c00022 (file 11, block 34)
Bad check value found during dbv:
Data in bad block:
type: 6 format: 2 rdba: 0x02c00022
last change scn: 0x0771.4eebe71c seq: 0x2 flg: 0x04
spare1: 0x0 spare2: 0x0 spare3: 0x0
consistency value in tail: 0xe71c0602
check value in block header: 0xd3ce
computed block checksum: 0x2
Dbverify は常に出力に相対データ・ブロック・アドレス (rdba/dba) をレポートします。 前述の例では相対 dba はメッセージ"Corrupt block relative dba: 0x02c00022 (file 11, block 34)"から取得された16進値 0x02c00022 になります。 rdba/dba は RFN を提供します。 The RFN is then 11. 次の問合せで dba_data_files から AFN を取得します。
dbverify の別の例は次のとおりです。
RFN=11 BL=35:
Dbv出力:
RFN とブロック番号取得するには次の問合せを使用します。
dbms_utility.data_block_address_block(&&rdba) BL
from dual;
例:
2 dbms_utility.data_block_address_block(&&rdba) BL
3 from dual;
Enter value for rdba: 46137379
RFN BL
---------- ----------
11 35
RFN から dba_data_files を使用して AFN を取得します。
from dba_data_files
where relative_fno=&RFN;
例:
2 from dba_data_files
3 where relative_fno=&RFN;
Enter value for rfn: 11
AFN RELATIVE_FNO TABLESPACE_NAME
---------- ------------ ------------------------------
5 11 USERS
AFN は 5 です。
RMANからAFNの取得
RMAN は v$database_block_corruption ビュー内で破損を報告します。
そのビューの FILE# 列は AFN です。BLOCK# 列は BL です。
破損オブジェクトの識別
AFNが識別されると、破損オブジェクトを識別するために次の問合せを実行します。
from dba_extents
where file_id = &AFN
and &BL between block_id AND block_id + blocks - 1;
例:
2 from dba_extents
3 where file_id = &AFN
4 and &BL between block_id AND block_id + blocks - 1;
Enter value for afn: 5
Enter value for bl: 34
OWNER SEGMENT_NAME PARTITION_NAME SEGMENT_TYPE TABLESPACE_NAME EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS RELATIVE_FNO
----- ------------ -------------- ------------ --------------- --------- ------- -------- ---------- ------ ------------
SCOTT DEPT TABLE USERS 0 5 33 65536 8 11
前述の問合せで行が戻されない場合は破壊されたブロックがローカル管理の表領域(LMT)のセグメント・ヘッダーで可能性がありま す。破損したブロックが LMT のセグメント・ヘッダー・ブロックの場合、前述の問合せはアラートログに破損メッセージを生成しますが、問合せは失敗しません。 その場合、次の問い合わせを実行します。
from dba_segments
where header_file = &AFN
and header_block = &BL;
ブロックが空きエクステント(オブジェクトに関連付けられていない)に属する場合やブロックが TEMPFILE の場合は前述の問合せによってデータは返されません。TEMPFILES の場合は「セグメント・タイプ」が「TEMPORARY」と表示されます。
ブロックが空きエクステントに属している場合、DBA_FREE_SPACE に表示されます。
from dba_free_space
where file_id = &AFN
and &BL between block_id AND block_id + blocks - 1;
注意: Oracle10g 以降では ORA-1578 が発生する場合、アラート・ログにも破損オブジェクトの情報が更新されます。例:
TSN = 5, TSNAME = USERS
RFN = 11, BLK = 34, RDBA = 46137378
OBJN = 46107, OBJD = 36440, OBJECT = DEPT, SUBOBJECT =
SEGMENT OWNER = SCOTT, SEGMENT TYPE = Table Segment
破損の修正
破損オブジェクトを特定したら、次の記事に従って破損を修正します。:
If getting corruption error ORA-1578 エラーが発生している場合は、Doc ID 1578.1 の指示に従って破損を修正します。
その他の破損の修正については Doc ID 1635229.1 に従ってください。