概要
Railsのモジュールを動かそうとしたらエラーが出てハマったのでメモ。
なかなか対応策が見つからなかったの記載。
根本的な原因はともかく、とりあえず動かしたい人向けの対応となります。
環境
# コンテナ(サーバ)環境
Docker Container : ruby:2.5
mysql Ver 15.1 Distrib 10.3.17-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2
# Rails:
Ruby on Rails 5.0.2
mysql2 (0.4.5)
エラー内容
DB接続で失敗。初回アクセスやmigrateで失敗する。
# メッセージ
uninitialized constant Mysql2::Client::LONG_PASSWORD
# スタックトレース
mysql2 (0.4.5) lib/mysql2/client.rb:14:in `default_query_options'
mysql2 (0.4.5) lib/mysql2/client.rb:25:in `initialize'
activerecord (5.0.2) lib/active_record/connection_adapters/mysql2_adapter.rb:25:in `new'
activerecord (5.0.2) lib/active_record/connection_adapters/mysql2_adapter.rb:25:in `mysql2_connection'
activerecord (5.0.2) lib/active_record/connection_adapters/abstract/connection_pool.rb:729:in `new_connection'
activerecord (5.0.2) lib/active_record/connection_adapters/abstract/connection_pool.rb:773:in `checkout_new_connection'
activerecord (5.0.2) lib/active_record/connection_adapters/abstract/connection_pool.rb:752:in `try_to_checkout_new_connection'
<略>
対応
gemで落としたmysql2のclient.rbから「LONG_PASSWORD」を削除する
# /usr/local/bundle/gems/mysql2-0.4.5/lib/mysql2/client.rb(環境差異はあります。)
# 変更前
:connect_flags => REMEMBER_OPTIONS | LONG_PASSWORD | LONG_FLAG | TRANSACTIONS | PROTOCOL_41 | SECURE_CONNECTION,
# 変更後
:connect_flags => REMEMBER_OPTIONS | LONG_FLAG | TRANSACTIONS | PROTOCOL_41 | SECURE_CONNECTION,
# ワンライナーでだと以下のコマンド
find /usr/local/bundle/gems -type f -wholename *mysql2*/client.rb | xargs sed -i -e "s/LONG_PASSWORD | //g"
コメント、考察
- あくまで暫定対応です。
- gemのライブラリを直接手を加えてしまうのでできることならやめたほうがいい。
- コンテナのmysqlコマンドのバージョンがMariaDBだからか?
- ちなみに、debianは特定のバージョン以降はapt-getではMariaDBになる。