見出し画像

Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'で悩んだ話

どうもこんばんは。

1ヶ月近く悩んでいたエラーがようやく解消されました。
その記録を備忘として残します。

環境

AWSのLightsailを使用
DockerでRuby2.5.3,rails6.0.1
DB:ローカルのMySQL(8.0.18)

事象

コンテナ上のアプリからローカルに構築済みのMySQLに接続する際にエラー。

Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'

指定の場所にはmysql.sockがある。
MySQLも起動済み。
ちなみにローカルから直接MySQLにログインはできました。
database.ymlのsocketの記載で誤りがあるようには思えませんでした。

解決策

結論から書くと、MySQLのユーザ設定でホスト名を適切にしました。
(その他、やったこと①③の設定も必要の認識です。)
もともとlocalhostで設定しており、MacBookでは問題なく接続できていました。

ホスト名を'%'でも接続できますが、
セキュリティ的に良くない?という記事も見たので、
プライベートIPアドレスを含むホスト名を設定しました。

mysql> rename user '【ユーザ名】'@'localhost' to '【ユーザ名】'@'ip-xxx-xxx-xx-xx.ap-northeast-1.compute.internal';

MySQLに接続したのちに、上記のコマンドで接続先のホスト名を変更します。
以下のコマンドでユーザ名、接続先ホスト名の設定を確認できます。

mysql> SELECT user, host FROM mysql.user;
# 接続先ホスト名の確認は以下のコマンド。railsのエラー画面でも表示されていた。
mysql> show variables like 'hostname';

MySQLの起動確認、mysql.sockの存在を確認以外にやったことを紹介します。

やったこと① docker-compose.ymlの編集

コンテナから接続できていなかったので、docker-compose.ymlを疑いました。
ホスト名を環境変数に格納していて、
ローカルPCのときは'docker.for.mac.localhost'にしていました。
今回はプライベートIPアドレスを設定しました。

やったこと② config/environments/development.rbの編集

接続自体に問題はないのですが、
ログに"Cannot render console from Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255"のような表示が出ました。
以下を参考にして解決しました。

やったこと③ /etc/my.cnfの編集

設定しないとうまく接続できません。
MySQL設定ファイルであるmy.cnfの編集をしました。
接続先のIPとして、コンテナのIPを記載しました。

bind-address=【コンテナのIP】

所感

表示されるエラーから解決策を導き出すのに苦労しました。
mysql.sockには問題ないわけなので。

元々、AWSで作業をしていて、このエラーになったのですが、
解決に向かうまでに、一度ローカルで類似の環境を作り、参考書のマネを一から始めました。
作業していくうちに各ファイルはどのような設定をしているのかがわかるようになりました。

基本に立ち返るというのは当たり前ですが大切であると再確認した次第です。
誤り、ご意見がありましたらご指摘願います。

この記事が気に入ったらサポートをしてみませんか?