当我通过 mysql 客户端在大表(8GB+)上长时间运行 select 语句时,出现以下错误:
ERROR 2013 (HY000) at line 1: Lost connection to MySQL server during query
ERROR 2006 (HY000) at line 1: MySQL server has gone away
我确信在此期间,与服务器的网络连接不会中断通过并行运行具有较小结果集的类似查询,这不会丢失连接。因此它与结果集的大小有关。
我也检查 AWS 是否有任何日志和监控并且日志和监控指标中都没有连接丢失。
这不是超时。我通过命令行设置了超时,但在达到该超时之前失败了。我还在较小的表上运行了类似的命令,由于消费者速度慢,该命令需要同样长的时间才能完成,但在这种情况下没有收到错误。我还使用以下选项将所有超时更改为 8 小时以防万一:
--init-command='设置@connect_timeout:=28800;设置@net_read_timeout:=28800;设置@wait_timeout:=28800;设置@interactive_timeout:=28800;'
要重现该问题,您可以运行以下命令:
set -o pipefail;
mysql mydatabase --xml --compress --quick --batch --host=myhost --port=42 --user=myuser -p --execute="SELECT * FROM bigtable" | (l=0;while read i; do sleep 1; l=$(($l+1)); done;echo line $l;);
这将在大约 2 小时(最多 3 小时)后持续出现丢失连接错误。while 循环模拟慢速消费者(转换并导出到另一个数据库)。将 sleep 语句参数增加到 2 秒会增加错误发生的时间。小表上不会发生错误。
set -o pipefail;
如果管道的第一部分失败,则命令会失败。由于这里只有一个简单的管道,所以这应该不是必需的,但是为了完整性我添加了它。
我尝试删除 --quick 选项,这样消费者就可以立即开始处理输出,而不必等待整个 select 语句执行完毕。但在这种情况下,连接似乎在某个时候挂起了,我看不到任何错误或进展。
运行它没有管道似乎工作得很好到目前为止没有任何错误。此外使用更快的消费者运行它(没有 sleep 语句)似乎工作正常。
如果您能就如何修复该问题提供建议或者确认您可以重现该问题,那就太好了。
mysql 版本 14.14 发行版 5.7.40
mysql 数据库是 Amazon RDS 上最新的 v.8
答案1
您可能需要增加超时值。
您可以从命令行使用该选项增加等待连接响应的秒数--connect-timeout
。默认值为 10 秒,要增加到 120 秒,请运行以下命令:
mysql -uroot -proot --connect-timeout 120
您也可以在 Workbench 中更改这些参数编辑 → 首选项 → SQL 编辑器:
可以使用以下查询显示服务器中的全局变量:
SHOW VARIABLES LIKE "%timeout";
最有可能有帮助的是connect_timeout
变量。将其值设置为 600 秒:
SET GLOBAL connect_timeout = 600;
您也可以编辑服务器上的 MySQL 配置文件,[mysqld]
如下所示:
[mysqld]
connect_timeout = 600
资料来源: