Знание должно быть доступно!

Путь /Программирование/Базы дынных/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 просто не слушает этот интерфейс.

Как это проверить и исправить?

  1. Посмотри 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 или контейнер.

  1. Проверь, что в 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’ом.