Currently viewing the AI version
Switch to human versionGoogle Cloud Database Migration Service: MySQL移行の実装ガイド
実装概要
移行対象: MySQL 5.6.51 (2.1TB, t2.micro, 8GBメモリ) → Cloud SQL for MySQL
所要期間: 実作業1日 + 事前準備3日 + 文字化け修正2週間
実際のコスト: 月額¥32,000 (見積もり¥27,000から15%増)
ダウンタイム: 15分 (理論値: 0分)
設定情報
本番環境で動作する設定
VPC Peering設定:
gcloud compute networks peerings create dms-peering \
--network=SOURCE_NETWORK \
--peer-project=TARGET_PROJECT \
--peer-network=TARGET_NETWORK
文字エンコード修正:
ALTER TABLE [table_name] CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
主キー追加(重複データ削除後):
ALTER TABLE [table_name] ADD PRIMARY KEY (id);
バックアップ作成:
mysqldump --single-transaction --routines --triggers --all-databases > backup.sql
必須事前チェック
文字エンコード確認:
SELECT table_name, table_collation FROM information_schema.tables;
主キー確認:
SELECT table_name FROM information_schema.tables
WHERE table_schema = 'database_name'
AND table_name NOT IN (
SELECT table_name FROM information_schema.key_column_usage
WHERE constraint_name = 'PRIMARY'
);
失敗パターンと解決策
接続エラー (ERROR 2003)
原因: IPアドレス設定ミス、VPC Peering設定不備
解決時間: 40分~半日
対処法:
- IP設定の再確認
gcloud compute networks peerings list
で設定確認- Security Group設定確認
文字化けエラー (ERROR 1366)
原因: latin1エンコードテーブルに日本語データ混在
影響: 全体移行の2週間遅延
対処法: 事前の文字エンコード統一が必須
主キーなしエラー
原因: 古いテーブル設計
対処: 重複データ削除 → 主キー追加
所要時間: テーブルあたり2-4時間
メモリ不足 (Memory limit exceeded)
対処: db-n1-standard-1 → db-n1-standard-2へアップグレード
解決時間: 30分
リソース要件
時間コスト
作業内容 | 見積時間 | 実際の時間 | 難易度 |
---|---|---|---|
接続設定 | 2時間 | 半日 | 中 |
VPC Peering | 1時間 | 半日 | 高 |
データ移行 (1.2TB) | 3時間 | 13時間 | 中 |
文字化け修正 | 1日 | 2週間 | 高 |
主キー追加 | 2時間/テーブル | 2-4時間/テーブル | 中 |
予算要件
月額運用コスト: ¥32,000 (db-n1-standard-2, 200GB SSD)
一時費用:
- 作業時間: 180時間
- ネットワーク料金: 見積もり外
- バックアップストレージ: 見積もり外
専門知識要件
- MySQL管理経験 (必須)
- Google Cloud VPC設定 (必須)
- 文字エンコード変換 (重要)
- Terraform操作 (推奨)
重要な注意事項
ドキュメントに記載されていない制限
「追加料金なし」の実態
- DMS利用料のみ無料
- Cloud SQL運用コストは別途発生
- ネットワーク・バックアップ料金も追加
ダウンタイムの現実
- 理論値: 0分
- 実際: 15-30分
- アプリケーション接続プール設定要確認
サポート品質
- Google Cloud Support Basic (¥29/月): 応答3日、定型文回答
- Stack Overflow: 3-4時間で実用的回答
失敗する条件
- 確実に失敗: 主キーなしテーブル、文字エンコード混在
- 高確率で遅延: 100Mbps未満のネットワーク帯域
- コスト超過: ネットワーク・バックアップ料金の見積もり不足
比較データ (異種DB移行)
Oracle 11g → PostgreSQL移行実績:
- 見積もり: ¥850,000 → 実際: ¥2,380,000 (2.8倍)
- PL/SQL 287個中、AI自動変換成功: 64%
- 手動修正期間: 6.5ヶ月
- 結論: 同種DB移行 (MySQL→MySQL) の方が圧倒的に低リスク
実証済み代替手段
推奨ツール
- pgloader: PostgreSQL移行時により効率的
- mysqldump: 確実なバックアップ手段
- Stack Overflow: Googleサポートより実用的
避けるべきリソース
- Google Cloud公式クイックスタート: 理想環境での手順のみ
- Google Cloud Support Basic: コスト対効果が低い
- 公式料金計算機: 実際より15%低く算出
成功のための必須手順
移行前準備 (3日間)
- 全テーブルの文字エンコード確認・統一
- 主キー設定の確認・追加
- VPC Peering設定とテスト
移行実行 (1日間)
- 深夜帯での実行 (ネットワーク帯域確保)
- フルバックアップ取得
- CDC設定でのミラーリング開始
移行後対応 (1-2週間)
- アプリケーション接続設定調整
- 性能チューニング
- 文字化けデータの修正
この情報は2024年9月の実際の移行体験に基づく実用的なガイドです。
Useful Links for Further Investigation
実際に役立ったリソース(と役立たなかったやつ)
Link | Description |
---|---|
Database Migration Service Overview | 「簡単3ステップで移行完了!」みたいな薄っぺらい概要しか書いてない。VPC Peeringでハマった時の対処法とか、実際のハマりポイントは一切なし。移行前に一度読んだけど「で、具体的にどうやるの?エラー出たらどうするの?」って感じ。開発者が書いてないのがバレバレ |
料金詳細 | 「同種移行は追加料金なし」って書いてるけど、Cloud SQL料金が別途かかることを小さく書きすぎ。見積もりより15%高くなる理由(ネットワーク料金、バックアップ料金)も説明不足。実際の請求で「え?」ってなった |
MySQL移行ガイド | 完璧すぎる環境での理想的手順しか書いてない。「ネットワーク接続をテストします → 成功しました!」とか、現実では絶対こんなにうまくいかない。主キーなしテーブルの対処法とか文字コード問題は一切触れてない |
Stack Overflow - VPC接続問題 | 「ERROR 2003 Can't connect to MySQL server」で4時間悩んでた時に発見。回答者のユーザー(carlos_developer)が「gcloud compute networks peerings createの権限不足」って指摘してくれて一発解決。この人に感謝状送りたい。Google公式ドキュメントより遥かに有用 |
GitHub Issues - Terraform Provider | TerraformでDMS設定する時の地雷(IAMロールの依存関係)が詳しく書いてある。issue #15647のコメント欄で「depends_onをちゃんと書け」って指摘があって救われた。これ知らずにterraform applyしたら絶対ハマってた |
DBA Stack Exchange - Live Migration Discussion | MariaDB 10.5からMySQL 8.0への移行で同じ苦労をした実例。「DMSは完璧じゃない」ってコメントがリアル。みんな同じところでハマってることがわかって精神的に救われた |
Google Cloud公式Quickstart | 「30分で完了する簡単移行」って書いてるけど完全にウソ。クリーンなテスト環境(主キーあり、文字コードutf8mb4、レプリケーション設定済み)での理想的な話。現実では接続設定だけで半日ハマる。誰がこんな完璧な環境持ってんだよ |
Google Cloud Support(月額$29のBasic) | チケット出してから3日後に「ログファイルを確認してください。詳しくはドキュメントを参照してください」みたいな定型文が返ってくる。月額$29払ってるのにこの対応?Stack Overflowで英語で聞いた方が3時間で解決する。金返せ |
料金計算機 | 必須ツールだけど、実際の請求は計算結果より15%くらい高くなった。見積もり: ¥27,000/月、実際: ¥32,000/月。ネットワーク料金とかバックアップ料金が思ったより高い。財務への説明で詰められること確実 |
mysqldump | 結局これでバックアップ取った。`mysqldump --single-transaction --routines --triggers --all-databases`でフルバックアップ。DMS失敗した時の保険として必須。実際に2回使った |
pgloader | DMSがダメだった時の代替手段。PostgreSQLへの移行ならこっちの方がシンプルで使いやすい。コマンド一発で済む。なんでGoogle DMSがあるのにこっち使わないんだろう |