#Что означает сообщение
Connection refused
Проверьте, запущен ли MySQL, хост, порт и сокет.
#Причины и признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| MySQL остановлен | На адресе нет слушающего MySQL | Проверить службу и журналы |
| Неверный хост | localhost ведёт в другой сокет/контейнер | Проверить DSN и среду клиента |
| Неверный порт | Указан не тот порт экземпляра | Сверить реальную настройку СУБД |
| Файрвол | Путь до DB-host фильтруется сетью | Проверить соединение из контейнера приложения |
#Пошаговое решение
- Отделите отказ TCP от отказа в паролеОшибка
SQLSTATE[HY000] [2002] Connection refusedобычно возникает до аутентификации: по выбранному адресу или сокету никто не принимает подключение. Откройте конфигурацию PDO и проверьтеhost,port,dbnameилиunix_socket; пароль пока не меняйте. Сохраните полный текст без секретных данных.localhostв драйвере MySQL на Unix часто использует Unix-сокет, а127.0.0.1— TCP; это разные способы подключения. - Проверьте MySQL/Percona и адрес прослушиванияНа Linux-сервере выполните
systemctl status mysqlилиsystemctl status mariadbв зависимости от реально установленной службы; затемss -ltnp | grep 3306для TCP, если ожидается порт 3306. На Windows проверьте соответствующую службу через Win+R →services.msc. Если служба не работает, сначала изучите её журнал и свободное место; запускать её снова допустимо только после устранения причины падения. Не удаляйте файлы базы данных. - Проверьте соединение из той же среды, где работает PHPЕсли PHP работает в контейнере,
127.0.0.1означает сам контейнер, а не соседнюю базу: проверьте имя сервиса Docker Compose и сеть. На Unix уточните реальный путь сокета у сервера и в PHP. Для TCP с машины приложения выполнитеnc -vz db.example.local 3306с подстановкой реального хоста; если порт недоступен, выясняйте сетевой маршрут и ограничения доступа. Не открывайте MySQL на весь интернет. - Повторите запрос и проверьте новое сообщениеПосле исправления хоста/службы выполните тест подключения с отдельной учётной записью приложения и запрос
SELECT 1. Если ошибка сменилась наAccess denied for user, TCP уже доступен: отдельно проверяйте пользователя, пароль и разрешённый хост, не смешивая причины. Удалите временные отладочные скрипты и не выводите DSN с паролем на публичную страницу.
#На что обратить внимание
Не открывайте 3306 всему интернету и не подставляйте root в веб-приложение. Для контейнеров учитывайте, что localhost относится к текущему контейнеру, а не к хосту БД.