Базы данных 7 мин чтения

MySQL Connection refused: как исправить ошибку подключения к базе данных

Пошаговое руководство по устранению ошибки MySQL Connection refused: проверка службы, порта,bind-address, firewall и прав пользователя.

MySQLбаза данныхподключениеLinuxсеть

Симптомы

  • 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)

Пошаговое решение

1

Проверьте статус службы MySQL

Выполните systemctl status mysql (или mysqld на некоторых системах). Если служба не запущена, выполните sudo systemctl start mysql. Проверьте, что она активна: active (running). Если служба падает при запуске, проверьтеjournalctl -u mysql -xe для причин. Типичные причины падения: повреждённые файлы данных, нехватка места на диске.

Команда
systemctl status mysql
2

Проверьте порт и 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
3

Проверьте 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
4

Проверьте 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;"
5

Проверьте 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
6

Проверьте логи ошибок

Расположение логов: /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
7

Настройте удалённое подключение

Для подключения с удалённого хоста: 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 порт.

Источники

  1. stackoverflow.com — проверено 02.06.2026
  2. stackoverflow.com — проверено 02.06.2026
  3. dev.mysql.com — проверено 02.06.2026
  4. dev.mysql.com — проверено 02.06.2026