できない.dev

MySQL で「Can't connect to MySQL server」(2002/2003) で接続できない

サーバー未起動、ソケット/ポート指定の誤り、bind-address やファイアウォールが原因。
2002 は Unix ソケット、2003 は TCP の接続失敗。
まず mysqld が起きているか確認する。

公開: 更新:

症状できない · exit 1
mysql -u root -h localhost -e "SELECT 1"
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
解決後できた · exit 0
mysql -u root -h 127.0.0.1 -P 3306 -t -e "SELECT @@port, CURRENT_USER()"
+--------+----------------+
| @@port | CURRENT_USER() |
+--------+----------------+
|   3306 | root@127.0.0.1 |
+--------+----------------+

2026-10-09 に mysql:8.4(MySQL 8.4.11) で実際に打って取った出力。検証環境の詳細

要約

ERROR 2002 (HY000): Can't connect to local MySQL server through socket や ERROR 2003 (HY000): Can't connect to MySQL server on 'host' は、クライアントが MySQL サーバーに到達できないときに出る。

2002 は Unix ソケット経由、2003 は TCP 経由の接続失敗。
括弧内の 10061(Windows)や 111(Linux)は OS 側のエラー番号。
まず mysqld が起動しているかを確認するのが切り分けの起点。

実行例

mysql:8.4 で試すと、-h localhost はクライアントが既定で見に行くソケットパスで 2002 になり、サーバーが実際に使っているソケットを指定すると同じサーバーに接続できた。-h 127.0.0.1 に切り替えれば TCP 経由になり、ソケットパスの食い違いとは無関係に繋がる。

$ mysql -u root -h localhost -e "SELECT 1"
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
$ echo $?
1
$ mysqladmin -u root --socket=/tmp/tmp.kFEVXUEu0t/mysqld-custom.sock ping
mysqld is alive
$ echo $?
0
$ mysql -u root --socket=/tmp/tmp.kFEVXUEu0t/mysqld-custom.sock -t -e 'SELECT @@socket'
+----------------------------------------+
| @@socket                               |
+----------------------------------------+
| /tmp/tmp.kFEVXUEu0t/mysqld-custom.sock |
+----------------------------------------+
$ echo $?
0
$ mysql -u root -h 127.0.0.1 -P 3306 -t -e "SELECT @@port, CURRENT_USER()"
+--------+----------------+
| @@port | CURRENT_USER() |
+--------+----------------+
|   3306 | root@127.0.0.1 |
+--------+----------------+
$ echo $?
0

— 2026-10-09 時点の出力

検証環境MySQL 8.4.11 / 2026-10-09 検証
検証日
実行環境
mysql:8.4 Oracle Linux Server 9.8
バージョン
  • MySQL 8.4.11

この記事の「実行例」は、上記の環境で実際にコマンドを実行して得られた出力をそのまま掲載しています。 再現手順はリポジトリの検証スクリプトとして管理し、定期的に再実行して出力を更新しています。

解決策

1. サーバーの起動を確認する

mysqladmin -u root -p ping
sudo systemctl status mysql

停止していれば起動する。
まずここを確かめる。

2. localhost と 127.0.0.1 を使い分ける

mysql -h 127.0.0.1 -P 3306 -u root -p

localhost は Unix ソケット、127.0.0.1 は TCP。
ソケット由来の問題は 127.0.0.1 で回避できる。

3. ソケット/ポートを明示する

mysql --socket=/var/run/mysqld/mysqld.sock -u root -p

設定ファイルの socket / port と一致するよう指定する。

4. リモート接続を許可する

my.cnf の bind-address を見直し、ファイアウォールで 3306 を開放する。
公開範囲は必要最小限にする。

よくある原因

  1. サーバー未起動: mysqld が起きていない、または別ポートで待ち受けている。
  2. ソケットパス違い: localhost は TCP ではなく Unix ソケットを使うため、パスがずれると 2002 になる。
  3. ポート遮断: 3306 がファイアウォールで塞がれていると 2003 になる。
  4. bind-address: 127.0.0.1 だけを待ち受けていると外部から繋がらない。

この手順で直った?