运行状况检查导致“读取通讯数据包出错”消息

时间:2018-11-14 12:01:03

标签: mysql bash netcat health-monitoring

我正在使用以下运行状况检查来查看MySQL服务器的3306端口是否打开。

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

它工作正常,但不久前MySQL开始在每次检查后打印警告:

[Note] Got an error reading communication packets

是否可以在不触发上述消息的情况下检查端口是否打开?运行状况检查每隔几秒钟就会执行一次,导致邮件向日志输出发送垃圾邮件。

2 个答案:

答案 0 :(得分:1)

这里有同样的问题。有一种方法可以省略注释:

SET GLOBAL log_error_verbosity=2;

请注意,它可能会为您的情况隐藏不需要的笔记。

答案 1 :(得分:1)

当我使用fsockopen打开端口3306的套接字,然后断开它而不发送任何数据时,得到的日志消息也相同。

由于MySQL期望在连接打开后会接收到一些数据包,因此如果未提供任何数据包,它将在错误日志中发出“ [Note]读取通信数据包时出错”。

与其打开和关闭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,因为这意味着服务器正在运行,但是拒绝了连接,这与服务器未运行不同。“

虽然不必指定用户名和密码,但这样做可能会导致错误日志中出现“ [Note]用户'user'@'host'拒绝访问(使用密码:否)”消息。解决方法是,在MySQL中创建一个匿名用户,并且不对任何数据库授予任何权限。

上面的命令丢弃所有输出,而只是回显退出代码。