【正解】C
【0からの解説】
①前提知識
Database Migration Service(DMS)は、Oracle から AlloyDB for PostgreSQL / Cloud SQL for PostgreSQL への異種(heterogeneous)移行をサポートするマネージド サービスです。異種移行では次の 2 つを行います。
・スキーマとコードの変換: 「コンバージョン ワークスペース(conversion workspace)」で、Oracle のテーブル定義やストアド プロシージャ、関数、トリガーなどの PL/SQL コードを PostgreSQL の構文に変換します。現行のコンバージョン ワークスペースは DMS 内で変換を行う対話型の SQL エディタを備え、Gemini による変換支援(コードの説明や変換問題の修正提案)にも対応しています。
・データの移行: 移行ジョブがまず既存データを一括で読み込み(フルダンプ / バックフィル)、その後は変更データ キャプチャ(CDC)でソースの変更を継続的に複製します。これにより、ソースを稼働させたまま同期し、最後に短時間で切り替える(カットオーバー)ことができます。
一方「従来のコンバージョン ワークスペース(legacy conversion workspace)」は、古く機能が限定されたタイプです。オープンソースの変換ツール Ora2Pg の設定ファイルを DMS の外部であらかじめ作成し、その設定に従って変換する仕組みで、Gemini による変換機能や対話型 SQL エディタには対応していません。さらに、生成されたコードは利用者が自分で移行先データベースに適用する必要があり、移行前にスキーマをテストできず、主キーのないテーブルには移行前に手作業で主キー制約を作成する必要があります。公式ドキュメントでも、従来型のコンバージョン ワークスペースを移行に使うことは推奨されていません。
この 2 種類の違いは細かい論点に見えますが、判断の軸はシンプルです。「変換・適用・テストまでを DMS の中で完結できるか(=人手の作業が少ないか)」と「CDC で稼働を止めずに同期できるか(=ダウンタイムが短いか)」の 2 点で選択肢を比べると、名前に「従来(legacy)」と付く方式は、現行方式より手作業が多い旧来の選択肢だと判断できます。
②要件と制約の整理
・大規模な Oracle データベースで、大量のストアド プロシージャ(コード)の変換が必要。
・「移行の労力」と「ダウンタイム」の両方を最小にしたい。
③正解が要件を満たす理由
C は、DMS の現行コンバージョン ワークスペースでスキーマとストアド プロシージャを DMS 内で(Gemini の支援も受けながら)変換でき、変換作業の労力を抑えられます。さらに移行ジョブのバックフィル + CDC で、ソースを止めずにデータを継続的に同期できるため、カットオーバー時のダウンタイムもごく短くできます。両方の要件を満たすのは C です。
【誤りの選択肢】
A:Ora2pg はオープンソースのツールで、スキーマ・コード変換とデータのエクスポートができますが、自前で環境を用意して実行・管理する必要があり労力が大きくなります。また基本的には一括コピーのため、大規模データベースでは移行中にソースへの書き込みを止める必要があり、ダウンタイムが長くなります。
B:oracle_fdw と CREATE TABLE AS SELECT によるデータのコピーは一回限りのスナップショット コピーで、継続的な変更の複製(CDC)がありません。大規模データのコピー中はソースを停止する必要があり、ダウンタイムが大きくなります。手作業の SQL が多く労力も大きくなります。
D:DMS とバックフィル + CDC を使う点は C と同じで、ダウンタイムの面では差がありません。違いはスキーマとコードの変換方法です。従来のコンバージョン ワークスペースでは、Ora2Pg の設定ファイルを DMS の外部で作成・調整し、変換されたコードを自分で移行先に適用し、主キーの不足も手作業で補う必要があります。移行前にスキーマをテストすることもできず、Gemini による変換支援や対話型エディタもありません。大量のストアド プロシージャを変換する本問では、この手作業の差がそのまま労力の差になるため、「労力を最小化」という要件では C に劣ります。
【参考】
Oracle から AlloyDB for PostgreSQL への移行の概要 | Database Migration Service for heterogeneous Oracle to AlloyDB for PostgreSQLDatabase Migration Service を使用して SQL を変換する