MySQL Connection refused: как исправить ошибку подключения к базе данных
Пошаговое руководство по устранению ошибки MySQL Connection refused: проверка службы, порта,bind-address, firewall и прав пользователя.
Симптомы
- ERROR 2003 (HY000): Can't connect to MySQL server
- Connection refused при подключении к MySQL
- MySQL не отвечает на порту 3306
- Host is not allowed to connect to this MySQL server
- Too many connections
Возможные причины
- Служба MySQL не запущена
- MySQL слушает только localhost (bind-address 127.0.0.1)
- Firewall блокирует порт 3306
- Неправильныеgrants для пользователя
- Недостаточно соединений (max_connections)
Пошаговое решение
Проверьте статус службы MySQL
Выполните systemctl status mysql (или mysqld на некоторых системах). Если служба не запущена, выполните sudo systemctl start mysql. Проверьте, что она активна: active (running). Если служба падает при запуске, проверьтеjournalctl -u mysql -xe для причин. Типичные причины падения: повреждённые файлы данных, нехватка места на диске.
systemctl status mysql Проверьте порт и bind-address
Выполните mysqladmin -u root -p processlist для проверки подключения. Если ошибка, проверьте bind-address в /etc/mysql/mysql.conf.d/mysqld.cnf (или /etc/my.cnf). По умолчанию bind-address = 127.0.0.1 — MySQL принимает только локальные подключения. Для удалённых: bind-address = 0.0.0.0. После изменения перезапустите MySQL: sudo systemctl restart mysql.
grep bind-address /etc/mysql/mysql.conf.d/mysqld.cnf Проверьте firewall
Если MySQL работает на удалённом сервере, firewall может блокировать порт 3306. На Ubuntu/Debian: sudo ufw allow 3306/tcp. На CentOS/RHEL: sudo firewall-cmd --add-port=3306/tcp --permanent && sudo firewall-cmd --reload. Проверьте правила: sudo ufw status или sudo firewall-cmd --list-ports. Также проверьте, что облачный firewall (Security Groups в AWS) разрешает порт 3306.
sudo ufw allow 3306/tcp Проверьте grants пользователя
Подключитесь к MySQL: mysql -u root -p. Выполните SELECT user, host FROM mysql.user; для просмотра всех пользователей. Удалённый пользователь должен иметь host '%' или конкретный IP. Создайте пользователя: CREATE USER 'user'@'%' IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON *.* TO 'user'@'%'; FLUSH PRIVILEGES;. Проверьте grants: SHOW GRANTS FOR 'user'@'%';
mysql -u root -p -e "SELECT user, host FROM mysql.user;" Проверьте max_connections
Выполните mysqladmin -u root -p variables | grep max_connections для просмотра лимита. Если количество активных соединений достигло лимита, новые подключения отклоняются. Увеличьте лимит: SET GLOBAL max_connections = 200; (временно). Постоянно: измените параметр в my.cnf и перезапустите MySQL. Также проверьтеSHOW STATUS LIKE 'Threads_connected' для текущего количества.
mysqladmin -u root -p variables | grep max_connections Проверьте логи ошибок
Расположение логов: /var/log/mysql/error.log (Ubuntu) или /var/log/mysqld.log (CentOS). Откройте: sudo tail -100 /var/log/mysql/error.log. Ищите строки с [ERROR] или [Warning]. Типичные ошибки: InnoDB: Unable to lock ./ibdata1 (другой экземпляр работает), Could not open mysql.plugin table. Логи покажут точную причину отказа.
sudo tail -100 /var/log/mysql/error.log Настройте удалённое подключение
Для подключения с удалённого хоста: mysql -u user -p -h IP-сервера -P 3306. Если подключение не удается, выполните telnet IP-сервера 3306 для проверки доступности порта. Если таймаут — проблема в firewall илиbind-address. Если Connection refused — MySQL не слушает этот порт или интерфейс.
mysql -u user -p -h 192.168.1.100 -P 3306 Ошибка MySQL Connection refused означает, что клиент не может установить TCP-соединение с сервером MySQL. Причины: служба не запущена, MySQL слушает только localhost, firewall блокирует порт 3306 или у пользователя нет прав на подключение.
Проверка доступности сервера
Для быстрой проверки выполните telnet localhost 3306. Если таймаут — MySQL не слушает порт или firewall блокирует. Если Connection refused — порт закрыт илиMySQL не запущен. Альтернатива: nc -zv localhost 3306 — более информативный вывод.
Проверка статуса службы
Выполните systemctl status имя-службы для просмотра текущего состояния. Статус active (running) означает, что служба работает. Status failed означает ошибку. Status inactive (dead) — служба остановлена. Для подробностей: journalctl -u имя-службы -xe. Логи покажут причину падения: ошибку конфигурации, недостаток прав или конфликт портов.
Настройка автозапуска
Для автоматического запуска службы при загрузке: sudo systemctl enable имя-службы. Для запуска сейчас: sudo systemctl start имя-службы. Для отключения автозапуска: sudo systemctl disable. Проверьте зависимости: systemctl list-dependencies имя-службы. Если зависимая служба не работает, основная тоже не запустится.
Исправление конфигурации
После изменения конфигурационного файла всегда перезапускайте службу: sudo systemctl restart имя-службы. Проверьте синтаксис конфигурации: для systemd — systemd-analyze verify имя-службы.service, дляnginx — nginx -t. Синтаксические ошибки не позволяют службе запуститься.
Просмотр логов
Логи — основной инструмент диагностики. Используйте journalctl -u имя-службы для просмотра всех логов. journalctl -u имя-службы —since “1 hour ago” — за последний час. journalctl -u имя-службы -f — в реальном времени. Также проверьте /var/log/syslog или /var/log/messages для общих системных логов.
Восстановление после сбоя
Если служба упала и не запускается: sudo systemctl reset-failed имя-службы для сброса ошибки. Затем попробуйте запустить заново. Если не помогает, проверьте права доступа к файлам службы, конфигурации и логам. Убедитесь, что порт не занят другой службой: sudo ss -tlnp | grep порт.
Источники
- stackoverflow.com — проверено 02.06.2026
- stackoverflow.com — проверено 02.06.2026
- dev.mysql.com — проверено 02.06.2026
- dev.mysql.com — проверено 02.06.2026