Amazon RDS上のMySQLをutf8からutf8mb4に変更する手順

2018.09.29

概要

Amazon RDSで管理しているMySQL 5.6のデータベースの文字コードをutf8からutf8mb4に変更する。データベースを新規作成するのではなく、既に稼働しているデータベースの設定を変更する。

変更前の状態



mysql> show variables like "chara%";
+--------------------------+-------------------------------------------+
| Variable_name            | Value                                     |
+--------------------------+-------------------------------------------+
| character_set_client     | utf8                                      |
| character_set_connection | utf8                                      |
| character_set_database   | utf8                                      |
| character_set_filesystem | binary                                    |
| character_set_results    | utf8                                      |
| character_set_server     | latin1                                    |
| character_set_system     | utf8                                      |
| character_sets_dir       | /rdsdbbin/mysql-5.6.39.R1/share/charsets/ |
+--------------------------+-------------------------------------------+
8 rows in set (0.00 sec)

パラメータグループを変更する

パラメータ名 意味 変更前 変更後 備考
charactersetclient (値なし) utf8mb4
charactersetconnection (値なし) utf8mb4
charactersetdatabase (値なし) utf8mb4
charactersetresults (値なし) utf8mb4
charactersetserver (値なし) utf8mb4
innodblargeprefix (値なし) 1
innodbfileformat (値なし) Barracuda
innodbfileper_table 1 1 「1」にする必要があるが、作成時に既に「1」だった
skip-character-set-client-handshake (値なし) 1

RDSインスタンスのパラメータグループを変更する

  • 「インスタンスの操作」から「変更」をクリックする。

Amazon RDS上のMySQLをutf8からutf8mb4に変更する手順

  • 「データベースの設定」のセクションでパラメータグループを変更する。

Amazon RDS上のMySQLをutf8からutf8mb4に変更する手順

RDSインスタンスを再起動する

  • 「インスタンスの操作」から「再起動」をクリックする。

Amazon RDS上のMySQLをutf8からutf8mb4に変更する手順

既存のデータベース・テーブルの文字コードを変更する



-- テーブルの文字エンコーディングをutf8mb4に変更
mysql> ALTER DATABASE データベース名 CHARACTER SET utf8mb4;

-- テーブルのファイルフォーマットをDYNAMICに変更
mysql> ALTER TABLE テーブル名 ROW_FORMAT=DYNAMIC;

-- テーブルの文字エンコーディングをutf8mb4に変換
mysql> ALTER TABLE テーブル名 CONVERT TO CHARACTER SET utf8mb4;

変更が適用されたか確認する



mysql> show variables like "chara%";
+--------------------------+-------------------------------------------+
| Variable_name            | Value                                     |
+--------------------------+-------------------------------------------+
| character_set_client     | utf8mb4                                   |
| character_set_connection | utf8mb4                                   |
| character_set_database   | utf8mb4                                   |
| character_set_filesystem | binary                                    |
| character_set_results    | utf8mb4                                   |
| character_set_server     | utf8mb4                                   |
| character_set_system     | utf8                                      |
| character_sets_dir       | /rdsdbbin/mysql-5.6.39.R1/share/charsets/ |
+--------------------------+-------------------------------------------+
8 rows in set (0.00 sec)

無事変更できた。

Ruby on Rails 5のWebアプリケーションで既存のデータベースの文字コードを変更するには

Ruby on Rails 5でutf8mb4を使うためには、

  • config/database.ymlを修正する
  • マイグレーションファイル作成部分にパッチを当てる
  • db/schema.rbを更新する

という作業が別途必要になる。詳しくは以下の記事からどうぞ。

おわりに

クラウド環境なので、わざわざ稼働中のデータベースを操作しなくても、スナップショットを活用して以下の流れでやる方が好ましいだろう。

  1. 本番インスタンスのスナップショットを取る
  2. スナップショットから復元する
  3. 復元したインスタンスに対して、この記事の手順を行う
  4. サーバーのデータベース接続先情報を変更することで、瞬時にデータベースサーバーを切り替える

データベースサーバーを切り替える際のダウンタイムはほぼゼロにできるが、スナップショットを取ってからデータベースの切り替えを行うまでの間のデータは破棄されることになってしまうため、結局はメンテナンス時間を作る必要がある。