MySQL 接続できない(アクセス拒否/ソケット/ポート)原因と復旧手順

  • URLをコピーしました!
目次

はじめに

MySQL への接続ができず、アプリケーションや管理作業が止まってしまうトラブルはよく発生します。
特に以下のようなエラーで困るケースが多いです。

  • Access denied for user 'root'@'localhost'
  • Can't connect to local MySQL server through socket
  • Can't connect to MySQL server on 'xxx.xxx.xxx.xxx' (111)

本記事では、MySQL に接続できない代表的な原因と復旧手順を整理します。

よくある原因

MySQL 接続不可トラブルは大きく分けると次の 3 パターンです。

  1. 認証エラー(ユーザー名/パスワード不一致、権限不足)
    • root やアプリ用ユーザーでログインできない
    • Access denied for user が表示される
  2. ソケットエラー(UNIX ソケットファイル関連の問題)
    • Can't connect to local MySQL server through socket
    • /var/lib/mysql/mysql.sock が存在しない/権限が不正
  3. ポートエラー(TCP/IP 接続関連の問題)
    • ポート 3306 が開いていない
    • ファイアウォールや SELinux により遮断
    • bind-address の設定が不正

確認ポイント

接続できないときは、以下を順番に確認するのが効率的です。

1. MySQL サービス稼働確認

systemctl status mysqld
# または
systemctl status mysql

停止している場合は起動します。

sudo systemctl start mysqld

2. ログインユーザー/パスワード確認

  • 正しいユーザーでログインしているか
  • root 以外のユーザーでアプリから接続している場合、権限付与済みか

テスト接続:

mysql -u root -p

3. ソケットファイル確認

ls -l /var/lib/mysql/mysql.sock

存在しない場合は、設定ファイル /etc/my.cnf[mysqld] / [client]socket の値を確認。

4. ポート確認

ss -ltnp | grep 3306

MySQL が 3306 番ポートで LISTEN しているか確認。

復旧手順

1. 認証エラーの復旧

  • root パスワードを忘れた場合 → シングルユーザーモードでの初期化
sudo systemctl stop mysqld
sudo mysqld_safe --skip-grant-tables &
mysql -u root
# root パスワードをリセット
ALTER USER 'root'@'localhost' IDENTIFIED BY '新しいパスワード';
FLUSH PRIVILEGES;
  • ユーザーに権限を付与
GRANT ALL PRIVILEGES ON データベース.* TO 'ユーザー名'@'ホスト' IDENTIFIED BY 'パスワード';
FLUSH PRIVILEGES;

2. ソケットエラーの復旧

  • MySQL が起動していない → サービス起動
  • my.cnf のソケット設定を統一
[mysqld]
socket=/var/lib/mysql/mysql.sock

[client]
socket=/var/lib/mysql/mysql.sock
  • アプリケーションの設定ファイルでも同じソケットパスを指定。

3. ポートエラーの復旧

  • 設定ファイルで bind-address を確認
    • 外部から接続するなら 0.0.0.0 または サーバー IP を指定
  • ファイアウォール設定
sudo firewall-cmd --add-port=3306/tcp --permanent
sudo firewall-cmd --reload
  • SELinux が有効な場合は許可設定
sudo setsebool -P mysql_connect_any=1

再発防止策

  • root アカウントではなく、アプリ専用ユーザーを作成して利用
  • 定期的にパスワードを更新し、忘れないように管理
  • 接続情報はアプリ設定ファイルに暗号化して保存
  • 監視ツール(Nagios, Zabbix など)で 3306 ポート死活監視を実施

まとめ

  • MySQL 接続不可は 認証/ソケット/ポート の 3 つに分類できる
  • systemctl status でサービス稼働確認から始めるのが効率的
  • 設定ファイルの統一とファイアウォール調整で解決するケースが多い
  • 再発防止にはユーザー管理と監視体制の整備が重要
目次