Путь
/Программирование/Базы дынных/MySQL or MariaDB
ПОДКЛЮЧЕНИЕ К MySQL ИЗ ВНЕ: ЧТО ТАКОЕ bind-address И ПРАВА ПОЛЬЗОВАТЕЛЯ
Ты запускаешь MySQL внутри контейнера или на сервере и замечаешь:
- Когда подключаешься с той же машины (localhost / 127.0.0.1) — коннект есть, всё норм.
- Когда пытаешься зайти с другой машины (снаружи) — бац! Ошибка:
(2003, "Can't connect to MySQL server on 'IP_сервера' ([Errno 111] Connection refused)")
Что за хрень?
Почему на localhost коннект есть, а снаружи нет?
MySQL по умолчанию слушает только на интерфейсе localhost (127.0.0.1) — это значит, что принимает подключения только с самой машины, где установлен.
Если попробовать подключиться снаружи (по реальному IP или из другого контейнера/машины), соединение не установится, потому что MySQL просто не слушает этот интерфейс.
Как это проверить и исправить?
- Посмотри bind-address в конфигурации MySQL
Файл: /etc/mysql/my.cnf
или /etc/mysql/mysql.conf.d/mysqld.cnf
Там есть строка:
#bind-address = 127.0.0.1
Если она закомментирована или стоит 127.0.0.1
, значит MySQL слушает только локалхост.
Чтобы база слушала на всех интерфейсах (и внешних IP), надо раскомментировать и заменить на:
bind-address = 0.0.0.0
Это значит: "слушай на всех IP, которые есть на сервере".
После изменения — перезапусти MySQL или контейнер.
- Проверь, что в MySQL есть пользователи с разрешением подключаться с нужного хоста
Выполни в MySQL:
SELECT user, host FROM mysql.user;
Обрати внимание на поле `host` для пользователя, с которым подключаешься.
- `%` — означает разрешение подключаться с любого IP (нужен для внешних подключений, разрешай вдумчиво, там ip нужные ставь)
- `localhost` — только с той же машины
Если у пользователя `host` = `localhost`, то снаружи не подключиться.
Если нужно, создай или измени пользователя:
CREATE USER 'dev'@'%' IDENTIFIED BY 'пароль';
GRANT ALL PRIVILEGES ON *.* TO 'dev'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
Убедись, что порт MySQL (обычно 3306) открыт и проброшен, например nmap
### Итог
- На `127.0.0.1` MySQL слушает локально — подключения есть только с этой машины.
- Чтобы подключаться снаружи — нужно настроить `bind-address = 0.0.0.0` и удостовериться, что в MySQL пользователь разрешён подключаться с `%` (всех IP).
- Пробросить порт и не блокировать его firewall’ом.