[MySQL][utf8mb4][寿司ビール問題対応]既存のutf8データベース内容をutf8mb4に置きかえる手順


頻繁に実施したのでメモ。utf8で作成されていたデータベースをutf8mb4に置きかえる作業手順です。
もっと簡単にできるといいなぁ。

前提

  • データベースインスタンスの文字セットはutf8mb4になっていること。mysql utf8mb4で検索すれば多数の記事あり

以下の手順を実行した環境

  • RDS for MySQL
  • 移行元のMySQLサーババージョン(mysql> select version();) => 5.6.41-log
  • 移行先のMySQLサーババージョン(mysql> select version();) => 5.7.26-log
  • mysql client / mysqldumpのバージョン => 5.6.46
  • Amazon Linux2 上で実行

手順

概要手順

  • 既存データベース内容をダンプ
  • ダンプしたファイル内のutf8utf8mb4に置き換え
  • データベース再作成(削除・作成)
  • utf8mb4化したダンプファイルをインポート

詳細手順

まずはデータベースをダンプします。

$ mysqldump -h <dbhost> -u<dbuser> -p<dbpassword> <dbname> > dump.sql

utf8utf8mb4 に置き換えます。下記ではsed使ってますがもちろんどういう方法でもOKです。

$ sed -e 's/utf8 /utf8mb4 /g' ./dump.sql > ./dump_utf8mb4.sql

DB作成権限のあるユーザでmysqlクライアントに接続します。

$ mysql -u<user> -p -h <host>;

【オプション】データベースを削除。

すでに当該データベースを利用するアプリケーションが稼働していて、一時的にでも削除できない場合は、別データベースを作成・移行して、アプリケーションからの接続先を変更しても問題ありません。むしろダンプ失敗していたりして復元できない可能性も考慮するとそのほうが安全です。(上記で出力したダンプファイルは特定のデータベースには依存していません(use databasecreate databaseもない))

mysql> ★注意★ drop database <dbname>;

データベースを作成

mysql> create database <dbname> DEFAULT CHARACTER SET utf8mb4;

作成したデータベースに移動

mysql> use <dbname>;

utf8mb4化したダンプファイルをインポート

mysql> source dump_utf8mb4.sql;

動作確認

任意の文字列カラムにビール(🍺)、寿司(🍣)を入力してエラーがでなければOKです。

utf8mb4になっていなければ以下のエラーが発生します。🍣の場合。

SQL Error [1366] [HY000]: Incorrect string value: '\xF0\x9F\x8D\xA3' for column 'カラム名' at row 1
  Incorrect string value: '\xF0\x9F\x8D\xA3' for column 'カラム名' at row 1