MySQL Linux 客户端超时/保活

MySQL Linux 客户端超时/保活

有没有办法在 Linux 上的命令行 MySQL 客户端中设置 keepalive?

我们的网络最近转移到 VLAN 设置,我们的系统部门不再拥有防火墙的控制权。当权者决定在其防火墙中设置一条规则,如果没有数据通过,则在 30 分钟后终止所有连接(涉及必须跟踪连接和有限资源)。我对此无法控制。

作为服务器管理员和程序员,我的问题是这意味着我在编程时无法在后台运行 mysql 命令行客户端。如果我不发送查询(或以其他方式发送数据),当我在 35 分钟后尝试时,客户端会检测到它不再有连接。我每次都必须重新连接。

在 SSH 中,我可以设置保持连接,以便我可以全天保持连接打开。 mysql 命令行客户端是否有类似的可配置选项?我找不到任何东西,因为“Mysql Keepalive”和类似的搜索都返回编程语言中后端连接的结果。

答案1

您可以设置通用 TCP keepalive,我认为有一个内核设置可以实现这一点。但它们的频率通常要低得多(小时)。有一个TCP 保活指南其中似乎有详细信息。

或者,为什么不直接通过 SSH 建立 MySQL 连接隧道,然后就可以使用 SSH keepalive 了?

$ ssh -L1234:127.0.0.1:3306 -o ServerAliveInterval=300 user@mysql-server
... (in another terminal)
$ mysql -u user -p -h 127.0.0.1 -P 1234

第三种选择是建立一个到您的服务器的隧道(例如,OpenVPN),然后它将处理保持活动(以及透明地重新连接等)。

PS:“我们宝贵的资源”过期的说法已确立的30分钟内的TCP连接是废话。不幸的是——我以前也经历过他们的处境——有些设备也是废话。例如,BCP 142/RFC 5382给出一个最低限度2 小时 4 分钟的时间(并且仅当防火墙无法确定主机是否仍在运行时)。

答案2

如果连接在会话期间丢失,MySQL CLI 客户端默认会自动连接。文档:MySQL 技巧&控制自动重新连接行为

真正的解决方案是与当权者合作,找出适合开发团队成员的解决方案。

当然,这需要一些时间,因此可能需要制定一个临时解决方案。我建议禁用 MySQL 的自动连接 ( --skip-reconnect),并创建一个简单的 bash 脚本来处理重新连接。这不是一个好主意,但可能会有所帮助。

#!/bin/bash

PROGRAM="/path/to/mysql"
ARGS="--skip-reconnect"

while [ 1 ]; do
 $PROGRAM $ARGS
 sleep 1
 echo -n "Lost Connection... Reconnect[Y]"
 read USER_INPUT
 case x$USER_INPUT in
  x)
   echo "Reconnecting..."
   ;;
  x[yY])
   echo "Reconnecting..."
   ;;
  *)
   echo "Stopping..."
   break
   ;;
 esac
done

答案3

您可以使用libkeepalive预加载libkeepalive.so将拦截socket()调用并setsockopt()在返回之前自动使用套接字上您首选的保持活动设置进行调用。

这确实不是要求您重新编译应用程序(在本例中为 MySQL),它是完全透明的。

另请参阅TCP 保活指南

相关内容