AR ホームベーカリー

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

homebrew から MySQL 8.4 をインストールする時の覚書

自分向けなんで参考になるところだけ拾ってくれ〜。

MySQL 8.1.0 の話

こいつ過去にもなんか書いてますよ。

donbulinux.hatenablog.jp

homebrew は言葉通り最新版をインストールする

どういうことかと言うと、 MySQL の最新版 (InnovationRelease) をインストールします。

homebrew はあくまで Nightly build など、スナップショット的にお出しされる以外はすべて同列 (ちゃんとリリースされたもの) として見るので、そのリリースされた中で複数ラインがあったとしても各アプリの立ち位置は考慮しないというスタンスのようです。

なので MySQL が「MySQL 9.0.x 〜 9.3.x はInnovationRelease なので、自分で選択した開発環境以外に導入するな!」と言っても homebrew は「しらーん、だってリリースしてんでしょ?」、という事らしい。

どういうこと

具体的に言うと、この記事を書いている時点では brew install mysql などして一般的に望まれるインストールバージョンは MySQL 8.4 LTS (9.7 LTS, 10.7 LTS ... と続く) だと思われますが、 実際には LTS ではない MySQL 9 世代がインストールされます。

❯ brew info mysql
==> mysql: stable 9.1.0 (bottled)

グエーッ!! 困る!

MySQL のバージョン

ご存知の通り InnovationRelease が導入され、4 半期 (3 ヶ月に一回) 間隔でバージョンアップと同時にサポートが切れるという具合になりました。

https://blogs.oracle.com/mysql-jp/post/introducing-mysql-innovation-and-longterm-support-lts-versions-jp

そういう向きもあって LTS がインストールされることを暗黙的に期待している、というモチベーションだったんですね。

特定のバージョンを選択する

homebrew にはフォーミュラ名に @~~ と付与するとバージョンを選択できる機能があります。 対応しているヤツだけですが。 ということで MySQL 8.4 を選択してみましょう。

❯ brew info mysql@8.4
==> mysql@8.4: stable 8.4.3 (bottled) [keg-only]

おーありますね、これをインストールすればよさそうです。

インストールする

❯ brew install mysql@8.4

これだけですが、標準出力を確認してください。 おそらく以下のような出力があるはずです。

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

If you need to have mysql@8.4 first in your PATH, run:
  echo 'export PATH="/opt/homebrew/opt/mysql@8.4/bin:$PATH"' >> ~/.zshrc

For compilers to find mysql@8.4 you may need to set:
  export LDFLAGS="-L/opt/homebrew/opt/mysql@8.4/lib"
  export CPPFLAGS="-I/opt/homebrew/opt/mysql@8.4/include"

For pkg-config to find mysql@8.4 you may need to set:
  export PKG_CONFIG_PATH="/opt/homebrew/opt/mysql@8.4/lib/pkgconfig"

To start mysql@8.4 now and restart at login:
  brew services start mysql@8.4
Or, if you don't want/need a background service you can just run:
  /opt/homebrew/opt/mysql@8.4/bin/mysqld_safe --datadir\=/opt/homebrew/var/mysql

雑に翻訳すると以下となります。

mysql@8.4 は keg のみであり、これは別の式の代替バージョンであるため、/opt/homebrew にシンボリックリンクされていません。

PATH の最初に mysql@8.4 が必要な場合は、次を実行します: echo 'export PATH="/opt/homebrew/opt/mysql@8.4/bin:$PATH"' >> ~/.zshrc

コンパイラmysql@8.4 を見つけるには、次を設定する必要があります: export LDFLAGS="-L/opt/homebrew/opt/mysql@8.4/lib" export CPPFLAGS="-I/opt/homebrew/opt/mysql@8.4/include"

pkg-config が mysql@8.4 を見つけるには、次を設定する必要があります: export PKG_CONFIG_PATH="/opt/homebrew/opt/mysql@8.4/lib/pkgconfig"

今すぐ mysql@8.4 を起動し、ログイン時に再起動するには: brew services start mysql@8.4 または、バックグラウンド サービスが必要ない場合は、次を実行するだけです: /opt/homebrew/opt/mysql@8.4/bin/mysqld_safe --datadir\=/opt/homebrew/var/mysql

これ他のバージョンの MySQL が存在していない状態なら良いのですが、 brew install mysql など実行済みであれば mysql のデフォルトバージョンは自動的に切り替わらないよ (移行の brew やビルド、 **env などでインストールした時も参照されないよ) という事です。

どういうことか、というと、実際に複数バージョンインストールしている僕の環境では以下のように、 mysql (/opt/homebrew/opt/mysql) の標準バージョンは 9.0.1_2 となっています。

pwd
/opt/homebrew/opt
❯ gls mysql*
lrwxr-xr-x 1 donbulinux admin 23  9 22 01:21 mysql -> ../Cellar/mysql/9.0.1_2
lrwxr-xr-x 1 donbulinux admin 28  9 18 15:28 mysql-client -> ../Cellar/mysql-client/9.0.1
lrwxr-xr-x 1 donbulinux admin 28  9 18 15:28 mysql-client@8.0 -> ../Cellar/mysql-client/9.0.1
lrwxr-xr-x 1 donbulinux admin 28  9 18 15:28 mysql-client@8.1 -> ../Cellar/mysql-client/9.0.1
lrwxr-xr-x 1 donbulinux admin 28  9 18 15:28 mysql-client@8.2 -> ../Cellar/mysql-client/9.0.1
lrwxr-xr-x 1 donbulinux admin 28  9 18 15:28 mysql-client@9.0 -> ../Cellar/mysql-client/9.0.1
lrwxr-xr-x 1 donbulinux admin 28  9 22 00:52 mysql@8.0 -> ../Cellar/mysql@8.0/8.0.39_3
lrwxr-xr-x 1 donbulinux admin 23  9 22 01:21 mysql@8.3 -> ../Cellar/mysql/9.0.1_2
lrwxr-xr-x 1 donbulinux admin 27  9 18 15:25 mysql@8.4 -> ../Cellar/mysql@8.4/8.4.2_2
lrwxr-xr-x 1 donbulinux admin 23  9 22 01:21 mysql@9.0 -> ../Cellar/mysql/9.0.1_2

これは前述した homebrew が複数バージョンを使えるようにしている仕組み上どうしようもないので、PATH の順序 (最初に一致したヤツが使われる) を利用して先に mysql@8.4 が利用されるよう、以下のようにします。

echo 'export PATH="/opt/homebrew/opt/mysql@8.4/bin:$PATH"' >> ~/.zshrc

また、これだけだと前述の通り、他のビルドや **env などが mysql@8.4 ではなく mysql (mysql@9.0) を見ているままなので、以下も追加で実行します。

export LDFLAGS="-L/opt/homebrew/opt/mysql@8.4/lib"export CPPFLAGS="-I/opt/homebrew/opt/mysql@8.4/include"export PKG_CONFIG_PATH="/opt/homebrew/opt/mysql@8.4/lib/pkgconfig"

このあたりの管理は文末に追記します。

これで一度ターミナルを再起動するか、各日なのは macOS ごと再起動しましょう。

❯ mysql -V
mysql  Ver 9.0.1 for macos15.0 on arm64 (Homebrew)

あれーっ!? となるかもしれませんが慌てないでください。 上記の作業はあくまで MySQL のサーバーのみ 8.4 とする作業であり、クライアントについては切り替えを行っていません。 実際にサーバーにログインしてみましょう!

❯ mysql -u donbulinux -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.4.2 Homebrew

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

無事に 8.4.2 で起動していましたね! ということでこれで大丈夫です。

僕は個人的に困らないのでクライアントバージョンは後方互換性を期待して最新版のままにしていますが、気になる人は調べて変更してみてください。

おまけ

文中に書いた通り、 export している内容は以下のようにドットファイル (僕の場合は ~/.zshrc) に記載しています。 現代においては Docker に移行した方がスマートですね……。

# homebrew

## MySQL@8.4
export PATH="/opt/homebrew/opt/mysql@8.4/bin:$PATH"
export LDFLAGS="-L/opt/homebrew/opt/mysql@8.4/lib"
export CPPFLAGS="-I/opt/homebrew/opt/mysql@8.4/include"
export PKG_CONFIG_PATH="/opt/homebrew/opt/mysql@8.4/lib/pkgconfig"

# bundler (こっちは Rails 使う場合に書く)

## mysql2
export LIBRARY_PATH=$LIBRARY_PATH:$(brew --prefix zstd)/lib/

## libffi
export LDFLAGS="-L/opt/homebrew/opt/libffi/lib"
export CPPFLAGS="-I/opt/homebrew/opt/libffi/include"
export PKG_CONFIG_PATH="/opt/homebrew/opt/libffi/lib/pkgconfig"