kawabatas技術ブログ

試してみたことを書いていきます

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 サーバーのバージョンで処理していないのか、疑問でした。

rails でこんなコミットも見つけたので。

どうやら 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 で管理した方が良いのだろうか。悩みどころ...