Email: service@parnassusdata.com 7 x 24 online support!

    You are here

    • You are here:
    • Home > Blogs > PDSERVICE's blog > エクスポート・ユーティリティを使用して LOB セグメントの破損を確認する方法について

エクスポート・ユーティリティを使用して LOB セグメントの破損を確認する方法について

エクスポート・ユーティリティを使用して LOB セグメントの破損を確認する方法について

 

 

ORACLEデータベース によくあるエラ の解決策

プロのOracle Databaseの復旧サービスを提供
携帯番号: +86 13764045638 メール:service@parnassusdata.com

 

 

 

[概要]
LOB セグメントに破損が生じている場合、エクスポート実行時に以下のエラーが
発生する場合があります。

  ----------------------------------------------------------------------
  ORA-02354: error in exporting/importing data
  ORA-01555: snapshot too old: rollback segment number with name " " too
  small
  ORA-22924: snapshot too old
  ----------------------------------------------------------------------

本文書では、オリジナルの exp ユーティリティや DataPump export (expdp) を
使用して、LOB セグメントの破損を確認する方法について説明します。


[対象リリース]
Oracle Database 10g Release 2(10.2.0) および以降のすべてのリリース


[対象プラットフォーム]
すべてのプラットフォーム


[詳細]

1. LOB セグメントの破損を確認す方法
------------------------------------------------------------------------
Document 787004.1 に記載されている PL/SQL プロシージャを実行することで、破損
した LOB セグメントが参照する表の rowid を特定します。

同様の PL/SQL プロシージャは Document 452341.1Document 253131.1 といった文書
に既に記載されており、この文書は、エクスポート・ユーティリティを使用して
破損したデータをエクスポートすることによって、LOB セグメントの破損を確認
するための方法を示すことを目的としております。

<<確認例>>
========================================================================
もし、EMP 表のエクスポート中に ORA-1555 を受けた場合、Document 787004.1 に記
載されている PL/SQL プロシージャを実行します。なお、EMP 表は、LOB セグメ
ントを割り当てる LOB 列として EMP_XML 列が含まれており、SCOTT ユーザが所
有しているものとします。

* 一時表 "corrupted_lob_data" を作成した後に PL/SQL プロシージャを実行し
   ます。このテーブルには、破損している列の rowid が格納されます。

  SQL> create table corrupted_lob_data (corrupted_rowid rowid);

  SQL> set concat off

  SQL> declare
    2    error_1555 exception;
    3    pragma exception_init(error_1555,-1555);
    4    num number;
    5  begin
    6    for cursor_lob in (select rowid r, &&lob_column
    7                         from &table_owner.&table_with_lob)
    8    loop
    9      begin
   10        num:=dbms_lob.instr(cursor_lob.&&lob_column,hextoraw('889911')) ;
   11      exception
   12        when error_1555 then
   13          insert into corrupted_lob_data values (cursor_lob.r);
   14          commit;
   15      end;
   16    end loop;
   17  end;
   18  /

  上記のプロシージャを実行した後、プロンプトを入力します。

    Enter value for lob_column: EMP_XML
    Enter value for table_owner: SCOTT
    Enter value for table_with_lob: EMP

  SQL> undefine lob_column

  この方法ですべての LOB 列の破損をチェックできます。
  "corrupted_lob_data" 表の出力は、破損した LOB セグメントを参照している
  3 つの rowid を示してます。

  SQL> select * from corrupted_lob_data;

  Corrupted_rowid
  ---------------------
  AAEWBsAAGAAACewAAC
  AAEWBsAAGAAACewAAF
  AAEWBsAAGAAACewAAG

  3 rows seleceted

* DataPump を使用して LOB の破損を確認します。

    % expdp scott/tiger directory=data_pump_dir dumpfile=test.dmp logfile=test.log
        tables=EMP query=\"where rowid=\'AAEWBsAAGAAACewAAC\' \"
    % expdp scott/tiger directory=data_pump_dir dumpfile=test1.dmp logfile=test1.log
        tables=EMP query=\"where rowid=\' AAEWBsAAGAAACewAAF \' \"
    % expdp scott/tiger directory=data_pump_dir dumpfile=test2.dmp logfile=test2.log
        tables=EMP query=\"where rowid=\' AAEWBsAAGAAACewAAG \' \"

  または

* オリジナルの exp ユーティリティを使用して LOB の破損を確認します。

    % exp scott/tiger file=test.dmp log=test.log tables=EMP 
        query=\"where rowid=\'AAEWBsAAGAAACewAAC\' \"
    % exp scott/tiger file=test1.dmp log=test1.log tables=EMP 
        query=\"where rowid=\' AAEWBsAAGAAACewAAF \' \"
    % exp scott/tiger file=test2.dmp log=test2.log tables=EMP 
        query=\"where rowid=\' AAEWBsAAGAAACewAAG \' \"

もし、上記のエクスポートのいずかが失敗した場合は、LOB セグメントが破損し
ていることが確認できます。
========================================================================

2. 対処方法
------------------------------------------------------------------------
LOB セグメントの破損が確認された場合は、以下のいずれかの方法で対処できま
す。

1. 物理バックアップを使用して LOB セグメントをリストア/リカバリーする。

2. Document 787004.1 に記載されているように、UPDATE 文を使用して影響を受けて
   いる LOB セグメントを空にする。

    SQL> update EMP set EMP_XML = empty_blob()
         where rowid in (select Corrupted_rowid from corrupted_lob_data);

3. 破損した rowid の行を除いてエクスポートする。

  DataPump を使用する方法:

    % expdp scott/tiger directory=data_pump_dir dumpfile=test.dmp logfile=test.log 
      tables=EMP query=\"where rowid not 
        in \(\'AAEWBsAAGAAACewAAC\',\'AAEWBsAAGAAACewAAF\' ,\'AAEWBsAAGAAACewAAG\'\)\" 

    * 表示上の都合により改行しております。実際に実行する際は改行せずに実
      行してください。

  オリジナルの exp ユーティリティを使用する場合:

    % exp scott/tiger file=test.dmp log=test.log tables=EMP query=\"where rowid 
      not in \(\'AAEWBsAAGAAACewAAC\',\'AAEWBsAAGAAACewAAF\' ,\'AAEWBsAAGAAACewAAG\'\)\"

    * 表示上の都合により改行しております。実際に実行する際は改行せずに実
      行してください。