Mac
MySQL
docker

Mac で複数バージョンの mysql を docker で用意し、protocol=tcp にして sock のエラーを回避する

要約

mysql 接続時の設定が変更可能な場合は以下のどちらか
- mysql client 実行時に --host 0.0.0.0 を用いる、もしくは MYSQL_HOST=0.0.0.0
- mysql client 実行時に --protocol tcp を用いる

設定がハードコードされている等の場合には my.cnf に以下を追記することで、 host = localhost 参照の場合でも sock ではなく tcp を指定する。

[mysql]
protocol = tcp

※ my.cnf の配置は $ mysql --help で候補が出てくる。実態が複数ある場合、表示順の優先度で読み込みを行うため、もっとも優先度の高いものを編集する。

背景

homebrew を使うと最新の MySQL が入りますが、古いバージョンが(時には複数のバージョンが)必要になることがあります。
また、同盟のデータベース名を複数のアプリケーションで使用するケースもあり、実態として複数欲しいことがあります。

brew で入る mysql@5.6 を使用するにも、link まわりや services まわりでハマりがちであるうえ、バージョン切り替えるごとに行わなければならない処理が煩雑になりがちです。

そこで、Mac には client としての mysql(最新版)をインストールし、 mysql server は docker を使用します。
ただし、mysql client は host = localhost (標準) の場合、 sock による通信を優先するため、普通にやるとエラーになります。
通常は上記のように 0.0.0.0 を指定する等しますが、歴史的経緯によってはそうもいかないので、 my.cnf に設定を追加します。