Email: service@parnassusdata.com 7 x 24 online support!
エクスポート・ユーティリティを使用して 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.1 や Document 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\'\)\" * 表示上の都合により改行しております。実際に実行する際は改行せずに実 行してください。