Из-за временных ограничений на территории РФ наблюдаются проблемы с оплатой. Если платёж не проходит, оставьте запрос в службу поддержки.Служба поддержки работает 24/7 — мы всегда на связи по вопросам хостинга и серверов.Открыт прием заявок на аренду выделенных серверов и размещение оборудования в дата-центре.Напоминаем: рекомендуем включить резервное копирование для дополнительной защиты данных.Доступна новая линейка VPS/VDS с NVMe-дисками и увеличенной производительностью.Технические работы на части серверов завершены. Все сервисы работают в штатном режиме.
Статья7 мин чтенияПросмотры16

Как проверить подключение к MySQL и не спутать доступность с правами

Проверяем соединение, вход и чтение таблицы по отдельности. Реальный стенд MySQL 8.0.46 показывает различия между ошибками 2003, 1045 и 1142 и успешным ping.

Комментарии 0

Подключение сетевого кабеля к серверу
В этой статье

Сообщение сайта об ошибке базы данных не объясняет, на каком этапе возник отказ. Сервер может быть доступен по сети, но отклонять пользователя. Или вход проходит, а у аккаунта нет нужных разрешений. Проверять эти уровни следует отдельно и из той среды, где работает приложение.

Уточните параметры подключения

Команды ниже предназначены для клиентов MySQL 8.x. Используйте согласованный диагностический аккаунт и фактические адрес и порт сервера. Имя diagnostic_user условное. Отдельный -p запросит пароль в терминале: не дописывайте его в команду и не включайте в переписку.

Введите имя или IP сервера, затем порт. При пустом ответе для порта пример использует 3306; если у приложения другое значение, укажите его:

read -r MYSQL_HOST

read -r MYSQL_PORT

MYSQL_PORT=${MYSQL_PORT:-3306}

mysqladmin --protocol=TCP --connect-timeout=5 -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u diagnostic_user -p ping

printf 'exit=%s\n' "$?"

Читайте код завершения сразу после команды: любой следующий запуск заменяет значение $?. Не используйте один код ping как проверку пароля.

Почему нужно явно выбрать TCP и порт, объясняет документация MySQL о параметрах соединения. На Unix имя localhost без явного протокола обычно выбирает сокет, даже когда указан порт.

Явный TCP помогает не спутать проверку сетевого соединения с подключением через локальный Unix-сокет. Если приложение использует сокет, его нужно проверять отдельно с соответствующими параметрами.

Важная особенность ping

У mysqladmin ping успешный код завершения возможен даже при ответе об отказе в доступе: сервер ответил, а значит проверка его доступности достигла цели. Это не означает, что пароль верный или что приложение получило доступ к базе.

Это поведение прямо описано в руководстве mysqladmin: при отказе в доступе ping может завершиться с кодом 0. Переходите к проверке входа через mysql.

Поэтому читайте сообщение целиком. Отказ в аутентификации, отсутствие соединения и тайм-аут — разные результаты. Не объединяйте их в одно утверждение «база лежит» и не меняйте пароль, пока не установлено, какой аккаунт и способ подключения реально используются.

Проверьте вход и простой запрос

Для проверки аутентифицированного соединения:

mysql --protocol=TCP --connect-timeout=5 -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u diagnostic_user -p --batch --raw -e 'SELECT 1;'

printf 'exit=%s\n' "$?"

Запрос не обращается к прикладной таблице. Его успех подтверждает вход и выполнение простого SQL, но не права на таблицы магазина. Для следующего этапа нужен заранее выбранный запрос чтения к нужной базе с минимальным набором разрешений.

Удалённое подключение должно использовать принятую в проекте защиту соединения. Если она предусматривает TLS и проверку имени по доверенному центру, сохраняйте эти параметры и в диагностике. Не ослабляйте проверку шифрования ради успешного теста.

Четыре результата на реальном стенде

2 октября 2026 года мы воспроизвели проверки на отдельном Linux-стенде: сервер, mysql и mysqladmin версии 8.0.46-0ubuntu0.24.04.3. Использовались только вымышленные данные, TCP на 127.0.0.1 и временный порт. Соединение с запущенным сервером было зашифровано. Это пример диагностики, а не измерение доступности рабочего сайта; ветка MySQL 8.4 сверена по документации, но в этом опыте не запускалась.

Сервер не принимает TCP-соединение

До запуска стендового сервера клиент не смог установить TCP-соединение. Код mysql — 1:

ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1:58345' (111)

ERROR 2003 означает, что клиент не подключился к указанному адресу и порту. В нашем опыте процесс ещё не работал. На другом сервере нужно различать отказ и тайм-аут, затем проверить адрес, порт, слушающий процесс и сетевые правила. Одно такое сообщение не доказывает, что потеряна база данных.

Сервер отвечает, но вход запрещён

После запуска сервера мы ввели неправильный пароль. mysqladmin ping сообщил Access denied, но завершился с кодом 0. Та же попытка входа через mysql с SELECT 1 завершилась с кодом 1:

ERROR 1045 (28000): Access denied for user 'diagnostic_user'@'127.0.0.1' (using password: YES)

ERROR 1045 отделяет отказ в доступе от отсутствия сетевого ответа. В стенде причиной был намеренно неверный пароль; в реальной системе код сам по себе не доказывает именно ошибку пароля. Нужно сверить выбранный аккаунт, источник подключения и способ аутентификации, сохраняя параметры защиты соединения.

Вход и простой запрос успешны

С правильным паролем SELECT 1 завершился с кодом 0 и вернул столбец 1 со значением 1. Это подтверждает аутентифицированное соединение и простой запрос. Прикладная таблица в этом тесте не читалась.

Вход успешен, но чтение таблицы запрещено

Этому же аккаунту разрешили чтение одной синтетической таблицы, а на другую разрешения не дали. Запрос к защищённой таблице:

SELECT id FROM diagnostic_lab.protected_rows LIMIT 1;

ERROR 1142 (42000) at line 1: SELECT command denied to user 'diagnostic_user'@'127.0.0.1' for table 'protected_rows'

mysql завершился с кодом 1, хотя вход и SELECT 1 уже были успешны. Запрос к разрешённой таблице readable_rows вернул id=1 и код 0. Для своего приложения выберите с администратором небольшой запрос чтения к нужной таблице: название diagnostic_lab относится только к нашему стенду.

Различия между отказом входа и запретом операции приведены в справочнике серверных ошибок MySQL. При ERROR 1142 проверяйте конкретное действие и объект, а не меняйте пароль и не выдавайте все права ради зелёного теста.

Какой аккаунт принял сервер

После успешного входа выполните запросы в этой же сессии mysql. Они показывают версию сервера, аккаунт, выбранный при аутентификации, и назначенные ему разрешения:

SELECT VERSION() AS server_version, CURRENT_USER() AS authenticated_account;

SHOW GRANTS;

На стенде сервер вернул версию 8.0.46-0ubuntu0.24.04.3 и diagnostic_user@127.0.0.1. SHOW GRANTS показал SELECT только на diagnostic_lab.readable_rows. Поэтому отказ чтения protected_rows был ожидаемым. В вашей системе сравните результат с аккаунтом приложения; диагностический пользователь с другими разрешениями не заменяет эту проверку.

Для своего аккаунта SHOW GRANTS не требует отдельного SELECT на системную схему mysql. Если права получены через роли, учитывайте и активные роли текущей сессии. Список назначений не заменяет выполнение нужного разрешённого запроса.

Сравните окружение с приложением

Проверка с административного ноутбука может пройти, тогда как контейнер приложения не видит сервер. Сравните адрес, порт, DNS, сетевые ограничения и имя аккаунта. Отдельно учитывайте, что права MySQL зависят не только от имени пользователя, но и от источника подключения.

Пример: локальный тест работает через сокет, а сайт использует TCP на другом адресе. Эти результаты не противоречат друг другу. Нужно повторить именно способ приложения, сохранив его необходимые параметры безопасности и не раскрывая пароль.

Краткая карта проверки

Проверка

Что подтверждает успех

Что проверить отдельно

mysqladmin ping

Сервер отвечает на попытку связи

Аутентификацию и права

SELECT 1

Вход и выполнение простого запроса

Доступ к прикладным таблицам

Запрос чтения к нужной базе

Конкретный разрешённый сценарий чтения

Операции приложения и его окружение

Что передать ответственному специалисту

Достаточно времени, точки проверки, протокола, обезличенного аккаунта и точного класса ошибки. Не прикладывайте конфигурационный файл с паролем. Если вход успешен, укажите отдельно результат простого запроса и проверки нужной базы.

После исправления выполните тот же тест из окружения приложения и проверьте пользовательский сценарий сайта. Наличие ответа сервера, успешный вход и корректная работа магазина — три разных подтверждения. Такая последовательность помогает найти нужный уровень ошибки без случайного изменения прав и настроек сети.

Обсуждение 0

Делись опытом и задавай вопросы. Комментарии без ссылок появляются после проверки редактором.

Пока никто не написал. Начни обсуждение.