macOS での Rails 開発

失敗しがちな macOS 環境上での mysql2 セットアップに関するメモ書き

Gemfile で mysql2 をセットアップするときにコケるとき

ld: library not found for -lssl

IntelアーキテクチャのMacBookなので M1 等のARMでは事情が異なるため注意。

-----
Using mysql_config at /usr/local/bin/mysql_config
-----
checking for mysql.h... yes
checking for errmsg.h... yes
checking for SSL_MODE_DISABLED in mysql.h... yes
checking for SSL_MODE_PREFERRED in mysql.h... yes
checking for SSL_MODE_REQUIRED in mysql.h... yes
checking for SSL_MODE_VERIFY_CA in mysql.h... yes
checking for SSL_MODE_VERIFY_IDENTITY in mysql.h... yes
checking for MYSQL.net.vio in mysql.h... yes
checking for MYSQL.net.pvio in mysql.h... no
checking for MYSQL_ENABLE_CLEARTEXT_PLUGIN in mysql.h... yes
checking for SERVER_QUERY_NO_GOOD_INDEX_USED in mysql.h... yes
checking for SERVER_QUERY_NO_INDEX_USED in mysql.h... yes
checking for SERVER_QUERY_WAS_SLOW in mysql.h... yes
checking for MYSQL_OPTION_MULTI_STATEMENTS_ON in mysql.h... yes
checking for MYSQL_OPTION_MULTI_STATEMENTS_OFF in mysql.h... yes
checking for my_bool in mysql.h... no
-----
Don't know how to set rpath on your system, if MySQL libraries are not in path mysql2 may not load
-----
-----
Setting libpath to /usr/local/Cellar/mysql/8.0.19/lib
-----
creating Makefile

current directory: /Users/your-username/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mysql2-0.5.3/ext/mysql2
make "DESTDIR=" clean

current directory: /Users/your-username/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mysql2-0.5.3/ext/mysql2
make "DESTDIR="
compiling client.c
compiling infile.c
compiling mysql2_ext.c
compiling result.c
compiling statement.c
linking shared-object mysql2/mysql2.bundle
ld: library not found for -lssl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [mysql2.bundle] Error 1

make failed, exit code 2

解決策

$ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib --with-cppflags=-I/usr/local/opt/openssl/include"

その他解決ケース2

エラー内容によってケースバイケース

bundle config build.mysql2 --with-opt-include=/opt/homebrew/include --with-opt-lib=/opt/homebrew/lib

.bundle/config

BUNDLE_PATH: "vendor/bundle"
BUNDLE_BUILD__MYSQL2: "--with-opt-include=/opt/homebrew/include --with-opt-lib=/opt/homebrew/lib"

MySQLに接続出来ずにハマる

問題点

Docker で MySQL サービスを立ち上げたものの、ローカルも mysql からは接続ができない。

コンテナ内の mysql クライアントでは接続できるほか、PHPMyAdmin のような管理Webからはアクセスができる。

ローカルのクライアントからのみ接続ができない。

mysql -u root -p -h 127.0.0.1

結論

別のmysqldが起動していた

  • docker ps で重複起動がないかを確認していたので、ポート重複はないと油断していた
  • これまでのmac上で問題がなかったので先入観が邪魔をしていた
COMMAND     PID   USER     FD   TYPE             DEVICE SIZE/OFF NODE NAME
mysqld     6618 username   23u  IPv4 0x55c7c33604560444      0t0  TCP localhost:mysql (LISTEN)
com.docke 91253 username   84u  IPv6 0x50013fa53431babd      0t0  TCP *:mysql (LISTEN

結果、PCを再起動したことで mysqld プロセスが消えた。

❯ lsof -i :3306
COMMAND    PID    USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
com.docke 2313 username  143u  IPv6 0x23a3e4503d368749      0t0  TCP *:mysql (LISTEN)