ローカルのターミナルで >sudo mysql -u root などとすると、普通にmysqlにログインできるのに、Navicatからだと下記のようなエラーが出て接続できない。。。
ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (111)
2日ハマって、やっと解決法がわかったので記録。
「mysql.sock」ファイルが無いとかアクセス権限の問題じゃなかったー(T_T)
結論:MariaDBの設定でlocalhostが蹴られていた
ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ でググると解決方法がいっぱい出てくる。
「mysql.sock」ファイルを作ったら起動した、「mysql.sock」ファイルのアクセス権限を変更したら起動した、そもそもmariaDBのサービスがスタートしていなかった・・・などなど。しかし、今回の問題は「ローカルでは起動するが、外部からアクセスできない」という話。ここがミソだった。
結局なにをやったかというと、
localhostではなく127.0.0.1で接続しただけ。
Navicatの画面でいうと下図のところ。
普通につながって拍子抜け・・・。localhost = 127.0.0.1 じゃないの?!という疑問には以下で解答します。私もつまづきました。
MariaDBの初期設定では127.0.0.1以外からのアクセスが蹴られている
MariaDBの初期設定では、セキュリティのため127.0.0.1以外のアクセスを遮断してます。だからターミナルからは普通につながったんですね。
これは設定ファイルのなかに記載がありました。「bind-address」という設定項目です。
設定ファイル:/etc/mysql/mariadb.conf.d/50-server.cnf
ここが明示的に
bind-address = 127.0.0.1
とされていることで、外部アプリなどからlocalhostの接続名で接続できませんでした。
どうしてもlocalhostでつなぎたいんじゃ!!
という方は、/etc/mysql/mariadb.conf.d/50-server.cnfのbind-addressをコメントアウトすればいいようです。
# bind-address = 127.0.0.1
ただ、コメントアウト=なんでもかんでもアクセスok!的な意味合いになるので、サービスとしてデプロイするようなケースでは特定のIPなどに制限するべきなんでしょうね。私には未開の地です。
おまけ
エラーの末尾の数字によって対処法が変わってくるのでおまけとして記載します。私も(2)→(13)→(111)という順でエラーが出ました。
ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (2)
こちらの解決法は、
touch /var/lib/mysql/mysql.sock
として「無いよ〜」と言われているmysql.sockを作ってあげるだけ。
「mysql.sock」ファイルは、MariaDBサービスを起動した時に自動的に作られるようですが、手動で作らないと行けないケースがあるようです。
ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (13)
こちらのケースは「アクセス権限が無いよ」と怒られています。
sudo chown mysql:mysql /var/lib/mysql/mysql.sock
として「mysql.sock」ファイルの所有者と所属グループをmysqlに変更してあげればokです。上記のtouchコマンドでmysql.sockを作成したときは、おそらくログインしているユーザーの所有&グループになっているため、(13)のエラーが出ていると思われます。
参考にした記事
こちらの記事に大変お世話になりましたm(_ _)m
【ラズパイ】MariaDBをインストールして初期セットアップする【MariaDB】
さいごに
プログラミング開発環境構築時のエラーは本当にケースバイケース。
自分が求めている回答にたどり着くまで、ネットの海を彷徨い続けるんですね〜。ハァ疲れた。
同じエラーで悩む方が、早くこの記事にたどり着きますように。。。
コメント