02_応用

Section 3 — 応用編:高度な移行戦略と異種DB変換

🔧 対象: 中堅以上 ゴール: 異種移行・DDL変換・複雑な制約条件下での移行戦略を選定できる。


1. 異種DB移行のディープダイブ

Oracle → PostgreSQL/AlloyDB の典型課題

課題 対応
データ型の差 NUMBER → NUMERIC, DATE → TIMESTAMP, CLOB → TEXT
ストアドプロシージャ PL/SQL → PL/pgSQL 変換、または Lambda アーキへ移行
シーケンス Oracle SEQUENCE → PostgreSQL SEQUENCE(互換性高)
DBMS_* 関数 代替関数で書き換え
マテリアライズドビュー PostgreSQL のMV へ書き換え(更新仕様差に注意)
パーティショニング Range/List パーティショニングの構文差
ROWID 概念なし → 別主キーで代替

主な変換ツール

ツール 用途 特徴
DMS Migration Assistant スキーマ変換・データ移行 Google 公式、対応拡大中
Ora2Pg Oracle → PostgreSQL OSS、長年の実績、スクリプト多数
Striim リアルタイム CDC、異種 商用、複雑な変換対応
Database Migration Assessment (DMA) 移行前評価 Google 公式、変換難易度を自動評価

SQL Server → PostgreSQL の典型課題

課題 対応
T-SQL → PL/pgSQL ストアド書き換え、特に DECLARE / CURSOR 構文差
IDENTITY → SERIAL/GENERATED 自動採番列の構文差
NVARCHAR → TEXT/VARCHAR 文字列型の整理
Linked Server PostgreSQL FDW (Foreign Data Wrapper) で代替

2. DDL/DML の差異とリスク評価

DDL 変換の自動化レベル

変換ツール レベル 何ができる
DMS Assistant 大半のテーブル・インデックス自動変換
Ora2Pg スキーマ・データ・PL/SQL の多くを変換
手動 - カスタムドメイン型・複雑なトリガーは手動

自動変換不可な要素 → 必ず手動対応


3. ゼロダウンタイム移行の完全フロー

Step-by-Step(業務クリティカル想定)

Phase 0: 準備
   ├ ソース DB のバックアップ
   ├ ターゲット DB の構築(HA構成)
   ├ ネットワーク確立(VPN/Interconnect)
   ├ DMS ジョブ準備(Continuous モード)
   └ アプリ側で「読み取り用接続」「書き込み用接続」を分離

Phase 1: 初期移行
   ├ DMS スナップショット取得(数時間〜)
   ├ CDC 開始(バイナリログ/WAL から継続適用)
   └ レプリ遅延を継続監視(< 5秒目標)

Phase 2: テスト
   ├ ステージング環境でカットオーバー リハーサル
   ├ 整合性チェック(行数、サンプル、ハッシュ)
   └ アプリの読み取りを新DBに向けてテスト

Phase 3: カットオーバー(実行)
   ├ アプリの書き込みを一時停止(数秒)
   ├ 残りのバイナリログが適用完了まで待機
   ├ 新DBを Primary に昇格 (DMS Promote)
   ├ アプリの接続先を新DBへ切替
   └ 書き込み再開

Phase 4: 後処理
   ├ リバースレプリケーション開始(新 → 旧)
   ├ 監視強化(CPU/接続/エラー)
   ├ 数日〜数週間の様子見
   └ 問題なければ旧DB廃止

カットオーバー時のチェックリスト


4. ダウンタイム別の移行手段

ダウンタイム別の判断

許容ダウンタイム 推奨手段 注意点
ゼロ DMS Continuous + リバースレプリ 最も複雑、リスク高、コスト高
数秒〜数分 DMS Continuous(リバースなし) 標準、業務クリティカル
30分〜数時間 DMS One-time または mysqldump/pg_dump 夜間メンテで実施可
数日許容 Transfer Appliance PB級・帯域不足の場合

コストと複雑度のトレードオフ

        高
  コスト ↑
  複雑度 │  DMS Continuous + リバースレプリ
        │    ↘
        │      DMS Continuous
        │        ↘
        │          DMS One-time
        │            ↘
        │              mysqldump + リストア
        │                ↘
   低 ────────────────────────→
        高                       ダウンタイム許容度  低

5. リバースレプリケーションのパターン

パターン A: 同種 DB の場合(DMS で逆方向)

新 Primary → DMS Continuous → 旧 DB(リードレプリカ的)

パターン B: 異種 DB の場合(CDC ツール経由)

新 PostgreSQL → Datastream → BigQuery → 旧 Oracle ← Striim

リバースレプリケーションが不要なケース


6. 複雑なシナリオの判断

シナリオ 1: 「Oracle Exadata から AlloyDB へ。ダウンタイムは 1 時間以内」

シナリオ 2: 「MongoDB → Firestore (MongoDB-compatible)」

シナリオ 3: 「マルチクラウド: AWS RDS MySQL → Cloud SQL MySQL」

シナリオ 4: 「Oracle on-prem → Bare Metal Solution」


7. DMS の高度な機能

Migration Job のフィルタリング

DMS の連続レプリケーション監視

DMS の制約と回避策

制約 回避策
一部の DDL は CDC で同期されない カットオーバー前に DDL 凍結
大型 BLOB の遅延が大きい LOB を別経路で同期
ストアドプロシージャ非対応 カットオーバー前に手動移行
トリガー非対応 手動移行

8. 移行後の検証

整合性検証の階層

  1. 行数チェック (最も基本)

    SELECT COUNT(*) FROM table;   -- 旧 vs 新
    
  2. ハッシュチェック (より厳密)

    SELECT MD5(STRING_AGG(column1::text, '' ORDER BY id)) FROM table;
    
  3. サンプリングチェック

    • ランダム n 行を抽出して比較
    • データ型の差(NULL/空文字)に注意
  4. アプリ E2E テスト

    • 主要な業務フローを実行
    • 性能劣化の確認

性能検証


9. 移行プロジェクトの組織体制

試験では直接問われないが、シナリオ問題で「失敗要因」「成功要因」が出る。

推奨体制

試験で問われる「失敗要因」


10. このセクションのチェックリスト