MeWrite Docs

SQLSTATE[HY000] [2002] Connection refused

データベースへの接続が拒否された場合に発生するエラー

概要

SQLSTATE[HY000] [2002] Connection refused は、LaravelからMySQLなどのデータベースに接続できない場合に発生するエラーです。データベースサーバーが起動していない、接続設定が間違っている、ネットワークの問題などが原因です。

エラーメッセージ

SQLSTATE[HY000] [2002] Connection refused
SQLSTATE[HY000] [2002] No such file or directory
SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost'

原因

  1. データベースが起動していない: MySQL/PostgreSQLサービスが停止
  2. ホスト名の誤り: localhost127.0.0.1 の違い
  3. ポート番号の誤り: デフォルトポートが異なる
  4. 認証情報の誤り: ユーザー名・パスワードが間違っている
  5. ソケットファイルの問題: Unixソケットのパスが違う
  6. Dockerのネットワーク問題: コンテナ間の通信設定

解決策

1. データベースサービスの確認

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# MySQL の状態確認
sudo systemctl status mysql
sudo service mysql status

# MySQL の起動
sudo systemctl start mysql
sudo service mysql start

# PostgreSQL の状態確認
sudo systemctl status postgresql

# macOS (Homebrew)
brew services list
brew services start mysql

2. .env ファイルの設定確認

1
2
3
4
5
6
7
# .env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=your_database
DB_USERNAME=your_username
DB_PASSWORD=your_password
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// config/database.php を確認
'mysql' => [
    'driver' => 'mysql',
    'host' => env('DB_HOST', '127.0.0.1'),
    'port' => env('DB_PORT', '3306'),
    'database' => env('DB_DATABASE', 'forge'),
    'username' => env('DB_USERNAME', 'forge'),
    'password' => env('DB_PASSWORD', ''),
    'unix_socket' => env('DB_SOCKET', ''),
    // ...
],

3. localhost と 127.0.0.1 の違い

1
2
3
4
5
6
7
# localhost はソケット接続を試みる(Unixシステム)
DB_HOST=localhost

# 127.0.0.1 は TCP/IP 接続
DB_HOST=127.0.0.1

# ソケット接続がうまくいかない場合は 127.0.0.1 を使用

4. Unixソケットの設定

1
2
3
4
5
6
7
# ソケットファイルの場所を確認
mysql -u root -p -e "SHOW VARIABLES LIKE 'socket';"

# 一般的なソケットパス
# /var/run/mysqld/mysqld.sock (Ubuntu/Debian)
# /tmp/mysql.sock (macOS/MAMP)
# /var/lib/mysql/mysql.sock (CentOS/RHEL)
1
2
# .env でソケットを指定
DB_SOCKET=/var/run/mysqld/mysqld.sock

5. Docker での設定

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# docker-compose.yml
version: '3.8'
services:
  app:
    build: .
    depends_on:
      - db
    environment:
      DB_HOST: db  # サービス名を指定
      DB_PORT: 3306
      DB_DATABASE: laravel
      DB_USERNAME: laravel
      DB_PASSWORD: secret

  db:
    image: mysql:8.0
    environment:
      MYSQL_DATABASE: laravel
      MYSQL_USER: laravel
      MYSQL_PASSWORD: secret
      MYSQL_ROOT_PASSWORD: root
    ports:
      - "3306:3306"
1
2
3
4
5
6
7
# Docker 環境の .env
DB_CONNECTION=mysql
DB_HOST=db           # Docker サービス名
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=secret

6. データベースの作成

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# MySQL にログイン
mysql -u root -p

# データベースを作成
CREATE DATABASE your_database;

# ユーザーを作成して権限付与
CREATE USER 'your_username'@'localhost' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON your_database.* TO 'your_username'@'localhost';
FLUSH PRIVILEGES;

# Docker からホストの MySQL に接続する場合
CREATE USER 'your_username'@'%' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON your_database.* TO 'your_username'@'%';
FLUSH PRIVILEGES;

7. Laravel のキャッシュクリア

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 設定キャッシュをクリア
php artisan config:clear

# すべてのキャッシュをクリア
php artisan cache:clear
php artisan config:cache

# 接続テスト
php artisan tinker
>>> DB::connection()->getPdo();

8. ファイアウォール・ポートの確認

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# ポートが開いているか確認
sudo netstat -tlnp | grep 3306
sudo lsof -i :3306

# ファイアウォールの確認 (Ubuntu)
sudo ufw status
sudo ufw allow 3306

# ファイアウォールの確認 (CentOS)
sudo firewall-cmd --list-ports
sudo firewall-cmd --add-port=3306/tcp --permanent
sudo firewall-cmd --reload

9. MySQL のバインドアドレス

1
2
3
4
# /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
bind-address = 0.0.0.0  # すべてのIPから接続許可
# bind-address = 127.0.0.1  # localhost のみ(デフォルト)
1
2
# 設定変更後、再起動
sudo systemctl restart mysql

デバッグのコツ

接続テスト

1
2
3
4
5
# コマンドラインから接続テスト
mysql -h 127.0.0.1 -P 3306 -u your_username -p your_database

# Docker コンテナから接続テスト
docker exec -it app_container mysql -h db -u laravel -p

Laravel での詳細エラー

1
2
3
4
5
6
7
8
9
// tinker で詳細確認
php artisan tinker

>>> try {
...     DB::connection()->getPdo();
...     echo "Connected!";
... } catch (\Exception $e) {
...     echo $e->getMessage();
... }

環境変数の確認

1
2
3
4
5
6
# 現在の設定を確認
php artisan config:show database

# または tinker で
php artisan tinker
>>> config('database.connections.mysql')

Laravel の他のエラー

最終更新: 2025-12-08