#Как проявляется проблема и где искать причину
MySQL может не стартовать с сообщением Address already in use, если порт 3306 занял другой экземпляр MySQL/MariaDB или иная служба. Прежде чем менять порт, определите процесс и проверьте, к какой базе подключаются приложения.
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Второй экземпляр базыНа сервере работает другой mysqld или контейнер | Порт занят mysql/mariadbd или docker-proxy | Определить рабочий экземпляр и владельца |
| Ошибочный параметр запускаСлужба использует порт или bind-address не по плану | Файл настроек отличается от развёртывания | Исправить конфигурацию по плану |
#Пошаговая диагностика и устранение
- 1. Найдите подтверждение конфликта портаНа Linux откройте журнал конкретной службы через systemctl status, а также журнал ошибок MySQL. Ищите Bind on TCP/IP port, Address already in use. Если написано про datadir, проблему нужно решать отдельно.Linux · Терминал (Bash)КомандаПример для Debian/Ubuntu; служба может называться mysqld/mariadb в вашей системе.
systemctl status mysql --no-pager
- 2. Определите слушателя 3306На Linux выполните команду с sudo только для просмотра программы, занимающей порт. Если команды ss нет, используйте штатное средство диагностики вашей ОС.
- sudo нужен для имени чужого процесса; выводит LISTEN и PID, ничего не закрываетLinux · Терминал (Bash)КомандаНужен sudosudo нужен для имени чужого процесса; выводит LISTEN и PID, ничего не закрывает.
sudo ss -ltnp "sport = :3306"
- 3. Сверьте экземпляр и каталог данныхПо PID из вывода изучите описание службы и путь запуска в systemd. Если обнаружен второй MySQL, сравните datadir, параметры порта и назначение базы. Не предполагайте, что второй процесс лишний.
- Linux с systemd и grep, чтение списка; имена зависят от дистрибутиваLinux · Терминал (Bash)КомандаLinux с systemd и grep, чтение списка; имена зависят от дистрибутива.
systemctl list-units --type=service --all | grep -Ei "mysql|maria"
- 4. Если порт занимает Docker, проверьте публикациюПосмотрите Docker-порты, найдите контейнер, публикующий 3306 на хосте. Изнутри Docker-сети базе может не требоваться публикация вообще, но изменение доступности надо согласовать.Linux · Терминал (Bash)КомандаЕсли Docker не используется, пропустите шаг.
docker ps --format "table {{.Names}} {{.Ports}}"
- 5. Выберите вариант без конфликтаЕсли другой экземпляр нужен, назначьте тестовому серверу отдельный порт через проверенный файл конфигурации и обновите host/port у его клиентов. Если экземпляр дублирован ошибочно, выполните плановый останов только после проверки собственника службы.
- 6. Проверьте конфигурацию до перезапускаУбедитесь, что изменение не затронуло рабочий datadir и сервис, что новая пара адрес/порт свободна и доступ ограничен необходимым интерфейсом. После тестового запуска повторите ss, затем подключитесь mysql-клиентом именно к назначенному порту.
- 7. Верните рабочее подключение приложенияЗапустите тестовую операцию чтения и сравните @@hostname, @@port, @@version с ожидаемым экземпляром. Если тест не проходит, верните прежний файл конфигурации и изучите журнал запуска; не запускайте две службы с одним каталогом данных.
#Как проверить результат
У сервера один ожидаемый слушатель на согласованном порту, MySQL запускается, клиенты подключаются именно к нужному экземпляру.
#Если исправление не помогло
Если оба MySQL пытаются использовать один datadir, это отдельный опасный конфликт: немедленно остановите эксперименты и проверьте целостность данных перед любым запуском.