スキーマの同期化の使用
スキーマの同期化では、2つのデータベース間またはベースラインとデータベース間のデータベース・オブジェクト定義の相違が同期化されます。データベースの同期化の基本アクションは、選択されたオブジェクト定義をデータベースで作成または変更し、別のデータベースまたはベースラインのオブジェクト定義と一致させることです。
同期化は、同期化指定を使用して生成されます。同期化の場合、有効範囲の指定に個々のオブジェクトの名前は含まれていません。有効範囲にはタイプ、追加または除外するスキーマのみを指定できます。また、接頭辞を追加して、その接頭辞で始まる名前のオブジェクトのみを選択できます。
スキーマの同期化では、サポートされる任意のタイプのオブジェクト間で属性値の相違が同期化されます。同期化指定を使用して、複数の同期化バージョンを作成できます。各バージョンには、一意のバージョン番号と同期化日が割り当てられます。これらのバージョンを使用して、現在までに作成されたデータベース(スキーマ)の同期化を関連付けます。
スキーマの同期化の定義について
同期化のソースにより、宛先データベースの同期元となるオブジェクト定義(およびオプションでデータ)が提供されます。同期化のソースには、データベースまたはベースライン・バージョンを指定できます。ソースがベースライン・バージョンの場合、ベースラインではデータが取得されないため、宛先にデータを伝播することはできません。
同期化の宛先には、常にデータベースを指定する必要があります。同期化の目的は、ソースのオブジェクト定義と一致するように宛先のオブジェクト定義を作成または変更することです。
使用するソース・ベースラインのバージョンの指定オプションは、スキーマの比較で使用されるオプションとほぼ同じです。固定ベースライン・バージョンを指定するか、「最新」または「最新 - 1」を指定できます。「最新」を選択すると、宛先を同期化する前にベースライン・バージョンを取得するよう指定できます。
同期化のソースとして使用するベースラインを定義する場合、同期化するすべてのオブジェクトがそのベースラインに含まれていることが重要です。このため、ベースラインの有効範囲指定には、最低でも同期化するすべてのスキーマとオブジェクト・タイプが含まれている必要があります。また、ベースラインには、ユーザーおよびロール・オブジェクトと、権限付与も含まれている必要があります。変更が頻繁にソース・データベースに適用されることが予測され、データベースのポイント・イン・タイム・スナップショット(つまり、同期化のソースとなるベースライン)が必要とされる環境では、データベースの同期化にベースラインを使用することをお薦めします。
スキーマの同期化の有効範囲指定の定義方法は、スキーマのベースラインまたは比較の有効範囲指定の定義方法とほぼ同じです。ただし、有効範囲指定に含めることができる項目については、次の制限があります。
-
同期化に個々のオブジェクトを指定することはできません。オブジェクト・タイプと、含めるスキーマまたは除外するスキーマを指定する必要があります。
-
SYSやSYSTEMなどの特定のスキーマは、同期化できません。
-
同期化にユーザーおよびロール・オブジェクトを直接含めることはできません。(ただし、ユーザーとロールは、同期化プロセス中に必要に応じて自動的に含められます。)
-
表、索引、クラスタ、マテリアライズド・ビューおよびマテリアライズド・ビュー・ログの各オブジェクト・タイプは、グループとして選択することをお薦めします。
同期化の有効範囲指定は、アプリケーションに合せて慎重に調整する必要があります。不要なスキーマを含めないでください。たとえば、大規模なアプリケーションのモジュールを同期化する場合、そのモジュールを構成するスキーマのみを含めます。大規模なアプリケーション(またはデータベース全体)を一度に同期化することは避けてください。
スキーマの同期化におけるスキーマ・マップの定義および使用方法は、スキーマの比較の場合と同じです。スキーマ・マップを使用すると、各スキーマ・マップのオブジェクト定義は、同じ名前のスキーマではなく、宛先のマップされたスキーマに同期化されます。また、スキーマ修飾参照(PL/SQLブロックおよびビュー問合せに含まれるもの以外)は、スキーマ・マップに応じて変更されます。
たとえば、スキーマ・マップに次の2つのエントリが含まれるとします。
-
DEV1A -> DEV2A
-
DEV1B -> DEV2B
表DEV1A.T1には索引DEV1A.T1_IDXがあります。DEV1B.T2を参照する外部キー制約もあります。同期化で、次のようなオブジェクトが作成されます。
-
表DEV2B.T2
-
表DEV2A.T1(表DEV2B.T2に対する外部キー参照付き)
-
索引DEV2A.T1_IDX(表DEV2A.T1内)
スキーマの同期化オプションは、スキーマの比較で指定できるオプションとほぼ同じです。同期化では、オプションで次の2つの機能を実行します。
-
ソース・オブジェクトと宛先オブジェクトの最初の比較中に、オプションにより相違を重要視するかどうかを決定します。たとえば、「表領域を無視」オプションを選択すると、表領域の相違は無視されます。2つの表が表領域以外は同一の場合、宛先表に対する変更操作は行われません。
-
宛先にオブジェクトを作成するスクリプトを生成する場合、一部のオプションでスクリプトの内容を制御します。たとえば、「表領域を無視」を選択すると、TABLESPACE句は生成されません。
スキーマの比較で提供されるオプション以外に、同期化に固有の次のオプションがあります。
-
「宛先のデータを保持」および「ソースからデータをコピー」—これらの2つのオプションでは、ソース・データベースから宛先データベースに表データをコピーするかどうかを制御します。(ソースがベースラインの場合、このオプションは使用できません。)デフォルトでは、同期化により宛先表のデータは保持されます。「ソースからデータをコピー」を選択すると、同期化により、宛先のデータがソース表のデータで置き換えられます。
-
「宛先のみのスキーマ・オブジェクトを削除」—このオプションを選択すると、宛先に存在してソースに存在しないスキーマ・オブジェクトを削除するよう同期化に指示されます。たとえば、ソースに表DEV1.T1が含まれ、宛先にDEV1.T1およびDEV1.T2が含まれる場合にこのオプションを選択すると、同期化によりDEV1.T2は削除されます。この処理は、有効範囲指定内のスキーマ・オブジェクトにのみ適用されます。デフォルトでは、同期化により宛先のみに存在するオブジェクトは削除されません。非スキーマ・オブジェクトは、同期化で削除されることはありません。
同期化を定義する次のステップは、同期化モードの選択です。次の2つのオプションがあります。
-
自動同期化モードでは、同期化プロセス全体が1ステップで実行され、最後に同期化スクリプトが実行されます。ただし、適切なスクリプトの生成を妨げるエラーが検出された場合、プロセスはスクリプトを実行せずに終了します。
-
インタラクティブ同期化モードでは、ソース・オブジェクトと宛先オブジェクトの最初の比較後に処理が一時停止し、同期化スクリプトの生成後に再開します。インタラクティブ・モードでは、比較とスクリプト生成の結果を検討し、次のステップに進む前に適切な操作を実行できます。
同期化バージョンの作成
同期化の定義が終了したら、最初の同期化バージョンを作成する時期を指定します。最初のバージョンは、即座に作成するか、後で作成できます。一定の間隔で新しい同期化バージョンをスケジュールすることもできます。
選択した同期化モードに応じて、同期化は最後まで実行されるか(自動モード)、最初のオブジェクト比較の後に一時停止します(インタラクティブ・モード)。インタラクティブ・モードの場合、同期化の各後続フェーズは新規ジョブとして実行します。
インタラクティブ・モードを使用する場合、宛先データベースは、オブジェクトの最初の比較時から同期化スクリプトを実行するまで変更できません。変更すると、スクリプトに問題が発生します。たとえば、宛先に存在しない表がソースに含まれているとします。オブジェクトの比較で、ソースのみに存在する表が認識され、生成されるスクリプトにはその表を作成する文が組み込まれます。このとき、オブジェクトの比較後で、スクリプトの実行前に宛先データベースに手動でその表を作成します。表はすでに存在するため、表を作成しようとするとスクリプトは失敗します。
スキーマの比較バージョンの操作についてを参照してください。
比較からの同期化定義の作成
スキーマの比較を同期化の開始点として使用できます。比較を選択してから、「同期化」を選択します。これにより、比較に基づく次の初期情報を含んだ新しい同期化が作成されます。
-
ソースと宛先(比較の左側のソースと右側のソースにそれぞれ対応)。この場合、右側のソースがベースラインである比較からは、同期化を作成できません。
-
有効範囲指定。
ノート:
比較の有効範囲指定オプションの一部は、同期化で使用できません。たとえば、ユーザー・オブジェクトやロール・オブジェクトなどの個々のスキーマ・オブジェクトは同期化できません。 -
比較オプション。
スキーマの同期化バージョンの操作
各同期化バージョンは、対応するソース・オブジェクトに一致するように、有効範囲指定で選択された宛先オブジェクトを変更しようとする試行のことです。(「試行」であるのは、様々な理由からプロセスが完了しない場合があるためです。)この項では、スキーマの同期化バージョンの処理のされ方、およびプロセスのモニターと制御の方法について説明します。
スキーマの同期化サイクルについて
同期化バージョンの処理には、3つのステップが関連します。前述したとおり、(自動モードを選択して)3つのステップを1つに結合するか、(インタラクティブ・モードを選択して)各ステップを個別に実行します。どちらの場合でも、同期化バージョンを正常に処理するには、3つのステップをすべて実行する必要があります。
次の項では、3つの各ステップについて詳しく説明します。また、インタラクティブ・モードでの操作時に各ステップの後に実行できる処理について説明します。
オブジェクト比較ステップ
最初のステップでは、ソースのオブジェクトを宛先の対応するオブジェクトと比較します。有効範囲指定により選択されたオブジェクトのみが比較されます。このステップの最後の時点で、同期化バージョンにはすべてのオブジェクトが記録されています。各オブジェクトの状態は、次のいずれかです。
-
ソースのみ
-
宛先のみ
-
同一
-
差分あり
インタラクティブ・モードでは、各状態のオブジェクトを表示するか、すべてのオブジェクトを同時に表示できます。同一ではないオブジェクトの場合、オブジェクト間の相違を表示できます。この段階で、次のように各宛先オブジェクトに対する処理を予想できます。
-
ソースのみに存在するオブジェクトは、宛先に作成されます。
-
宛先のみに存在するオブジェクトは、影響を受けません。ただし、「宛先のみのスキーマ・オブジェクトを削除」オプションを選択した場合、宛先のオブジェクトは削除されます。
-
同一のオブジェクトは、影響を受けません。ただし、「ソースからデータをコピー」オプションを選択した場合、同一の表のデータはソースのデータで置き換えられます。
-
同一ではないオブジェクトは、ソース・オブジェクトと一致するように変更されます。変更は、相違に応じて、ALTER文の使用を通じて、またはオブジェクトの削除と再作成を通じて行われます。
スクリプト生成に進む前に、同期化からオブジェクトを除外できます。たとえば、宛先には作成しないソース専用のビューが存在する場合、ここで除外できます。
スクリプト生成ステップ
スクリプトの生成時に、同期化では、比較ステップの結果を使用して、ソースと一致するように宛先でオブジェクトを作成および変更するPL/SQLスクリプトを作成します。スクリプト生成の一環として、次のいくつかのアクティビティが実行されます。
-
依存性分析により、宛先データベースが各オブジェクトに適切な環境を提供していることと、オブジェクトが正しい順序で作成および変更されることが保証されます。
-
変更分析により、ALTER文を使用してオブジェクトを変更できるかどうか、またはオブジェクトを削除して再作成する必要があるかどうかが決定されます。
-
同期化バージョンの影響レポートにメッセージが配置されます。これらのメッセージには、同期化プロセスに関する情報が含まれており、状況によっては、使用可能なスクリプトを生成できない1つ以上のエラー状態がレポートされます。
-
同期化を実行するのに必要なDDL文が生成され、同期化バージョンに記録されます。
依存性分析では、各オブジェクトを調べ、他のオブジェクトとの関係を明らかにします。これらの他のオブジェクトが宛先に存在する(または作成される)ことを確認します。これらの関係の例として、次のようなものがあります。
-
スキーマ・オブジェクトは、それを所有するユーザー・オブジェクトに依存します。たとえば、表DEV1.T1はユーザーDEV1に依存します。
-
索引は、それが存在する表に依存します。たとえば、索引DEV1.T1_IDXは表DEV1.T1に依存します。
-
外部キー制約が存在する表は、制約の参照先の表に依存します。
-
パッケージ本体などのソース・オブジェクトは、他のソース・オブジェクト、表、ビューなどに依存します。
-
ストアド・オブジェクトは、それが格納されている表領域に依存します(「表領域を無視」が選択されていない場合)。
依存性分析の際に確認された関係は、スクリプトの文を正しい順序で処理するために後でスクリプト生成プロセスで使用されます。
依存性分析により、宛先データベースに必須オブジェクトが存在しないことが判明する場合があります。たとえば、スキーマ・オブジェクトの所有者が、宛先データベースに存在しないことがあります。または、異なるスキーマに存在する別の表に対する外部キー制約が表に含まれることがあります。処理結果は次のようになります。
-
必須オブジェクトがソースに存在し、有効範囲指定で選択されている場合、同期化でそのオブジェクトが作成されます。たとえば、DEV1.T1にDEV2.T2を参照する外部キー制約があり、DEV1とDEV2の両方とも有効範囲指定に含まれる場合、同期化でDEV2.T2が作成されます。
-
必須オブジェクトがユーザーまたはロールで、そのオブジェクトがソースに存在する場合、自動的に同期化にそのユーザーまたはロールが追加され、宛先に作成されます。この処理は、ユーザー・オブジェクトとロール・オブジェクトが同期化の有効範囲指定に含まれていない場合でも発生します。
-
必要なスキーマ・オブジェクトがソースにあって、有効範囲指定で選択されていない場合、オブジェクトは自動的に含められません。かわりに、エラーレベルのメッセージが影響レポートに出力されます。この制限によって、有効範囲の指定外のオブジェクトが無制御に同期化されることがなくなります。有効範囲指定に、アプリケーション・モジュールを構成するすべてのスキーマを含める必要があるのは、このためです。
-
ソースがベースライン・バージョンの場合、必須オブジェクトは含まれない可能性があります。たとえば、ベースラインでは、ユーザーとロールが取得されないことがあります。同期化では、ベースライン・バージョンの外部のオブジェクトは検索できないため、影響レポートにエラー・レベルのメッセージが配置されます。このため、同期化に使用するベースラインにユーザー、ロールおよび権限付与を含めることが重要です。
スクリプト生成ステップの最後に、同期化により影響レポートとスクリプトが同期化バージョンに追加されます。インタラクティブ・モードでは、スクリプトを実行する前にスクリプトと影響レポートを検討できます。
影響レポートには、スクリプトの生成中に発生した状態に関するメッセージが含まれます。メッセージには次の3つのタイプがあります。
-
情報メッセージでは、ユーザー側の処置は必要ありません。このメッセージは、単なる留意事項をレポートします。たとえば、スクリプト生成にユーザー・オブジェクトが自動的に含まれる場合、影響レポートに情報メッセージが追加されます。
-
警告メッセージは、注意が必要だが、通常は処置の必要がない状態をレポートします。たとえば、ソース・オブジェクト内の参照を解決できるかどうか同期化で判断できない場合、影響レポートに警告メッセージが追加されます。警告メッセージにレポートされた状態によりスクリプトの実行が妨げられないかどうかを検証する必要があります。
-
エラー・メッセージは、修正しないとスクリプトを実行できない状態を示します。たとえば、同期化で必須依存オブジェクトの場所を特定できない場合、影響レポートにエラー・メッセージが追加されます。メッセージによっては、新しい同期化を作成する必要があります。たとえば、依存オブジェクトが同期化の有効範囲に存在しない場合や、ソースが依存オブジェクトを含まないベースラインである場合、有効範囲を拡張するか異なるソース・ベースラインを使用して新しい同期化を作成する必要があります。その他の場合は、同期化から1つ以上のオブジェクトを除外してスクリプトを再生成することで、エラー状態を解決できます。
スクリプト表示には、生成されたスクリプトの文が実行される順序どおりに含まれます。正確さに懸念がある場合は、スクリプトを調査できます。この表示により、特定のオブジェクトまたはオブジェクト・タイプに関連する文を特定できます。
スクリプトの生成後、スクリプト生成ステップでエラーが発生していなければ、スクリプト実行に進むことができます。エラーが発生した場合、影響レポートに、問題と解決策について詳しく説明した1つ以上のエラー・レベルのメッセージが含まれます。「スクリプトの再生成」を選択し、同期化からオブジェクトを除外してスクリプトを再生成することで、問題を解決できることもあります。
状況によっては、問題を修正するために同期化の新規バージョンを作成する必要があります。たとえば、ソースまたは宛先のオブジェクトの定義を変更する場合や、宛先にオブジェクトを追加する場合、新規バージョンを作成する必要があります。これにより、比較ステップで新規オブジェクトまたは変更されたオブジェクトが検出されます。この場合、古いバージョンは、スクリプト生成を続行できないため破棄されます。
スクリプト実行ステップ
スクリプトの生成に成功したら、スクリプトをいつでも実行できます。自動モードでは、スクリプトは生成が完了すると同時に実行されます。インタラクティブ・モードでは、影響レポートとスクリプトの確認後、ただちにスクリプトの実行に進みます。
スクリプトは、Cloud Controlのジョブ・システムで実行されます。スクリプトの実行が完了したら、実行ログを表示できます。スクリプトの実行に失敗した場合、状況に応じて問題を修正し、障害が発生した時点からスクリプトの実行を再開できます。たとえば、表領域の領域不足によりスクリプトが失敗した場合、表領域のサイズを増やしてからスクリプトを再実行できます。
追加の同期化バージョンの作成
最初の初期化バージョンの処理後に、同期化の追加バージョンを作成できます。同期化を選択し、「再同期化」を選択します。新しい同期化バージョンを作成する場合、異なるソースまたは宛先を選択することや、有効範囲指定または同期化オプションを変更することはできません。ただし、新しい同期化バージョンの開始時に、異なるモード(自動またはインタラクティブ)を選択できます。
追加の同期化バージョンを作成すると、ソースの増分変更を宛先に伝播できます。たとえば、開発システムに加えられた最新の変更でテスト・データベースをリフレッシュできます。
最初のバージョンの後に処理される同期化は、通常、最初の同期化よりもずっと高速に処理されます。