CentOS 7 に載っているMariaDB 5.5 を 10.3 にアップデート*1してみたので、その手順をメモ。
† アップデート自体は yum で OK
単に MariaDB を更新するだけならば、以下の手順ですんなりアップグレードできます。
curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | bashyum clean allyum update -ymysql_upgrade -u root -p
† 問題になるのは SQL_MODE の STRICT_TRANS_TABLES
MariaDB (MySQL)は当初はいろいといい加減な部分がありましたが、最近は機能も増えていろいろと厳密になってきています。
特にバージョンアップの際に問題になると思われるのは、最近のバージョン(10.2.4 以降)のSQL_MODE にデフォルトで設定されているSTRICT_TRANS_TABLES という指定です。これにより INSERT 文の書き方がいい加減な場合、これまで通っていた INSERT 文が通らなくなるという不具合が発生します。
以下が MariaDB 10.3 系でのデフォルトの SQL_MODE です。
MariaDB [none]> show variables like 'sql_mode';+---------------+-------------------------------------------------------------------------------------------+| Variable_name | Value |+---------------+-------------------------------------------------------------------------------------------+| sql_mode | STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |+---------------+-------------------------------------------------------------------------------------------+
ちなみに、この SQL_MODE は
- 10.1.7 以前は指定なし
- 10.1.7 はNO_ENGINE_SUBSTITUTION, NO_AUTO_CREATE_USER
- 10.2.4 以降はSTRICT_TRANS_TABLES, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION
という設定になっているようです。
とりあえず、デフォルトから STRICT_TRANS_TABLES を除くためには/etc/my.cnf.d/server.cnf の[mariadb] のセクションに以下を追加する必要があります。
sql_mode='ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
変更後に MariaDB のデーモンを再起動させると、SQL_MODE が以下のようになっていることが確認できるはずです。
MariaDB [none]> show variables like 'sql_mode';+---------------+-----------------------------------------------------------------------+| Variable_name | Value |+---------------+-----------------------------------------------------------------------+| sql_mode | ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |+---------------+-----------------------------------------------------------------------+
- *1: DB をアップデートするといろいろ動かなくなったりするのであまりやりたくなかったのですが、あるテーブルでRow size too large (> 8126) というエラーを吐くようになってしまったので、ROW_FORMAT=DYNAMIC に変換するための苦肉の策です。