2.6 Oracle Data Pumpエクスポートの使用例
次の一般的なシナリオ例を使用して、パラメータ・ファイルを作成し、Oracle Data Pumpエクスポートを使用してデータを移動する方法について学習します。
- 表モード・エクスポートの実行
この例では、TABLES
パラメータを使用して指定される表モード・エクスポートを示します。 - 選択した表および行のデータのみのアンロード
この例では、選択した表および行のデータのみのアンロードを示します。 - 表モード・エクスポートに必要なディスク領域の見積り
この例では、表モード・エクスポートで使用される領域を見積もる方法を示します。 - スキーマ・モード・エクスポートの実行
この例では、スキーマ・モード・エクスポートの実行方法を示します。 - パラレル全体データベース・エクスポートの実行
パラレル全体データベース・エクスポートを実行する方法を学習するには、この例を使用して構文を理解します。 - 対話方式モードを使用したジョブの停止および再接続
この例では、対話方式モードを使用してジョブを停止する方法、およびジョブに再接続する方法を示します。 - LOBデータ型の破損が検出された場合の表へのロードの継続
この例では、Oracle Data Pumpエクスポート・ジョブでORA-1555エラーに対処する方法を示します。
親トピック: 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
親トピック: Oracle Data Pumpエクスポートの使用例
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"
親トピック: Oracle Data Pumpエクスポートの使用例
2.6.3 表モード・エクスポートに必要なディスク領域の見積り
この例では、表モード・エクスポートで使用される領域を見積もる方法を示します。
この例では、ESTIMATE_ONLY
パラメータを使用して、実際のエクスポート操作を実行することなく、表モード・エクスポートで消費される領域を見積もります。次のコマンドを実行し、BLOCKS
メソッドを使用して、人事管理(hr
)スキーマの3つの表employees
、departments
およびlocations
のデータのエクスポートに必要なバイト数を見積もります。
見積りはログ・ファイルに出力され、クライアントの標準出力デバイスに表示されます。見積りの対象は、表の行データのみです。メタデータは含まれません。
例2-3 表モード・エクスポートに必要なディスク領域の見積り
> expdp hr DIRECTORY=dpump_dir1 ESTIMATE_ONLY=YES TABLES=employees,
departments, locations LOGFILE=estimate.log
親トピック: Oracle Data Pumpエクスポートの使用例
2.6.4 スキーマ・モード・エクスポートの実行
この例では、スキーマ・モード・エクスポートの実行方法を示します。
この例では、hr
スキーマのスキーマ・モード・エクスポートを示します。スキーマ・モード・エクスポートでは、対応するスキーマに属するオブジェクトのみがアンロードされます。スキーマ・モードは、デフォルトのモードであるため、複数のスキーマや自分のスキーマ以外を指定する場合以外、コマンドラインでSCHEMAS
パラメータを指定する必要はありません。
例2-4 スキーマ・モード・エクスポートの実行
> expdp hr DUMPFILE=dpump_dir1:expschema.dmp LOGFILE=dpump_dir1:expschema.log
親トピック: Oracle Data Pumpエクスポートの使用例
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.dmp
、full201.dmp
、full102.dmp
などのダンプ・ファイルが、dpump_dir1
およびdpump_dir2
ディレクトリ・オブジェクトで示されたディレクトリに、ラウンドロビン法で作成されます。最高のパフォーマンスを得るために、Oracleではダンプ・ファイルを個別の入出力(I/O)チャネルに配置することをお薦めします。各ファイルのサイズは、必要に応じて2GBまで拡張されます。最初に、最大3つのファイルが作成されます。必要に応じて、さらにファイルが作成されます。ジョブおよびデータ・ポンプ制御プロセス表の名前はexpfull
です。ログ・ファイルは、dpump_dir1
ディレクトリのexpfull.log
に書き込まれます。
親トピック: Oracle Data Pumpエクスポートの使用例
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
親トピック: Oracle Data Pumpエクスポートの使用例
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を見つけて一時表に格納し、エクスポートする表から除外できるようにします。
- すべての
rowid
を格納するために、corrupt_lobs
という新しい一時表を作成しますSQL> create table corrupt_lobs (corrupt_rowid rowid, err_num number);
- 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
表に挿入されます。 -
破損した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)」を参照してください