AR ホームベーカリー

オイラのアウトプット用ホームベーカリー!

HomeBrew のアップデートで MySQL 8.1.0 がインストールされて俺の Rails が壊れた

俺の、って書いておかないとマサカリ飛んできそうなので。

追記

純粋に mysql2 0.5.4 を再コンパイル (インストール) したらライブラリのリンク切れ解消できていけそうな気もするんだけど、ちょうどよかったというのもあってアップデートを選んでいる。なんらかの理由でパッチバージョン動かせないという場合は、同じバージョンで再コンパイル (インストール) してみてください。

rails s

事情により Ruby 2.7 (Rails 5.1 + MySQL 8.0) でメンテナンスしている環境を起動しようとしたら、起動できなかった。

18:25:19 web.1  | /Users/donbulinux/Workspace/example-project/vendor/bundle/ruby/2.7.0/gems/mysql2-0.5.4/lib/mysql2.rb:36:in `require': dlopen(/Users/donbulinux/Workspace/example-project/vendor/bundle/ruby/2.7.0/gems/mysql2-0.5.4/lib/mysql2/mysql2.bundle, 0x0009): Library not loaded: /opt/homebrew/opt/mysql/lib/libmysqlclient.21.dylib (LoadError)
18:25:19 web.1  |   Referenced from: <D6836B55-BF1B-3C55-A1B3-8B6E915A500E> /Users/donbulinux/Workspace/example-project/vendor/bundle/ruby/2.7.0/gems/mysql2-0.5.4/lib/mysql2/mysql2.bundle
18:25:19 web.1  |   Reason: tried: '/opt/homebrew/opt/mysql/lib/libmysqlclient.21.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OS/opt/homebrew/opt/mysql/lib/libmysqlclient.21.dylib' (no such file), '/opt/homebrew/opt/mysql/lib/libmysqlclient.21.dylib' (no such file), '/usr/local/lib/libmysqlclient.21.dylib' (no such file), '/usr/lib/libmysqlclient.21.dylib' (no such file, not in dyld cache), '/opt/homebrew/Cellar/mysql/8.1.0/lib/libmysqlclient.21.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OS/opt/homebrew/Cellar/mysql/8.1.0/lib/libmysqlclient.21.dylib' (no such file), '/opt/homebrew/Cellar/mysql/8.1.0/lib/libmysqlclient.21.dylib' (no such file), '/usr/local/lib/libmysqlclient.21.dylib' (no such file), '/usr/lib/libmysqlclient.21.dylib' (no such file, not in dyld cache) - /Users/donbulinux/Workspace/example-project/vendor/bundle/ruby/2.7.0/gems/mysql2-0.5.4/lib/mysql2/mysql2.bundle

数週間前にメンテナンスついでに main の先頭まで rebase 実施したので「壊れたかな?」と思っていたんですが、そもそも rebase 実施時に動作確認したよな……となり悩んでいた。

「もしかして MySQL のプロセス起動しているけどこれが壊れているとか?」と思いたち、サーバにログインしてみた。

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 8.1.0 Homebrew

mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 8.1.0     |
+-----------+
1 row in set (0.00 sec)

ンアーッ!! バージョンが 8.0.34 -> 8.1.0 へ上がってるナンデ!?

ナンデ!?

と思ったけど、そういえば先日 librsvg のインストールやった時に Formula のアップデート走りまくったな、と気づいたのでそれです。 本当にありがとうございました。

github.com

❯ brew info mysql
==> mysql: stable 8.1.0 (bottled)
Open source relational database management system
https://dev.mysql.com/doc/refman/8.0/en/
Conflicts with:
  mariadb (because mysql, mariadb, and percona install the same binaries)
  percona-server (because mysql, mariadb, and percona install the same binaries)
/opt/homebrew/Cellar/mysql/8.1.0 (325 files, 308.4MB) *
  Poured from bottle using the formulae.brew.sh API on 2023-09-22 at 19:11:23
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/m/mysql.rb
License: GPL-2.0-only with Universal-FOSS-exception-1.0
==> Dependencies
Build: bison ✘, cmake ✘, pkg-config ✔
Required: icu4c ✔, libevent ✘, libfido2 ✘, lz4 ✔, openssl@3 ✔, protobuf@21 ✔, zlib ✘, zstd ✔
==> Caveats
We've installed your MySQL database without a root password. To secure it run:
    mysql_secure_installation

MySQL is configured to only allow connections from localhost by default

To connect run:
    mysql -u root

To start mysql now and restart at login:
  brew services start mysql
Or, if you don't want/need a background service you can just run:
  /opt/homebrew/opt/mysql/bin/mysqld_safe --datadir\=/opt/homebrew/var/mysql
==> Analytics
install: 41,910 (30 days), 126,402 (90 days), 279,093 (365 days)
install-on-request: 41,713 (30 days), 125,874 (90 days), 277,959 (365 days)
build-error: 653 (30 days)

8 月の中旬にはアップデートされていたらしい、気付かなかったそんなの……。

どうする

mysql@8.0 とかいう Formula 指定すればインストールできる様子です。

❯ brew info mysql@8.0
==> mysql@8.0: stable 8.0.34 (bottled) [keg-only]
Open source relational database management system
https://dev.mysql.com/doc/refman/8.0/en/
Not installed
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/m/mysql@8.0.rb
License: GPL-2.0-only with Universal-FOSS-exception-1.0
==> Dependencies
Build: bison ✘, cmake ✘, pkg-config ✔
Required: icu4c ✔, libevent ✘, libfido2 ✘, lz4 ✔, openssl@3 ✔, protobuf@21 ✔, zlib ✘, zstd ✔
==> Caveats
We've installed your MySQL database without a root password. To secure it run:
    mysql_secure_installation

MySQL is configured to only allow connections from localhost by default

To connect run:
    mysql -u root

mysql@8.0 is keg-only, which means it was not symlinked into /opt/homebrew,
because this is an alternate version of another formula.

To start mysql@8.0 now and restart at login:
  brew services start mysql@8.0
Or, if you don't want/need a background service you can just run:
  /opt/homebrew/opt/mysql@8.0/bin/mysqld_safe --datadir\=/opt/homebrew/var/mysql
==> Analytics
install: 1,746 (30 days), 2,248 (90 days), 2,247 (365 days)
install-on-request: 1,746 (30 days), 2,247 (90 days), 2,247 (365 days)
build-error: 112 (30 days)

とはいえ

mysql2 gem を更新していなかったので、ちょうどいいので僕は gem 更新します。 MySQL 自体もまあなんとかなるでしょこれでも。

ちなみに 9/25 時点では Compatibility の記載に MySQL 8.1 は入っていませんが mysql2 gem を 0.5.4 -> 0.5.5 にアップデートすることで無事うごきました。

❯ bundle update mysql2

...snip...

Installing mysql2 0.5.5 (was 0.5.4) with native extensions
Bundle updated!

これにて解決。