MySQL Troubleshooting January 15, 2025 10 min read

MySQL Connection Refused Fix: Solve "Can't connect to MySQL server" Error

Complete troubleshooting guide to fix MySQL connection refused errors. Step-by-step solutions for common connection issues including ports, firewalls, and permissions.

Common MySQL Connection Error Messages

If you're seeing any of these errors, you're in the right place:

ERROR 2002 (HY000): Can't connect to MySQL server on 'localhost' (10061)
ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.1.100' (111)
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet'

These errors have different root causes but share common troubleshooting steps. Let's fix them systematically.

Diagnostic Checklist

Before diving into fixes, gather this information:

1 Is MySQL Running?

# Linux (systemd)
sudo systemctl status mysql

# Linux (older systems)
sudo service mysql status

# macOS
brew services list | grep mysql

# Check process list
ps aux | grep mysql

If MySQL isn't running, that's your problem. Jump to the "MySQL Not Running" section below.

2 Which Port is MySQL Using?

# Check MySQL configuration
grep port /etc/mysql/my.cnf

# Or check what MySQL is actually listening on
sudo netstat -tlnp | grep mysql
# or
sudo ss -tlnp | grep mysql

Default port is 3306. If MySQL is on a different port, you must specify it when connecting.

3 What's the Exact Error?

Try connecting and copy the full error message:

mysql -u root -p -h localhost

# Or for remote connection
mysql -u username -p -h 192.168.1.100

Solution 1: MySQL Service Not Running

The most common cause of connection refused is MySQL simply not running.

Start MySQL Service

# Ubuntu/Debian
sudo systemctl start mysql
sudo systemctl enable mysql  # Auto-start on boot

# CentOS/RHEL
sudo systemctl start mysqld
sudo systemctl enable mysqld

# macOS (Homebrew)
brew services start mysql

If MySQL Won't Start

Check error logs for details:

# Ubuntu/Debian
sudo tail -100 /var/log/mysql/error.log

# CentOS/RHEL
sudo tail -100 /var/log/mysqld.log

# macOS (Homebrew)
tail -100 /usr/local/var/mysql/*.err

Common startup failures:

Manage MySQL Without Terminal

VPS Commander provides a visual interface for managing MySQL—start/stop services, view logs, configure settings, and troubleshoot issues without SSH commands.

Try VPS Commander Free

Solution 2: Firewall Blocking Connection

Firewalls often block MySQL's default port 3306.

Check if Port is Open

# From the server itself
telnet localhost 3306

# From remote machine
telnet your-server-ip 3306

If connection is refused, check firewall rules:

Ubuntu/Debian (UFW)

# Check status
sudo ufw status

# Allow MySQL port
sudo ufw allow 3306/tcp

# Or allow from specific IP only
sudo ufw allow from 192.168.1.0/24 to any port 3306

CentOS/RHEL (firewalld)

# Check firewall status
sudo firewall-cmd --state

# Allow MySQL
sudo firewall-cmd --permanent --add-service=mysql
sudo firewall-cmd --reload

# Or open port directly
sudo firewall-cmd --permanent --add-port=3306/tcp
sudo firewall-cmd --reload

Cloud Server Firewalls

If you're on AWS, DigitalOcean, Azure, etc., check cloud firewall/security groups:

Security Warning: Never expose MySQL to the entire internet (0.0.0.0/0). Only allow access from specific IPs or use SSH tunneling for remote connections.

Solution 3: MySQL Not Listening on Correct Interface

MySQL might be configured to only accept local connections.

Check Bind Address

# Edit MySQL config
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
# or
sudo nano /etc/my.cnf

Look for the bind-address setting:

# To allow only local connections
bind-address = 127.0.0.1

# To allow remote connections from any IP
bind-address = 0.0.0.0

# Or comment it out entirely
# bind-address = 127.0.0.1

After changing, restart MySQL:

sudo systemctl restart mysql

Verify Listening Interfaces

sudo netstat -tlnp | grep 3306

You should see:

Solution 4: User Permissions

Even if MySQL is running and reachable, user permissions might block access.

Grant Remote Access

MySQL users are tied to specific hosts. root@localhost is different from root@%.

# Connect to MySQL locally
sudo mysql -u root

# Create user with remote access
CREATE USER 'username'@'%' IDENTIFIED BY 'strong_password';
GRANT ALL PRIVILEGES ON database_name.* TO 'username'@'%';
FLUSH PRIVILEGES;

# Or allow from specific IP only (more secure)
CREATE USER 'username'@'192.168.1.100' IDENTIFIED BY 'strong_password';
GRANT ALL PRIVILEGES ON database_name.* TO 'username'@'192.168.1.100';
FLUSH PRIVILEGES;

Check Existing User Hosts

SELECT user, host FROM mysql.user;

If you see root@localhost but not root@%, root can only connect locally.

Change Existing User Host

# Update existing user to allow remote access
UPDATE mysql.user SET host='%' WHERE user='username' AND host='localhost';
FLUSH PRIVILEGES;

Best Practice: Instead of using '%' (any host), create users for specific IPs or subnets: 'username'@'192.168.1.%' allows connections from 192.168.1.0-255.

Solution 5: Wrong Connection Details

Double-check your connection parameters:

Common Mistakes:

1. Wrong Port

# If MySQL is on non-standard port (e.g., 3307)
mysql -u username -p -h localhost -P 3307

2. Wrong Host

# Try both localhost and 127.0.0.1
mysql -u root -p -h localhost
mysql -u root -p -h 127.0.0.1

# Try server's actual IP
mysql -u root -p -h 192.168.1.100

3. Socket vs TCP Connection

On Linux, connecting to "localhost" uses Unix socket, while "127.0.0.1" uses TCP:

# Force TCP connection
mysql -u root -p -h 127.0.0.1 --protocol=TCP

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

Solution 6: SELinux Blocking Connection (CentOS/RHEL)

On CentOS/RHEL, SELinux can block MySQL connections:

# Check SELinux status
sestatus

# Allow MySQL network connections
sudo setsebool -P mysql_connect_any 1

# Or temporarily disable to test (NOT for production)
sudo setenforce 0

Solution 7: Too Many Connections

MySQL has a max connection limit:

# Check current connections
SHOW PROCESSLIST;

# Check max connections
SHOW VARIABLES LIKE 'max_connections';

# Increase max connections (in my.cnf)
[mysqld]
max_connections = 200

Restart MySQL after changing:

sudo systemctl restart mysql

Design Databases Visually

SQL Data Builder helps you design, deploy, and manage MySQL databases with drag-and-drop ER diagrams. Auto-generate SQL code and manage connections visually.

Try SQL Data Builder Free

Testing Your Fix

After applying solutions, test the connection:

Local Connection Test

mysql -u root -p -h localhost

Remote Connection Test

# From another machine
mysql -u username -p -h your-server-ip

# Or use telnet to test port
telnet your-server-ip 3306

Connection from Application

Test with a simple script (Python example):

import mysql.connector

try:
    conn = mysql.connector.connect(
        host="your-server-ip",
        user="username",
        password="password",
        database="database_name"
    )
    print("Connection successful!")
    conn.close()
except mysql.connector.Error as err:
    print(f"Error: {err}")

Prevention Tips

1. Document Your Configuration

Keep notes on:

2. Use SSH Tunneling for Remote Access

Instead of exposing MySQL to the internet:

# Create SSH tunnel (forwards local 3306 to remote MySQL)
ssh -L 3306:localhost:3306 user@remote-server

# Then connect to localhost
mysql -u username -p -h 127.0.0.1

This is much more secure than opening port 3306 to the internet.

3. Monitor Connection Health

# Check connection status
SHOW STATUS LIKE 'Threads_connected';
SHOW STATUS LIKE 'Aborted_connects';

High aborted connects indicates connection issues (firewall, permissions, etc.).

4. Enable Slow Query Log

Helps diagnose performance issues masquerading as connection problems:

# In my.cnf
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow-query.log
long_query_time = 2

Quick Troubleshooting Checklist

Work through this list systematically:

  1. ✓ Is MySQL service running? (systemctl status mysql)
  2. ✓ Is MySQL listening on port 3306? (netstat -tlnp | grep 3306)
  3. ✓ Is firewall allowing port 3306? (ufw status or firewall-cmd --list-all)
  4. ✓ Is bind-address set correctly? (Check my.cnf)
  5. ✓ Does user have permission from this host? (SELECT user,host FROM mysql.user)
  6. ✓ Are connection details correct? (host, port, username, password)
  7. ✓ Is SELinux blocking? (CentOS/RHEL only)
  8. ✓ Too many connections? (SHOW PROCESSLIST)

Still Stuck? Check MySQL error log (/var/log/mysql/error.log) for specific error messages. The log often reveals the exact issue.

Conclusion

MySQL connection errors are frustrating but almost always fixable. The key is systematic troubleshooting: verify the service is running, check firewall rules, confirm bind address settings, and validate user permissions.

Most connection issues boil down to one of three things: MySQL isn't running, firewall is blocking the port, or user doesn't have permission from that host. Work through the solutions above, and you'll have MySQL connections working in no time.

Remember: for remote connections, always use SSH tunneling or restrict access to specific IPs. Never expose MySQL directly to the internet with bind-address 0.0.0.0 and no firewall—it's a security nightmare.

Related Guides: Learn more with our MySQL Tutorial, MySQL Backup Guide, and PostgreSQL Tutorial.