MySQL Connection Refused Error

User
SQLSTATE[HY000] [2002] Connection refused (Connection: mysql, SQL: select * from `sessions` where `id` = hZfPL6A6qqYZjl2QZWsUAW3orXDcmaVJQAhIIob2 limit 1)
Assistant
The `SQLSTATE[HY000] [2002] Connection refused` error typically occurs when your Laravel application is unable to connect to the MySQL database. Here are some common causes and their solutions:

### **1. Database Configuration Issue**
– **Check `.env` file:** Ensure that the database credentials are correct in your `.env` file:

DB_CONNECTION=mysql
  DB_HOST=127.0.0.1
  DB_PORT=3306
  DB_DATABASE=your_database_name
  DB_USERNAME=your_username
  DB_PASSWORD=your_password

– If you're using Docker, the `DB_HOST` should match the service name in your `docker-compose.yml`, e.g., `DB_HOST=mysql`.

### **2. MySQL Service Not Running**
– If MySQL is installed locally or in Docker, ensure the service is running:

sudo service mysql start   # For local setups
  docker-compose up          # For Docker setups

– You can check if MySQL is running on the expected port (3306 by default):

netstat -tlnp | grep 3306

### **3. Incorrect Host in Docker**
– If using Docker, confirm the service name in `docker-compose.yml` matches `DB_HOST`. For example:

services:
    mysql:
      image: mysql:8
      container_name: mysql

Here, `DB_HOST` should be `mysql`.

### **4. Firewall or Network Issues**
– Ensure that the port used by MySQL (3306 by default) is open and accessible.

### **5. Socket Issue**
– If using `localhost` instead of `127.0.0.1`, Laravel may attempt to use a Unix socket. Either switch to `127.0.0.1` or check the MySQL socket configuration in your `my.cnf` file.

### **6. Debugging Tips**
– Test connection manually:

mysql -u your_username -p -h 127.0.0.1 your_database_name

– Run `php artisan config:clear` and `php artisan cache:clear` to ensure your Laravel app is using the updated `.env` configuration.

If you are using Docker and MySQL in your setup, check the logs of your MySQL container for errors:

docker logs mysql

Let me know if you need help troubleshooting any specific part!

User
version: '3.8'

services:
app:
build:
context: .
dockerfile: Dockerfile
container_name: laravel_app
volumes:
– ./shareyourthoughts:/var/www/html
networks:
– laravel_network
depends_on:
– db
ports:
– "8080:80" # Change this to the desired host port

db:
image: mysql:8.0
container_name: laravel_db
restart: always
environment:
MYSQL_DATABASE: laravel
MYSQL_USER: laravel
MYSQL_PASSWORD: password
MYSQL_ROOT_PASSWORD: rootpassword
volumes:
– db_data:/var/lib/mysql
– ./init-scripts:/docker-entrypoint-initdb.d
networks:
– laravel_network

adminer:
image: adminer
container_name: adminer
restart: always
ports:
– "8081:8080" # Change this to the desired host port for Adminer
networks:
– laravel_network

node:
image: node:latest
container_name: node
working_dir: /var/www/html/resources/js # Set working directory to the root of your Laravel app
volumes:
– ./shareyourthoughts:/var/www/html # Mount the entire Laravel project
command: ["npm", "run", "dev"] # Keep the container running
ports:
– "5173:5173" # Expose Vite's port
networks:
– laravel_network
environment:
– NODE_ENV=development
– VITE_HOST=0.0.0.0
– VITE_PORT=5173

networks:
laravel_network:
driver: bridge

volumes:
db_data:

Assistant
Based on your `docker-compose.yml` file, here are the steps to troubleshoot and fix the `SQLSTATE[HY000] [2002] Connection refused` issue:

### **1. Check `DB_HOST` in `.env` File**
In your setup:
– The MySQL service is named `db` in your `docker-compose.yml`. Laravel resolves `DB_HOST` to the container name or service name in Docker.

Ensure your `.env` file has:

DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=password

### **2. MySQL Service Health**
Run the following to confirm that the `db` service is running and healthy:

docker-compose ps

Look for the status of `laravel_db`. It should be `running` and not restarting. If it's restarting, check the logs:

docker logs laravel_db

Ensure there are no issues with the `MYSQL_ROOT_PASSWORD`, `MYSQL_DATABASE`, `MYSQL_USER`, or `MYSQL_PASSWORD`.

### **3. Clear Laravel Cache**
If the `.env` file was updated, clear the configuration cache:

docker exec laravel_app php artisan config:clear
docker exec laravel_app php artisan cache:clear

### **4. Validate Connection from Laravel Container**
Enter the `laravel_app` container and test the database connection:

docker exec -it laravel_app bash

Inside the container, use the MySQL client to connect:

mysql -u laravel -p -h db laravel
# Enter the password: password

If you can connect, Laravel should also be able to connect.

### **5. Ensure Networking**
Your services are on the same Docker network (`laravel_network`), so Laravel should be able to resolve the hostname `db`. Confirm this by inspecting the network:

docker network inspect laravel_network

Look for both `laravel_app` and `laravel_db` in the connected containers.

### **6. Restart Docker Compose**
After making changes, restart the containers to apply them:

docker-compose down
docker-compose up -d

### **7. Debugging Tips**
If the error persists, check:
– Laravel logs:

docker exec laravel_app tail -f /var/www/html/storage/logs/laravel.log

– MySQL logs:

docker logs laravel_db

Let me know how it goes!

User
docker ps
adminer adminer "entrypoint.sh php -…" adminer 26 hours ago Up 11 minutes 0.0.0.0:8081->8080/tcp
laravel_app laravel-apache-vue-app "docker-php-entrypoi…" app 26 hours ago Up 10 minutes 0.0.0.0:8080->80/tcp
laravel_db mysql:8.0 "docker-entrypoint.s…" db 10 days ago Up 11 minutes 3306/tcp, 33060/tcp
Assistant
Your `docker ps` output shows that all the containers (`adminer`, `laravel_app`, and `laravel_db`) are up and running. However, the `laravel_db` container isn't exposing port 3306 to the host machine, which is fine for internal Docker communication. Here’s how to proceed based on the `SQLSTATE[HY000] [2002] Connection refused` error:

### **1. Verify Database Connectivity**
Run the following to confirm Laravel can connect to the `laravel_db` container internally:

#### **Step 1: Access the Laravel container**

docker exec -it laravel_app bash

#### **Step 2: Test the database connection**
Once inside the container, use the `mysql` client:

mysql -h db -u laravel -p laravel
# Enter the password: password

If this connects successfully, the database is reachable from the `laravel_app` container, and the issue might be Laravel's configuration.

### **2. Check `.env` Configuration**
Ensure the `.env` file in your Laravel project has the following:

DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=password

Clear Laravel's configuration cache to apply changes:

docker exec laravel_app php artisan config:clear
docker exec laravel_app php artisan cache:clear

### **3. Check Database Logs**
Check the `laravel_db` logs for any errors:

docker logs laravel_db

If there are errors, they might indicate issues with user credentials or database initialization.

### **4. Test Adminer Access**
Visit [http://localhost:8081](http://localhost:8081) in your browser to access Adminer. Use these credentials:
– **Server:** `db` (not `localhost` because Adminer communicates via Docker network)
– **Username:** `laravel`
– **Password:** `password`
– **Database:** `laravel`

If you can log in, the database is working correctly.

### **5. Restart Docker**
If everything appears correct but the error persists, restart Docker to refresh all services:

docker-compose down
docker-compose up -d

### **6. Debug Laravel Logs**
Check Laravel's log file for more detailed error information:

docker exec laravel_app tail -f /var/www/html/storage/logs/laravel.log

Let me know if the problem persists or if you encounter additional errors.

Leave a Comment

Your email address will not be published. Required fields are marked *