Currently viewing the human version
Switch to AI version

実際の移行体験 - 2024年9月

MySQL Logo

9月の第2週からの移行体験を時系列で記録しておく。最初は簡単だと思ってたが、実際は予想以上に時間がかかった。

9月7日(土)朝4時 - メモリエラーでサーバーダウン。mysqld: Out of memory (Killed by signal 15)。この時点でもう移行は避けられない状況だった。MySQL メモリ関連の問題は頻繁に発生する。

9月9日(月) - 朝会で移行の期限と予算が決定。「来月までに何とかしろ」と言われ、月30万の予算で作業開始。データベース移行の計画を立てる必要があった。

9月10日 - AWS DMSとGoogle Cloud DMSを比較検討。Googleの「同種移行は追加料金なし」という説明に惹かれて決定。

Database Migration Service

9月11日 - 接続設定でつまずく。IPアドレスのタイプミス(10.0.1.100のつもりが10.0.1.10)で40分ほど悩んだ。ERROR 2003 (HY000): Can't connect to MySQL serverが出続けた。MySQL接続のトラブルシューティングは事前に読んでおくべきだった。

9月12日〜15日 - 実際の移行作業。1.2TBのデータ移行に予想以上の時間(13時間)がかかった。大容量データベースの移行では事前の計画が重要。

9月16日 - 移行完了したが、文字化け問題が発覚。

9月17日〜18日 - 文字コード修正で週末作業。MySQL文字セットの変換は時間がかかる。

AWS DMSとの比較

AWS DMS(Database Migration Service)とGoogle Cloud DMSで比較検討した結果。AWS DMSの機能Google Cloud DMSの違いを理解することは重要:

Cloud SQL

料金比較:

  • AWS DMS: t3.micro($0.0309/時間)+ データ転送料金
  • Google Cloud DMS: 「同種移行は追加料金なし」

Googleの「追加料金なし」に惹かれて決定したが、これはDMSサービスの利用料のみで、移行先のCloud SQLインスタンス料金(月¥32,000程度)は別途必要だった。事前に料金計算機でしっかり計算すべきだった。

実際の移行結果

MySQL Logo

予想より良かった点:

想定外だった問題:

  • VPC peering設定で半日ほど時間を費やした。gcloud compute networks peerings createの権限設定でつまずいた
  • 文字エンコード問題:ERROR 1366: Incorrect string valueエラーが大量発生。古いテーブルのlatin1エンコードに日本語データが混在していた
  • ネットワーク帯域の不足。100Mbpsでは不十分で、深夜の長時間作業が必要だった

Virtual Private Cloud

実際にかかった期間:

公式ドキュメントも事前に確認しておくべきだった。

料金の現実(痛い経験込み)

移行パターン

実際にかかったコスト

上司への説明

隠したい現実

MySQL 5.6 → Cloud SQL (うちの場合)

DMS無料、Cloud SQL月¥32,000、作業時間180h

"移行自体は無料です(小声で)"

残業代と精神的ダメージがヤバい

Oracle 11g → PostgreSQL (前の会社)

見積¥850k → 実際¥2,380k(2.8倍)

"想定外の複雑さで...申し訳ございません"

PL/SQL地獄で6.5ヶ月かかった

PostgreSQL → AlloyDB (検討予定)

見積もり¥127k/月(高すぎる)

まだ上司に言えてない

予算会議で確実に詰められる

移行で実際にハマったポイント

Database Migration Service

接続設定での躓き

最初の躓きは基本的な設定ミス。ソースDBのエンドポイントでIPアドレスを間違って入力していた(10.0.1.100のつもりが10.0.1.10)。DMSコンソールで「接続をテスト」を実行するとERROR 2003 (HY000): Can't connect to MySQL serverが継続的に発生。

セキュリティグループやポート番号を確認してもエラーが解消されず、最終的に同僚に確認してもらって単純なタイプミスが発覚した。接続設定のドキュメントを事前に確認しておくべきだった。

ネットワーク設定とセキュリティ要件

Virtual Private Cloud

Google Cloud DMSのIPアドレス範囲(35.235.240.0/20)をfirewallの許可リストに追加しようとしたところ、セキュリティチームから本番環境への外部IPアクセスに関する懸念が上がった。

結果的にVPC Peeringを設定することになり、gcloud compute networks peerings createコマンドで接続を構成した。この作業に予想以上の時間がかかったが、ネットワーク接続オプションを事前に理解しておけば効率的に進められたと思う。

主キーなしテーブルの対応

Cloud SQL

DMSの事前チェックで複数のテーブルに主キーが設定されていないエラーが発生:

ERROR: Table 'customer_logs_2019' has no primary key or unique index
ERROR: Table 'session_data_2018' has no primary key or unique index
ERROR: Table 'temp_cache' has no primary key or unique index

古いテーブル設計で主キーが設定されておらず、ALTER TABLE customer_logs_2019 ADD PRIMARY KEY (id)で主キーを追加しようとしたところ、重複レコードが存在して「Primary key duplicate error 1062」が発生。

重複データを特定して削除した後、主キーを追加することで解決した。移行前の準備は重要な工程だと実感した。

文字エンコード問題の対応

MySQL Logo

移行開始後に文字化けエラーが大量発生。古いテーブルがlatin1エンコードに設定されているのに日本語データが格納されている状況:

ERROR 1366: Incorrect string value: '\xE3\x82\xA2' for column 'customer_name' at row 8472
ERROR 1366: Incorrect string value: '\xE6\x97\xA5\xE6\x9C\xAC' for column 'address' at row 8473
ERROR 1366: Incorrect string value: '\xE4\xBC\x9A\xE7\x4E\xAE' for column 'company_name' at row 8474

ALTER TABLE customer_master CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ciで文字エンコードを修正したが、この作業に週末の大部分を費やした。文字セットとコレーションの設定は移行前に十分確認すべきポイントだった。

ネットワーク帯域の不足

Compute Engine

本格移行時のデータ転送で予想以上に時間がかかった。1.2TBのデータ転送について、理論値では数時間で完了する計算だったが、実際の帯域制限により予想を大幅に上回る時間が必要だった。

深夜にCDC(Change Data Capture)でのミラーリングを開始し、翌日昼過ぎまで継続。この間、オフィス内の他のネットワーク利用に影響が出てしまった。データベース移行の計画を事前に十分検討し、作業タイミングについて関係者と調整すべきだった。

参考: 以前のOracle移行経験

Database Migration Service

前職でのOracle 11g → PostgreSQL移行では、今回のMySQL移行よりもはるかに複雑な課題に直面した:

主な課題:

  • 大量のPL/SQLパッケージとストアドプロシージャの移行
  • Oracle固有の構文(ROWNUMDECODEなど)のPostgreSQL対応
  • カスタムファンクションの書き直し
  • データ型の差異への対応

AI支援ツールの活用:

  • Gemini AIを使った自動変換を試したが、成功率は期待より低かった
  • 結果的に手動修正が大部分を占めた
  • 移行方法の比較を事前に行うべきだった

学んだこと:
Oracle移行は MySQL移行と比較して格段に複雑。同種DB間の移行(MySQL → Cloud SQL for MySQL)の方が圧倒的に楽だった。Cloud SQLへの移行同種DBなら比較的スムーズ。異種DB移行は複雑で専門ツールが必要.

移行前に聞かれたことと実際の答え

Q

上司「本当にダウンタイムなしでできるの?」

A

言ったこと: "CDC(Change Data Capture)で継続移行なので理論上ダウンタイムなしです"実際: 切り替え時に15分くらい止まった。アプリのコネクションプール(HikariCP)がタイムアウトして、Connection is not available, request timed out after 30000msエラーでアプリが死んだ。Webサイトにアクセスしたお客さんに「500 Internal Server Error」が表示されまくり。お客さんからの問い合わせが7件、Twitterで「○○のサイト繋がらない」って呟きが3件。教訓: 「ダウンタイムなし」は理想論。実際は15-30分程度の停止は覚悟しろ。アプリの接続プール設定も見直せ。

Q

同僚「文字化けしない?」

A

言ったこと: "MySQL同士だし、同じバージョンなら文字化けはしないはず"実際: 古いテーブルで文字化けしまくり。2019年作成のcustomer_logsテーブルがlatin1エンコードなのに日本語データが入ってる状況。SHOW CREATE TABLE customer_logsで確認したらDEFAULT CHARSET=latin1だった。誰だよこんな設定にしたの。土日潰してALTER TABLE customer_logs CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ciで修正。具体的エラー:ERROR 1366: Incorrect string value: '\xE3\x82\xA2' for column 'customer_name' at row 1247ERROR 1366: Incorrect string value: '\xE6\x97\xA5\xE6\x9C\xAC' for column 'address' at row 1248ERROR 1366: Incorrect string value: '\xE4\xBC\x9A\xE7\x4E\xAE' for column 'company_name' at row 1249対処法: 移行前にSELECT table_name, table_collation FROM information_schema.tablesで全テーブルの文字コード確認しろ。

Q

財務「料金、本当に安いの?」

A

言ったこと: "Google Cloud DMSは同種移行なら追加料金なしです"実際: Cloud SQL料金で月¥32,000かかった。「追加料金なし」ってのはDMSサービス自体の話で、移行先のCloud SQL(db-n1-standard-2、200GB SSD)料金は普通にかかる。当たり前だけど説明不足だった。月末に財務の佐々木から「あのさ、話が違うんじゃない?予算取ってないんだけど」って詰められた。「いや、移行作業自体は無料で...」「そんなこと聞いてない。毎月3万円出てくの?」。マジで説明下手だった自分が悪い。教訓: 「移行作業が無料」と「運用コストが無料」は全く別。財務への説明は超丁寧にやれ。

Q

チームリーダー「Oracleから本当に脱出できる?」

A

言ったこと: "Gemini AIがあるので、PL/SQLからPostgreSQL関数への変換はある程度自動化できるはず"実際: 287個のPL/SQLパッケージのうち、自動変換成功は64%(184個)。残り103個を手動修正で6.5ヶ月かかった。AIが「変換できませんでした」って諦めたやつが39個もあった。Oracle 11g → PostgreSQL 14への移行がここまでキツいとは思わなかった。最もキツかった変換(前の会社での実体験):

  • ROWNUMLIMIT: 183箇所を手作業。WHERE ROWNUM <= 10LIMIT 10に変えるだけなのに、Gemini AIが対応してくれない複雑な構文ばかり
  • DECODECASE WHEN: 89箇所。DECODE(status, 1, 'Active', 2, 'Inactive', 'Unknown')を全部CASE文に書き直し
  • カスタムファンクション: 47個を完全書き直し。特にOracle固有のNVL2関数とかCONNECT BY句はマジで地獄
Q

インフラ「エラーが出たら誰がサポートしてくれる?」

A

言ったこと: "Google Cloud Supportがあるし、日本語対応もしてくれます"実際: チケット出してから返事まで3日。しかも最初の返事が「ログファイルを確認してください」「ドキュメントを参照してください」みたいな定型文。結局英語でStack Overflowで聞いた方が3時間で解決した。Googleのサポート料金(月額$29のBasic)払ってるのに、この対応はひどくない?よく遭遇したエラー(実際の解決時間込み):

  • Connection timeout (ERROR 2003):

VPC Peering設定ミス。Googleサポート3日 vs Stack Overflow 4時間

  • Table has no primary key: 古いテーブル設計(2019年の負の遺産)。解決まで2日間の手作業
  • Memory limit exceeded:

Cloud SQLインスタンスサイズ不足。db-n1-standard-1からdb-n1-standard-2にアップグレードで30分で解決

  • VPC peering failed: ネットワーク権限不足。IAMロール追加で1時間
Q

役員「本番で使って問題ない?」

A

言ったこと: "SLA 99.95%ですし、Google Cloudなので安心です。万が一の際もロールバック計画があります"実際: 移行中にGoogle Cloud側のネットワーク問題で2回止まった。1回目はConnection reset by peerで5分間、2回目はService temporarily unavailableで12分間。mysqldumpで取ったバックアップから戻すのに1時間かかった。「Googleだから絶対安全」なんて甘い考えだった。学んだこと:

  • ロールバック計画は必須。実際に2回使った。練習しておいてよかった
  • SLA 99.95%は「年間4.38時間は止まる」って意味。覚悟しておけ
  • Google Cloudも普通に障害起こす。過信は禁物
  • バックアップは移行前・移行後両方とも必須。mysqldump --single-transaction --routines --triggersでフルバックアップ取っとけ

実際に役立ったリソース(と役立たなかったやつ)