我使用下面的healthcheck检查mysql服务器的3306端口是否打开。
bash -c 'cat < /dev/null > /dev/tcp/localhost/3306' || exit 1
它工作正常,但不久前mysql开始在每次检查后打印警告:
[Note] Got an error reading communication packets
有没有办法在不触发上述消息的情况下检查端口是否打开?每隔几秒执行一次healthcheck,导致消息向日志输出发送垃圾邮件。
qnyhuwrf1#
当我使用fsockopen打开端口3306的一个套接字,然后断开它的连接而不发送任何数据时,我得到了相同的日志消息。由于mysql希望在连接打开后接收一些数据包,如果没有提供,它会向错误日志发出“[注意]读取通信包时出错”。使用mysqladmin ping和匿名用户检查mysql是否活动,而不是打开和关闭tcp套接字。它的另一个优点是,它检查在端口上侦听的进程是否实际上是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'(使用密码:否)”消息。作为一种解决方法,在mysql中创建一个匿名用户,在任何数据库上都没有授权。上面的命令丢弃所有输出,而只是回显退出代码。
ig9co6j12#
同样的问题。有一种省略注解的方法:
SET GLOBAL log_error_verbosity=2;
请注意,它可能会为您的案例隐藏不需要的注解。
2条答案
按热度按时间qnyhuwrf1#
当我使用fsockopen打开端口3306的一个套接字,然后断开它的连接而不发送任何数据时,我得到了相同的日志消息。
由于mysql希望在连接打开后接收一些数据包,如果没有提供,它会向错误日志发出“[注意]读取通信包时出错”。
使用mysqladmin ping和匿名用户检查mysql是否活动,而不是打开和关闭tcp套接字。它的另一个优点是,它检查在端口上侦听的进程是否实际上是mysql服务器。
在文档中,“如果服务器正在运行,mysqladmin返回的状态是0,如果服务器没有运行,返回的状态是1。即使出现诸如拒绝访问之类的错误,该值也为0,因为这意味着服务器正在运行,但拒绝了连接,这与未运行的服务器不同。“
虽然不需要指定用户名和密码,但这样做可能会导致错误日志中出现“[注意]拒绝用户'user'@'host'(使用密码:否)”消息。作为一种解决方法,在mysql中创建一个匿名用户,在任何数据库上都没有授权。
上面的命令丢弃所有输出,而只是回显退出代码。
ig9co6j12#
同样的问题。有一种省略注解的方法:
请注意,它可能会为您的案例隐藏不需要的注解。