DatabaseLaravelMySQLDatabase.env6 mnt baca

Mengatasi SQLSTATE Connection Refused di Laravel

Laravel tidak bisa terhubung ke database: SQLSTATE[HY000] [2002] Connection refused. Checklist dari yang paling umum.

1 · Gejala & Log Pesan Error

error.log
SQLSTATE[HY000] [2002] Connection refused
(SQL: select * from users)

/ Connection to tcp://127.0.0.1:3306 failed

// saat migrate:
SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo for mysql
failed: Name or service not known

2 · Akar Penyebab Masalah

Aplikasi Tidak Sampai ke Server Database

"Connection refused" artinya paket TCP sampai ke alamat tujuan tapi tidak ada yang mendengarkan di port itu. Bukan salah query, bukan salah migration: koneksinya sendiri gagal.

Tersangka berurutan:

  1. Server database tidak jalan: MySQL/MariaDB belum di-start (sangat umum setelah restart laptop).
  2. Host/port salah di .env: DB_HOST=127.0.0.1 tapi database jalan di tempat lain, atau port bukan 3306.
  3. Nama host khusus environment: di Laravel Sail/Docker, host-nya mysql (nama service), bukan 127.0.0.1. Di sisi lain, dari luar container pakai 127.0.0.1. Tertukar = refused.
  4. Config ter-cache: .env sudah benar tapi Laravel masih memakai config lama hasil config:cache.

3 · Solusi & Diff Kode

✕ Sebelum (bermasalah)

before
# ❌ .env tidak cocok dengan environment
DB_CONNECTION=mysql
DB_HOST=127.0.0.1   # tapi app jalan di dalam Sail → harusnya "mysql"
DB_PORT=3306
DB_DATABASE=belajar
DB_USERNAME=root
DB_PASSWORD=         # password kosong padahal MySQL minta password

✓ Sesudah (diperbaiki)

after
# ✔ sesuaikan dengan tempat app berjalan
# Di dalam Sail/Docker:
DB_HOST=mysql
DB_PASSWORD=password # samakan dengan docker-compose.yml

# Setelah ubah .env, selalu:
# php artisan config:clear

Langkah Perbaikan

  1. Pastikan database jalan: sudo systemctl status mysql (Linux) atau cek di XAMPP/Laragon. Kalau mati, start dulu.
  2. Samakan .env dengan realita: host, port, nama database (database-nya harus sudah dibuat!), username, password.
  3. Ingat aturan Sail/Docker: dari dalam container pakai nama service (mysql); dari luar (artisan di host) pakai 127.0.0.1.
  4. Clear config cache: php artisan config:clear setiap habis ubah .env. Lalu php artisan config:cache lagi untuk production.
  5. Tes koneksi mentah: mysql -h 127.0.0.1 -u root -p. Kalau ini saja gagal, masalahnya di server database, bukan di Laravel.