Oracle Data Pump のパラレル機能 Carol Palmer オラクル社 Principal Product Manager はじめに Oracle Database 10g 上の Oracle Data Pump により 異なるデータベース間のデータとメタデータを高速で移動できます Data Pump の最も便利な機能の 1 つは エクスポート ジョブとインポート ジョブをパラレルに実行しパフォーマンスを高める機能です このホワイト ペーパーでは PARALLEL パラメータが動作する仕組み およびこの機能を最適に実行するためのユーザー処理について説明します PARALLEL パラメータ Data Pump Export および Import(expdp および impdp) の PARALLEL パラメータは Oracle Database 10g の Enterprise Edition においてのみ 1 より大きい値に設定できます このパラメータを 1 より大きい値で使用するには ユーザー権限が必要です (Standard Edition では PARALLEL パラメータは 1 に限定されます ) この機能は メタデータに比べてデータ量が多い大きなジョブで最も便利です 小さなジョブや大量のメタデータを扱うジョブでは 速度の大幅な向上は期待できません 特記しないかぎり このホワイト ペーパーではメタデータではなくデータのパラレル化と移動について説明します メタデータは パラレルにアンロードされることはありませんが パラレルにロードされる場合があります メタデータがパラレルにロードされる状況は 次の 2 つです 複数のワーカーがパラレルにパッケージ本体をロードする場合 ワーカーが索引をすべて作成し パラレル実行プロセス (PX プロセス ) を使用して作業を高速化する場合 パラレル実行プロセスは 大きな索引の場合に経過時間を大幅に削減できます Data Pump に関連する用語では 表データ オブジェクトが保存の基本単位です 表がパーティション化されていない場合 表そのものが表データ オブジェクトとなります 表がパーティション化されているが サブパーティション化されていない場合 パーティションごとに 1 つの表データ オブジェクトが存在します サブパーティションがある場合は サブパーティションごとに 1 つの表データ オブジェクトが存在します Data Pump はマルチプロセス アーキテクチャを使用しており マスター制御プロセスがジョブ項目を 1 つ以上のワーカー プロセスに対してディスパッチします ワーカー プロセスは PX プロセスを使用してデータを移動できます ここでのパラレル化とは パラレルに処理できるアクティブなワーカー プロセスと PX プロセスの合計数を意味します デフォルト PARALLEL 値は 1 です Data Pump が PX プロセスを使用して表のロードまたはアンロードを行う場合 PX プロセスは Data Pump により使用されるパラレル度として扱われますが PX プロセスを開始するワーカー プロセスは PX プロセスが問合せを実行している間はアイドル状態のためカウントされません また ワーカー プロセスが開始されていてもアイドル状態の場合 PARALLEL パラメータにより指定される制限としては考慮されません Oracle Data Pump のパラレル機能 1
マスター制御プロセス / ワーカー プロセス Data Pump の各エクスポート ジョブまたはインポート ジョブに対し 1 つのマスター制御プロセス (MCP) が作成されます MCP は クライアントと通信してジョブ全体を制御し ワーカー プロセスのプールの開始と制御 ロギング処理の実行などを行います マスター制御プロセスは アクティブなワーカー プロセスのプールを作成し パラレル数に達するまで必要に応じて作業項目を処理します マスター制御プロセスは パラレル数としては考慮されません パラレル度は ジョブの処理中に動的に増減できます これは 対話式コマンド モードを介してユーザーにより行われます パラレル度を縮小しても そのジョブと関連付けられたワーカー プロセス数は減りません ある時点で実行中のアクティブなワーカー プロセスの数が削減されるだけです 進行中の作業が通常どおり完了後 パラレル度が実際に減少します したがって パラレル値の減少には時間がかかります アイドル状態のワーカーはジョブが終了するまで削除されません パラレル度の増加は ワーカーまたは PX プロセスによりパラレルに実行できる作業がある場合は すぐに効果を表します パラレルに実行できる作業がない場合 追加のワーカーを必要とする作業ができるまで 新規のワーカー プロセスは作成されません Oracle 10g RAC 環境では ワーカー プロセスはジョブが最初にスケジュールされたインスタンス ( マスター制御プロセスが稼動しているインスタンス ) でのみ開始されます ワーカーが PX プロセスを配置する場合 プロセスは透過的に RAC の別のインスタンスで実行される場合もあります ファイルのダンプ Data Pump Export では PARALLEL パラメータに対して指定する値は ダンプ ファイル セットにあるファイル数以下である必要があります 各ワーカーまたはパラレル実行プロセスは ダンプ ファイルに対して排他的にアクセスする必要があるため ダンプ ファイル数がパラレル度より少ない場合 ワーカーまたは PX プロセスの一部はエクスポートする情報を書き込むことができなくなります この場合 ワーカー プロセスはアイドル状態になり ジョブにファイルが追加されるまで作業は実行されません Data Pump エクスポート ジョブのために複数のダンプ ファイルを指定する方法の詳細は データベース ユーティリティ ガイドの DUMPFILE パラメータの説明を参照してください Data Pump Import の場合 ワーカーと PX プロセスは同じファイルから読取りを実行できます ただし 十分な数のダンプ ファイルがない場合 複数の実行スレッドが同じダンプ ファイルにアクセスしようとするため パフォーマンスが低下することがあります ダンプ ファイルを共有するプロセスが複数ある場合のパフォーマンスへの影響は ダンプ ファイルが入っている I/O サブシステムにより異なります この理由から Data Pump Import では PARALLEL パラメータの値をダンプ ファイル セットにあるファイル数より大きくしないことをお薦めします Oracle Data Pump のパラレル機能 2
アクセス方法 : ダイレクト パスと外部表 Data Pump は 表の行データのロードおよびアンロードに ダイレクト パスと外部表の 2 通りのアクセス方法を提供しています 適用可能なパラレル度はアクセス方法により異なります どちらの方法も同じ外部データ表現をサポートするため 一方の方法でアンロードしたデータをもう一方の方法でロードすることもできます Data Pump はそれぞれの表データ オブジェクトに対して適切な方法を自動的に選択します Data Pump は ファイルを読み書きする外部表アクセス ドライバを提供しています ファイルのフォーマットは ダイレクト パス法で使用されるものと同様のフォーマットです したがって ダイレクト パスの代替として データベース表の高速なロードおよびアンロードにこれを使用できます 外部表の単一ストリームのパフォーマンスはダイレクト パスほど速くはありませんが Direct Path API が使用できない非常に大きな表やパーティションには Oracle パラレル実行エンジンを使用できます Data Pump がデータ アクセスのために外部表を使用する一般的な状況をいくつか示します パラレル SQL を使用でき パラレル Data Pump 処理が要求された状況での非常に大きな表とパーティションをロードおよびアンロードする場合 タイプ BFILE または opaque の列が 1 つ以上入っている表 または opaque 列の入っているオブジェクト タイプをロードおよびアンロードする場合 暗号化された列を持つ表をロードおよびアンロードする場合 QUERY パラメータを使用しての表をアンロードする場合 アクティブなトリガーを持つ表をロードする場合 クラスタ表をロードする場合 挿入に対してファイングレインなアクセス制御を使用する表をロードする場合 パーティション表にグローバル索引を持つ表をロードする場合 Data Pump が外部表を使用する場合の完全なリストは OTN にある次のテクニカル ノート ( 英語 ) を参照してください http://www.oracle.com/technology/pub/notes/technote_pathvsext.html エクスポート処理で PARALLEL パラメータが動作する仕組み この項で説明するエクスポート処理では Oracle Database Enterprise Edition を使用し DUMPFILE パラメータを持つワイルドカード オプションを使用していることを前提としています データとメタデータの両方を含む一般的なエクスポートでは 最初のワーカー プロセスはメタデータ ( 表領域 スキーマ 権限 ロール 索引など ) をアンロードします この単一ワーカーがメタデータをアンロードし 残りのワーカーが同時にすべてのデータをアンロードします メタデータ ワーカーが終了した際 アンロードするデータ オブジェクトがまだ残っている場合 メタデータ ワーカーはデータのアンロードを開始します このドキュメントの例では 1 つのワーカーが常にメタデータのアンロード中であり 残りのワーカーが表データ オブジェクトをアンロードしているとします Data Pump はエクスポート処理ごとに エクスポート ジョブの各表データ オブジェクトがどの程度のディスク領域を消費するかを予測します ( バイト数 ) これは ESTIMATE パラメータが使用されているかどうかにかかわらず実行されます この予測は ログ ファイルに印刷されて クライアントの標準出力装置に表示されます Oracle Data Pump のパラレル機能 3
この予測は 表の行データのみの予測で メタデータは含みません この予測は 何個の PX プロセスを表データ オブジェクトに適用するかの判断に使用されます 表の列を調べて ダイレクト パスまたは外部表のどちらを使用できるか または両方を使用できるかを決定します ダイレクト パスの場合 表データ オブジェクトのパラレル アンロードはサポートしていないため 表データ オブジェクトに対するパラレル数は常に 1 です PX プロセスは 外部表でのみ使用されます 外部表による方法が選択された場合 Data Pump は表データ オブジェクトを処理できる PX プロセスの最大数を判断します 最大数は 表データ オブジェクトの予測サイズを 250MB で割り 結果の端数を切り捨てることで算出されます 結果がゼロまたは 1 の場合 表のアンロードに PX プロセスは使用されません たとえば 表サイズが 600MB である場合 予測サイズを 250MB( パラレルしきい値 ) で割り 端数を切り捨てることにより 2 つのパラレル実行プロセスを使用するものと判断します この場合 メタデータについて 1 つ データについて 1 つ 合計 2 つのワーカー プロセスも存在します データのワーカー プロセスは PX プロセスのコーディネータとして機能し パラレル数としては考慮されません したがって この場合 エクスポート ジョブにより使用されるパラレル度は メタデータ ワーカーについての 1 と PX プロセスについて 2 の合計 3 です ユーザーがログ ファイルを調べる場合 あるいは対話的 STATUS コマンドを使用してワーカーの動作を監視した場合 expdp と impdp での PX プロセスは可視的でないため 2 つのワーカー プロセスしか見えません 表サイズが 400MB の別の例を検討します この場合 パラレル実行プロセスはありません 400 MB を 250 MB で割ると 結果のパラレル値は 1 です ワーカーは パラレル化なしで ダイレクト パスまたは外部表のいずれかを使用してデータをアンロードします 最大パラレル数を使用するほどジョブが大きくない場合 アクティブ ワーカーとパラレル実行プロセスの数が最大に達することはありません たとえば 800MB の表があり 外部表を使用する場合 メタデータに対し 1 つのワーカー データに対し 1 つのワーカー および 3 つの PX プロセスが使用されます 前述したとおり データのワーカー プロセスは PX プロセスのコーディネータとして機能し パラレル数としては考慮されません したがって PARALLEL = 10 と指定されている場合 実際のパラレル度は 4 です STATUS 表示には 1 つのアクティブ ワーカーしか表示されません 指定されたパラレル度に比べてジョブが小さすぎるだけで Data Pump は最適に機能しています より大きなジョブがあり PARALLEL = 4 の場合はどうでしょう 必要に応じて マスター制御プロセスは自動的にワーカーを追加できるでしょうか いいえ PARALLEL パラメータ数は ユーザーが指定した最大数までです 表のパラレル度により ジョブが PARALLEL パラメータにより指定された制限を超える場合 パラレル実行プロセスの数は その制限に合うよう削減されます ただし ユーザーは対話的コマンドラインによりジョブのパラレル度を増やすことができます Real Application Clusters(RAC) 環境では パラレル実行プロセスを他のインスタンスで実行できます Data Pump ジョブが実行されているインスタンスでパラレル実行プロセスが実行されているとはかぎりません したがって Data Pump が最適に実行しているかどうかはさらに不明確になります Oracle Data Pump のパラレル機能 4
インポート処理で PARALLEL パラメータが動作する仕組み PARALLEL パラメータの動作は Import では Export と異なります インポートの際にオブジェクトを作成する場合 様々な依存性が生じるため すべてを順序どおりに行う必要があります Import の場合 まだ存在しない表にデータをロードできないため 当然表が作成されるまではデータをロードできません Data Pump Import は 次の順序でデータベース オブジェクトを処理します 1. 最初のワーカーは すべての表が作成されるまで すべてのメタデータ ( 表領域 スキーマなど ) のロードを行います 2 表が作成されると 最初のワーカーはメタデータのかわりにデータをロードし 残りのワーカーもデータのロードを開始します 3. 表データのロードが終わると 最初のワーカーは再度メタデータのロードに戻ります 残りのワーカーは 最初のワーカーがパッケージ本体までのすべてのメタデータをロードするまでアイドル状態になります 4. 複数のワーカーがパラレルにパッケージ本体をロードします 5. 1 つのワーカーがセカンダリ表までのメタデータをロードします 6. 複数のワーカーがセカンダリ表データをロードします 7. 1 つのワーカーが残りのメタデータをロードします 注意 : 1 つのワーカーがすべての索引を作成しますが PARALLEL 値までの PX プロセスを使用するので 索引は高速で作成されます したがって インポート ジョブは PARALLEL = 10 で開始でき ユーザーにはジョブ実行中の特定の時点で 1 つのワーカーしか使用していないように見えます 他のワーカーやパラレル実行プロセスは 表がすべて作成されるまで機能しません 表が作成されると すべてのワーカーと場合によっては PX プロセスはデータがロードされるまでパラレルに実行され その後 ワーカー プロセスはアイドル状態になります 表データ オブジェクトをロードする場合 Data Pump はダンプ ファイルのデータのサイズを 250MB で割って データをロードするために使用できる潜在的 PX プロセスの数を予測します この数が 1 より大きい場合 パラレル度が十分であれば Data Pump は PX プロセスを使用してデータをロードできます 大きな表データ オブジェクトは 1 つのワーカーによりアンロードされた場合でも パラレルにロードできます PARALLEL パラメータの最大限の活用法 PARALLEL パラメータを使用する場合に考慮すべき一般的ガイドラインを次に示します - パラレル度は CPU 数の 2 倍に設定し そこからチューニングを開始してください - Data Pump Export の場合 PARALLEL パラメータ値はダンプ ファイルの数以下に設定してください - Data Pump Import の場合 PARALLEL パラメータ値はダンプ ファイル セットのファイル数と比べ大きすぎない値に設定してください - 1 より大きい PARALLEL 値は Oracle Database Enterprise Edition のみで使用できます Oracle Data Pump のパラレル機能 5
結論 ユーザーは Data Pump のパラレル機能の使用を最適化して エクスポート ジョブとインポート ジョブをできるかぎり効率的に実行したいと考えます PARALLEL パラメータとワイルドカード ダンプ ファイル テンプレートが使用され ジョブに大量のデータ ( メタデータではなく ) が存在する場合 Export と Import のパフォーマンスは向上します Data Pump は ジョブに対して適用できる最大のパラレル度として PARALLEL パラメータを使用するため どの時点でも最大数のアクティブ ワーカーとパラレル実行プロセスを使用できます ユーザーによるワーカーの監視では ワーカーがビジーである場合と 一部のワーカーがアイドル状態である時間が存在します これは Data Pump が正しく動作していることを表しています Oracle Data Pump のパラレル機能 6