Проверка работоспособности, вызывающая сообщения об ошибках при чтении пакетов связи

Я использую следующую проверку здоровья, чтобы увидеть, открыт ли порт 3306 сервера MySQL.

bash -c 'cat < /dev/null > /dev/tcp/localhost/3306' || exit 1

Он работает нормально, но некоторое время назад MySQL начал печатать предупреждения после каждой проверки:

[Note] Got an error reading communication packets

Есть ли способ проверить, открыт ли порт, не вызывая вышеуказанное сообщение? Проверка работоспособности выполняется каждые несколько секунд, в результате чего сообщения выводятся из журнала.

0 ответов

Та же проблема здесь. Есть способ опустить заметки:

SET GLOBAL log_error_verbosity=2;

Обратите внимание, что это может скрыть нежелательные заметки для вашего случая.

Я получал те же сообщения журнала, когда использовал fsockopen, чтобы открыть сокет на порт 3306, а затем отключить его без отправки каких-либо данных.

Поскольку MySQL ожидает получить некоторые пакеты данных после открытия соединения, если они не предоставлены, он выдает сообщение "[Примечание] Получена ошибка при чтении пакетов связи" в журнал ошибок.

Вместо открытия и закрытия TCP-сокета используйте mysqladmin ping с анонимным пользователем, чтобы проверить, жив ли MySQL. Его дополнительное преимущество состоит в том, что он проверяет, действительно ли процесс, прослушивающий порт, является сервером MySQL.

$ mysqladmin ping -h running_host -u anonymous --password=pass &>/dev/null ; echo $?
0

$ mysqladmin ping -h not_running_host -u anonymous --password=pass &>/dev/null ; echo $?
1

Из документации: "Статус возврата от mysqladmin равен 0, если сервер запущен, и 1, если это не так. Это 0 даже в случае ошибки, такой как доступ запрещен, потому что это означает, что сервер запущен, но отказал в соединении., который отличается от того, что сервер не работает ".

Хотя указывать имя пользователя и пароль необязательно, это может привести к появлению сообщений "[Примечание] Доступ запрещен для пользователя 'user'@'host' (using password: NO)" в журнале ошибок. В качестве обходного пути создайте анонимного пользователя в MySQL без грантов для какой-либо базы данных.

Вышеупомянутая команда отбрасывает весь вывод и вместо этого просто отображает код выхода.

Другие вопросы по тегам