オンプレOracleからクラウドMySQLへ、停止10分で切り替えた話


DB移行アーキテクチャ(停止10分) Oracle 本番DB 15テーブル 30億レコード 複製 Oracle 中間DB 暗号化復号 データ型変換 DMS MySQL クラウドDB 第1段階: 事前フルロード 大部分のデータを一括移行 第2段階: CDC差分同期 リアルタイムで差分を反映 DNS切り替え → 停止わずか10分 本番に負荷をかけない
中間DBを挟んだDB移行アーキテクチャ
ひよこ ひよこ

ペンギン先生、OracleからMySQLに移行するのって、データをコピーすればいいだけじゃないの?

ペンギン先生 ペンギン先生

そう思うよね。でも実際には暗号化されたカラムがあったり、データ型がそのまま使えなかったりして、単純にデータを抜いて突っ込む、って話じゃなかったんだ。対象は15テーブル、合計30億レコード規模だったよ。

ひよこ ひよこ

30億!?しかも動いてるシステムなんでしょ?止められないの?

ペンギン先生 ペンギン先生

全世界から取引が発生する産業系システムだったから、止まれば売上損失に直結するんだ。24時間365日、気軽には止められない。最終的な切り替え停止は約10分で済ませたよ。

ひよこ ひよこ

10分!?どうやったの?

ペンギン先生 ペンギン先生

ポイントは「中間DB」を挟んだことなんだ。Oracle本番DBからいきなりMySQLに送るんじゃなくて、まずOracle上に中間DBを作って、そこでストアドプロシージャを使って暗号化データの復号データ型変換をやったんだよ。

ひよこ ひよこ

なんで直接じゃダメなの?中間DB挟むと余計に手間がかかりそうだけど…。

ペンギン先生 ペンギン先生

直接やると、暗号化データの復号データ型変換・本番への負荷影響っていう3つの問題が同時に降りかかるんだ。中間DBを挟むことで、問題をOracleの世界で解決してからMySQLに渡す、っていう分離ができたんだよね。しかも本番DBに移行処理の負荷をかけずに済んだよ。

ひよこ ひよこ

なるほどー。でも30億レコードを一度に移すのは無理じゃない?

ペンギン先生 ペンギン先生

だから二段構えにしたんだ。まず事前に一括でフルロードして大部分を移しておく。そのあとDMSのCDC(Change Data Capture)レプリケーションで差分をリアルタイム同期し続けるんだ。切り替え時には同期すべきデータ量が最小限になってるわけだね。

ひよこ ひよこ

切り替え当日はどうやったの?

ペンギン先生 ペンギン先生

レプリカラグが1分を切るまで待って、書き込みを止めて、最終同期を確認して、DNSの向き先をオンプレからクラウドに変更。DB単体じゃなくてアプリケーションごと丸ごと切り替えたから、DB接続先の個別変更が不要になったんだ。

ひよこ ひよこ

一番苦労したのはどこ?

ペンギン先生 ペンギン先生

意外にも地味なところだったんだ。チームのメインスキルがOracleだったから、MySQLの「当たり前」がわからなくて。OracleのDATE型は日時を含むけどMySQLのDATEは日付のみ、VARCHAR2とVARCHARの文字数カウントの違い、NULLと空文字の扱い…「知ってる人には当たり前だけど知らない側からすると地雷」っていうポイントが無数にあったよ。

ひよこ ひよこ

技術だけじゃなくて心理的なハードルもありそうだね。

ペンギン先生 ペンギン先生

そうなんだ。Oracle一筋でやってきたチームがMySQLに移行するっていうのは心理的なハードルが高い。ひとつひとつ検証して「大丈夫だ」って確認していく地道な作業が結局一番大事だったんだよね。技術だけじゃ移行は成功しないんだ。