概要
MySQLクライアントを5.7系から、8.0系にアップデートしたところ、Railsが以下のようなエラーが発生して起動しなくなった。
libmysqlclient.so.20: cannot open shared object file: No such file or directory - /dir/shared/bundle/ruby/2.7.0/gems/mysql2-0.5.5/lib/mysql2/mysql2.so (LoadError)
環境
Amazon Linux 2
Ruby 2.7
Ruby On Rails 6.1.3.1
MySQL (gem mysql2 使用)
MySQL クライアントライブラリは yum で管理
以下の場所に libmysqlclient.so.20 が無い
$ ls -l /usr/lib64/mysql/
合計 20304
-rw-r--r-- 1 root root 9668352 10月 13 00:33 libmysqlclient.a
lrwxrwxrwx 1 root root 20 10月 25 09:45 libmysqlclient.so -> libmysqlclient.so.21
lrwxrwxrwx 1 root root 24 10月 25 09:45 libmysqlclient.so.18 -> libmysqlclient.so.18.1.0
-rwxr-xr-x 1 root root 3546456 10月 13 00:33 libmysqlclient.so.18.1.0
lrwxrwxrwx 1 root root 25 10月 25 09:45 libmysqlclient.so.21 -> libmysqlclient.so.21.2.35
-rwxr-xr-x 1 root root 7545032 10月 13 00:33 libmysqlclient.so.21.2.35
lrwxrwxrwx 1 root root 20 10月 25 09:45 libmysqlclient_r.so.18 -> libmysqlclient.so.18
lrwxrwxrwx 1 root root 24 10月 25 09:45 libmysqlclient_r.so.18.1.0 -> libmysqlclient.so.18.1.0
-rw-r--r-- 1 root root 23046 10月 13 00:33 libmysqlservices.a
drwxr-xr-x 2 root root 125 10月 25 09:45 plugin
MySQL クライアントバージョン
$ yum list mysql-community-client.x86_64
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
293 packages excluded due to repository priority protections
Installed Packages
mysql-community-client.x86_64 8.0.35-1.el7 @mysql80-community
対応
rm /dir/shared/bundle/ruby/2.7.0/specifications/mysql2-0.5.5.gemspec
cd /dir/current/
bundle install
↓の mysql2.so のバイナリが再生成される
/dir/shared/bundle/ruby/2.7.0/gems/mysql2-0.5.5/lib/mysql2/mysql2.so
原因
mysql2 gem を bundle install した際に生成される mysql2.so は、その時入っている MySQL クライアントのバイナリファイルのパス(libmysqlclient)を参照しているようで、MySQL クライアントをアップデートしたことによって、それまで参照していたバイナリファイルの名前が変わってしまい参照できなくなった。
一度gemspecファイルを消してbundle installし直すことで、その時のMySQL クライアントのバイナリファイルを参照するmysql.soファイルが生成され、直った。
参考