2.6 Oracle Data Pumpエクスポートの使用例

次の一般的なシナリオ例を使用して、パラメータ・ファイルを作成し、Oracle Data Pumpエクスポートを使用してデータを移動する方法について学習します。

2.6.1 表モード・エクスポートの実行

この例は、TABLESパラメータを使用して指定される表モード・エクスポートを示しています。

この例では、データ・ポンプ・エクスポート・コマンドにより、人事管理(hr)スキーマから表employeesおよびjobsの表エクスポートを実行します。

ユーザーhrは、自分のスキーマ内の表をエクスポートしているため、表名の前にスキーマ名を指定する必要はありません。NOLOGFILE=YESパラメータは、その操作のエクスポート・ログ・ファイルが生成されないことを示します。

例2-1 表モード・エクスポートの実行

expdp hr TABLES=employees,jobs DUMPFILE=dpump_dir1:table.dmp NOLOGFILE=YES

2.6.2 選択した表および行のデータのみのアンロード

この例は、選択した表および行のデータのみのアンロードを示しています。

この例では、表countriesおよびregionsを除く人事管理(hr)スキーマ内のすべての表について、データのみのアンロードを実行するために使用可能なパラメータ・ファイル(exp.par)の内容を示します。employees表から、department_idが50以外の行がアンロードされます。行は、employee_id順にソートされます。

次のコマンドを使用して、exp.parパラメータ・ファイルを実行できます。

> expdp hr PARFILE=exp.par

このエクスポートにより、スキーマ・モード・エクスポート(デフォルト・モード)が実行されますが、CONTENTパラメータによって、エクスポートが表のデータのみのアンロードに効果的に制限されます。ディレクトリ・オブジェクトdpump_dir1,は、DBAによってすでに作成されています。このオブジェクトは、エクスポート・ダンプ・ファイルに対する読取りおよび書込み権限がユーザーhrに付与されているサーバー上のディレクトリを示しています。ダンプ・ファイルdataonly.dmpは、dpump_dir1に作成されます。

例2-2 選択した表および行のデータのみのアンロード

DIRECTORY=dpump_dir1
DUMPFILE=dataonly.dmp
CONTENT=DATA_ONLY
EXCLUDE=TABLE:"IN ('COUNTRIES', 'REGIONS')"
QUERY=employees:"WHERE department_id !=50 ORDER BY employee_id"

2.6.3 表モード・エクスポートに必要なディスク領域の見積り

この例では、表モード・エクスポートで使用される領域を見積もる方法を示します。

この例では、ESTIMATE_ONLYパラメータを使用して、実際のエクスポート操作を実行することなく、表モード・エクスポートで消費される領域を見積もります。次のコマンドを実行し、BLOCKSメソッドを使用して、人事管理(hr)スキーマの3つの表employeesdepartmentsおよびlocationsのデータのエクスポートに必要なバイト数を見積もります。

見積りはログ・ファイルに出力され、クライアントの標準出力デバイスに表示されます。見積りの対象は、表の行データのみです。メタデータは含まれません。

例2-3 表モード・エクスポートに必要なディスク領域の見積り

> expdp hr DIRECTORY=dpump_dir1 ESTIMATE_ONLY=YES TABLES=employees, 
departments, locations LOGFILE=estimate.log

2.6.4 スキーマ・モード・エクスポートの実行

この例では、スキーマ・モード・エクスポートの実行方法を示します。

この例では、hrスキーマのスキーマ・モード・エクスポートを示します。スキーマ・モード・エクスポートでは、対応するスキーマに属するオブジェクトのみがアンロードされます。スキーマ・モードは、デフォルトのモードであるため、複数のスキーマや自分のスキーマ以外を指定する場合以外、コマンドラインでSCHEMASパラメータを指定する必要はありません。

例2-4 スキーマ・モード・エクスポートの実行

> expdp hr DUMPFILE=dpump_dir1:expschema.dmp LOGFILE=dpump_dir1:expschema.log

2.6.5 パラレル全データベース・エクスポートの実行

パラレル全データベース・エクスポートの実行方法を学習するには、この例を使用して構文を理解します。

この例は、3つのパラレル・プロセス(ワーカーまたはパラレル問合せワーカー・プロセス)を使用できる全データベース・エクスポートを示しています。

例2-5 パラレル全体エクスポート

> expdp hr FULL=YES DUMPFILE=dpump_dir1:full1%U.dmp, dpump_dir2:full2%U.dmp
FILESIZE=2G PARALLEL=3 LOGFILE=dpump_dir1:expfull.log JOB_NAME=expfull

このエクスポートは、全データベース・エクスポートであるため、データベースのすべてのデータおよびメタデータがエクスポートされます。full101.dmpfull201.dmpfull102.dmpなどのダンプ・ファイルが、dpump_dir1およびdpump_dir2ディレクトリ・オブジェクトで示されたディレクトリに、ラウンドロビン法で作成されます。最高のパフォーマンスを得るために、Oracleではダンプ・ファイルを個別の入出力(I/O)チャネルに配置することをお薦めします。各ファイルのサイズは、必要に応じて2GBまで拡張されます。最初に、最大3つのファイルが作成されます。必要に応じて、さらにファイルが作成されます。ジョブおよびデータ・ポンプ制御プロセス表の名前はexpfullです。ログ・ファイルは、dpump_dir1ディレクトリのexpfull.logに書き込まれます。

2.6.6 対話方式モードを使用したジョブの停止および再接続

この例では、対話方式モードを使用してジョブを停止したり、ジョブに再接続する方法を示します。

この例を開始する前に、次に示すパラレル全体エクスポートを再実行します。

パラレル全データベース・エクスポートの実行

エクスポートの実行中、[Ctrl]を押しながら[C]を押します。このキーボード・コマンドでは、データ・ポンプ・エクスポートの対話方式コマンド・インタフェースを起動します。対話方式インタフェースでは、端末へのロギングは停止され、データ・ポンプ・エクスポートのプロンプトが表示されます。

ジョブの状態が表示された後、CONTINUE_CLIENT コマンドを実行して、ロギング・モードを再開し、expfullジョブを再起動できます。

Export> CONTINUE_CLIENT

ジョブが再オープンされたことを示すメッセージが表示され、処理の状態がクライアントに出力されます。

例2-6 ジョブの停止と再接続

エクスポート・プロンプトで、次のコマンドを実行してジョブを停止します。

Export> STOP_JOB=IMMEDIATE
Are you sure you wish to stop this job ([y]/n): y

このジョブは停止状態でクライアントを終了します。

停止したジョブに再接続するには、次のコマンドを入力します。

> expdp hr ATTACH=EXPFULL

2.6.7 LOBデータ型の破損が検出された場合の表へのロードの継続

この例では、Oracle Data Pumpエクスポート・ジョブでのORA-1555エラーに対処する方法を示します。

ラージ・オブジェクト・データ型(LOB)列(BLOB、CLOB、NCLOBまたはBFILE)を含む表があり、完了に数時間を要する大量の行があるとします。エクスポート・ジョブ中に、Oracle Data PumpでORA-1555エラー(「ORA-01555: スナップショットが古すぎます: ロールバック・セグメント番号、名前""が小さすぎます」)が発生しました。部分的な行のエクスポートを試みないことをお薦めします。この回避策を試みると、さらに破損が発生する可能性があるためです。かわりに、LOB表をエクスポートする前に、この例のスクリプトを使用して破損したLOBのROWIDを見つけ、エクスポート前にそれらの行を空にするか、エクスポートからそれらの行を除外するかのいずれかによって表を修復することをお薦めします。

例2-7 大規模な表でのLOB破損の検出

このスクリプトを使用して、LOBの破損を確認し、破損したLOB IDを見つけて一時表に格納し、エクスポートする表から除外できるようにします。

  1. すべてのrowidを格納するために、corrupt_lobsという新しい一時表を作成します
    SQL> create table corrupt_lobs (corrupt_rowid rowid, err_num number);
        
  2. LOB列を含む大規模な表<TABLE_NAME>に関してdescを作成します:
    DESC <TABLE_NAME>
    
    Name         Null?     Type 
    ----------   --------- ------------
    <COL1>       NOT NULL  NUMBER 
    <LOB_COLUMN>           BLOB 

    次のPL/SQLブロックを実行します:

    declare 
      error_1578 exception; 
      error_1555 exception; 
      error_22922 exception; 
      pragma exception_init(error_1578,-1578); 
      pragma exception_init(error_1555,-1555); 
      pragma exception_init(error_22922,-22922); 
      n number; 
    begin 
      for cursor_lob in (select rowid r, <LOB_COLUMN> from <TABLE_NAME>) loop 
      begin 
        n:=dbms_lob.instr(cursor_lob.<LOB_COLUMN>,hextoraw('889911')); 
      exception 
        when error_1578 then 
          insert into corrupt_lobs values (cursor_lob.r, 1578);
          commit; 
        when error_1555 then 
          insert into corrupt_lobs values (cursor_lob.r, 1555);
          commit; 
        when error_22922 then 
          insert into corrupt_lobs values (cursor_lob.r, 22922);
          commit; 
        end; 
      end loop; 
    end; 
    / 

    このPL/SQLスクリプトの結果、破損したLOBのROWIDがすべて、新しく作成されたcorrupt_lobs表に挿入されます。

  3. 破損したLOB行を空にするか、破損したLOB行を除いた表をエクスポートして、破損したLOBのrowidの問題を解決します。

    • 破損したLOB行を空にする

      このオプションでは、SQL文を実行して行を空にします。この例では、選択した行がBLOB列またはBFILE列であるため、EMPTY_BLOBを使用します。CLOB列およびNCLOB列の場合は、EMPTY_CLOBを使用します。

      SQL> update <TABLE_NAME> set <LOB_COLUMN> = empty_blob() 
           where rowid in (select corrupt_rowid from corrupt_lobs);
    • 破損したLOB行を除いた表をエクスポートする

      環境に応じた値を指定して、このスクリプトを使用します:

      $ expdp system/<PASSWORD> DIRECTORY=my_dir DUMPFILE=<dump_name>.dmp LOGFILE=<logfile_name>.log TABLES=<SCHEMA_NAME>.<TABLE_NAME> QUERY=\"WHERE rowid NOT IN \(\'<corrupt_rowid>\'\)\"

ORA-1555エラーを特定して解決する方法と、LOB PCTVERSIONまたはRETENTIONが低いことによるLOBセグメントの問題と区別する方法の詳細は、My Oracle Supportドキュメント「Export Receives The Errors ORA-1555 ORA-22924 ORA-1578 ORA-22922 (ドキュメントID 787004.1)」を参照してください