Redmine構築後のDBの文字コードをutf8mb4に変換して絵文字に対応する
動機
Redmine上で絵文字を記入し保存しようとすると…
ゴール
参考リンク
- MySQLでテーブルとカラムの文字コードを一括変更する - Be an Idealistic Realist
- ActiveRecordをutf8mb4で動かす - Qiita
- MySQL(InnoDB) で "Index column size too large. The maximum column size is 767 bytes." いわれるときの対策 - かみぽわーる
前提
- これの続き
- Redmine を LXC on Ubuntu 14.04で動かす - Dig that groovy!
- といってもあまりコンテナうんぬんは関係ない
- MySQL 5.5.43-0ubuntu0.14.04.1
余談
- RedmineはRails + ActiveRecordなアプリケーションなので、似たような構成ならできるのではないでしょうか。
DBのバックアップ
Redmineを停止する
私の環境ではRedmineはnginx+Passenger上で動いているため、nginxを再起動する。
# service nginx stop
mysqlを停止する
# service mysql stop
データのバックアップ
# cp -rp /var/lib/mysql <バックアップ先>
my.cnfの変更
以下を[mysqld]セクションへ追記。
[mysqld] character-set-server = utf8mb4 innodb_file_format = Barracuda innodb_file_per_table = 1 innodb_large_prefix
(innodb_large_prefixオプションによって、後述するキープレフィックスの制限を回避し3072バイトまで拡張できる)
mysqlを起動する
# service mysql start
DB情報を変数にあらかじめ追加する
# MYSQL_DB=db_redmine # MYSQL_USER=redmine # MYSQL_PASS=password # CONVERT_SCRIPT_FILE=convert_script
文字コード変換用スクリプトの作成
# (echo 'alter database `'"$MYSQL_DB"'` default character set utf8mb4;'; mysql -u$MYSQL_USER -p$MYSQL_PASS $MYSQL_DB -e "show tables" --batch --skip-column-names | xargs -I{} echo -e 'alter table `'{}'` ROW_FORMAT=DYNAMIC;\nalter table `'{}'` convert to character set utf8mb4;') > $CONVERT_SCRIPT_FILE
以下のような内容のconvert_script
ファイルが出来ている。
alter database `db_redmine` default character set utf8mb4; alter table `attachments` ROW_FORMAT=DYNAMIC; alter table `attachments` convert to character set utf8mb4; alter table `auth_sources` ROW_FORMAT=DYNAMIC; alter table `auth_sources` convert to character set utf8mb4; alter table `boards` ROW_FORMAT=DYNAMIC; alter table `boards` convert to character set utf8mb4; ...
- 同じテーブルに対して二度処理を行っているが、それぞれ。
スクリプトの実行
# mysql -u$MYSQL_USER -p$MYSQL_PASS $MYSQL_DB < $CONVERT_SCRIPT_FILE
エラーが起こらなければOK。
RedmineのDB設定の変更
# vim /path/to/redmine/config/database.yml
encoding: utf8 ↓ encoding: utf8mb4
Redmineの再起動
私の環境ではnginx+Passenger上で動いているためnginxを再起動する
# service nginx restart
おしまい
やはりナウでヤングで積極的でアグレッシブで柔軟でフレキシブルなマインドを持つ若者なので絵文字が使えると落ち着くのである。
thx! id:kuro_m88