#Как проявляется проблема и где искать причину
Соединение по Unix-сокету и TCP — два разных канала подключения MySQL. Клиент может успешно входить через localhost, но получать Connection refused по 127.0.0.1 из-за bind_address, skip_networking, другого порта или сетевого правила.
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| TCP отключён или ограниченMySQL слушает только сокет либо другой интерфейс | mysql -h localhost работает, -h 127.0.0.1 нет | Проверить bind_address и сеть |
| Путь TCP заблокированСлужба слушает, но сеть не пропускает пакеты | На сервере локальный TCP работает, удалённый нет | Проверить безопасные firewall-правила |
#Пошаговая диагностика и устранение
- 1. Подтвердите различие вариантов подключенияНа сервере выполните два отдельных входа: mysql --host=localhost обычно использует Unix-сокет, mysql --protocol=TCP --host=127.0.0.1 — TCP. Используйте один и тот же пользователь, пароль вводите по запросу.Linux · Терминал (Bash)КомандаLinux/macOS с mysql CLI; проверяет только TCP и запрашивает пароль.
mysql --protocol=TCP --host=127.0.0.1 --port=3306 --user=appuser --password
- 2. Уточните фактический порт и адресВ работающем mysql-соединении через сокет запросите port, bind_address и skip_networking. Значения зависят от конфигурации и версии; если TCP выключен, причина найдена.
- mysql-клиент, чтениеSQLКомандаmysql-клиент, чтение.
SHOW VARIABLES WHERE Variable_name IN ('port', 'bind_address', 'skip_networking');
- 3. Проверьте слушающий порт на хостеВ Linux-терминале посмотрите TCP LISTEN на целевом порту; если ничего нет, сервер не слушает этот порт. Если слушает 127.0.0.1, удалённые подключения туда не попадут.
- Linux; sudo для показа имени процесса, данные не меняетLinux · Терминал (Bash)КомандаНужен sudoLinux; sudo для показа имени процесса, данные не меняет.
sudo ss -ltnp "sport = :3306"
- 4. Отделите сетевую проблему от доступаОшибка Connection refused означает отсутствие слушателя или запрет соединения на сетевом уровне; Access denied после соединения относится уже к учётной записи. Не меняйте пароль при отказе TCP.
- 5. Проверьте параметры службыВ штатном файле конфигурации MySQL найдите bind-address, port и skip-networking (имена и расположение зависят от пакета). Не применяйте одновременно взаимоисключающие значения и не меняйте параметры рабочего экземпляра без копии файла.
- 6. Согласуйте безопасное решениеЕсли приложение на том же сервере, рассмотрите использование сокета либо TCP на loopback. Для удалённого приложения согласуйте частный адрес, firewall с ограничением источников и шифрование, затем испытайте в отдельной среде.
- 7. Повторите проверку после измененияПри согласованном изменении конфигурации после теста перезапустите именно нужную службу в окно обслуживания. Повторите ss и клиентский вход с адреса приложения. Успех — только разрешённые клиенты подключаются, база не доступна публично.
#Как проверить результат
Тестовое TCP-подключение проходит с нужного адреса и отклоняется с неразрешённых; сокет продолжает работать.
#Если исправление не помогло
Если сервер работает в Docker, дополнительно проверьте разницу между портом внутри контейнера и опубликованным на хосте.