こんにちは!ZAICO開発チームです。
MySQLの照合順序変更(Collationの変更)ってやったことありますか?
テーブルのCollation確認してALTER TABLEして…となかなか大変な作業ですよね~。
以前弊社でuf8からutf8mb4へとMySQLのCollation変更した際に使用したカンタンかつ低ダウンタイムで変更する方法をご紹介させていただきます!
TL;DR
AWS Database Migration Service(以下DMS)を使ってすでにCollation変更したテーブルを用意したDBに既存DBのデータを入れていって行けば低ダウンタイムで稼働中サービスのCollationを変更できる!ってお話です。
なぜこの方法を使ったか
稼働中のサービスで絵文字とか特殊文字に対応させたいからMySQLのCollationもutf8→utf8mb4にしたいけど、データ量もかなりあるしALTER TABLEするとすごく長い時間かかりそうだしDB落ちそう…というときに「DMSを使えば低ダウンタイムで行けるんじゃ!」と思ったためです。
AWS DMSってなに
下記の画像の様にDB間に入ってデータだけを元のDBから新しいDBにコピーしてくれるサービスです。
詳細についてはクラスメソッドさんの「DMSを使ったデータベース移行を試してみた:Developers IO」をご覧ください。
※https://docs.aws.amazon.com/ja_jp/dms/latest/userguide/CHAP_Introduction.Components.html より引用
Collation変更の手順
ZAICOでは以下の様な手順で実施しました。
- utf8mb4に変更したDBのスキーマを作成する
- 移行先のDBを作成し、utf8mb4のスキーマを流す
- AWS DMSでレプリケーションするための設定を行う
- レプリケーション実施
- データが一致していることを確認してDBへのアクセスを止める
- 移行先のDBにアプリの向き先を変更
この手順で完了です!
ざっくりとした手順で、アプリ側のDBの設定変更とかは省略しています。
ALTER TABLEを実行してヒヤヒヤしながら完了するのを待つというのがないだけでかなりストレスフリーですね!
まとめ
DMSを使ってMySQLのCollation変更を行うとDBが落ちる心配とSQLを実行するヒヤヒヤがなくなって最高です。
ざつだん
- AWS DMSのヘルプページを見ているとオンプレ環境からAWS移行の例が多いのですが、AWS RDSのインスタンス同士でもいけます。
- DMSを使う場合、MySQLのパラメータグループでbin logを有効にしてあげる必要があります。