Mac のローカル環境で開発中の Rails で mysql のバージョンアップでエラーが発生した
概要
Homebrew の mysql をアップデート(5.7 -> 8.0)したところ、Mac のローカル環境で開発中の Rails でエラーが発生したのでメモです
開発環境について
- ローカルの rbenv, bundler を利用
- mysql などのミドルウェアは docker-compose で立ち上げたものを利用していて、mysql のバージョンは 5.7
- homebrew の mysql のバージョンを 8.0 にした
発生したエラー
structure.sql の形式を利用しており、migration で下記のエラーが発生しました。
$ bin/rails db:migrate mysqldump: [Warning] Using a password on the command line interface can be insecure. mysqldump: Couldn't execute 'SELECT COLUMN_NAME, JSON_EXTRACT(HISTOGRAM, '$."number-of-buckets-specified"') FROM information_schema.COLUMN_STATISTICS WHERE SCHEMA_NAME = 'otome_server_development' AND TABLE_NAME = 'admin_users';': Unknown table 'COLUMN_STATISTICS' in information_schema (1109) rails aborted! failed to execute: `mysqldump` Please check the output above for any errors and make sure that `mysqldump` is installed in your PATH and has proper permissions. bin/rails:4:in `<main>' Tasks: TOP => db:structure:dump (See full trace by running task with --trace)
どうやら mysql 8.0 へのバージョンアップでは注意が必要なようです。
参考:https://hit.hateblo.jp/entry/MYSQL/MYSQL8/SETTING
原因
5.7 から 8.0 では注意しなければならないことはわかったのですが、どこで mysql クライアントのバージョンを見ているのか、mysql サーバーのバージョンで処理していないのか、疑問でした。
どうやら gem mysql2 が libmysqlclient ライブラリを参照していて、これのバージョンが 8.0 になり影響しているようです。
https://github.com/brianmario/mysql2#general-instructions
解決方法
database.yml の設定でできるのか
ダメでした。
そもそも設定可能なすべてのオプションを探すのに苦労しました。stack overflow
mysql2 の場合はおそらくこちら
my.cnf の設定
my.cnf に column-statistics=0
の設定を追加し、対応できました。
https://serverfault.com/questions/912162/mysqldump-throws-unknown-table-column-statistics-in-information-schema-1109/912677#912677
my.cnf の確認
$ find /usr/local/Cellar/mysql -name "my*.cnf"
ちなみに my.cnf の設置場所の確認はこちらで
$ mysql --help | grep my.cnf order of preference, my.cnf, $MYSQL_TCP_PORT, /etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf
終わりに
gem で必要なライブラリは実行環境に依存してしまうんですね。 AppEngine の runtime で ruby 使うときはどうするべきなのだろう。runtime を custome にして Dockerfile で管理した方が良いのだろうか。悩みどころ...