专栏首页腾讯云数据库专家服务MySQL 案例:init_connect 引发的 Lost connection
原创

MySQL 案例:init_connect 引发的 Lost connection

前言

最近发现一个比较奇特的 Lost connection 问题,详细测试和验证了一下,记录下来。

问题描述

用户反馈连接到数据库之后,执行show database的时候会断开连接。

原因分析

从反馈上来看,用户是可以登录到数据库的,说明网络的连通性,用户名密码方面没有问题,权限方面如果有问题的话,一般也不会有 Lost connection 的报错,MTU 的问题一般也是返回不了结果。光从问题描述上看,感觉这个问题就没什么头绪了。

叫上同事一起看这个问题之后,发现一个不寻常的地方:这个参数实例的 init_connect 参数设置了内容,看起来比较奇怪:innodb_adaptive_hash_index=ON

按个人的经验来看,这个参数一般是会写完整的 SQL 语句,比如set global xxx=xxx,这种直接写参数的可能会有点问题。查了一下官方文档,有如下描述:

A string to be executed by the server for each client that connects. The string consists of one or more SQL statements, separated by semicolon characters. For users that have the SUPER privilege, the content of init_connect is not executed. This is done so that an erroneous value for init_connect does not prevent all clients from connecting. For example, the value might contain a statement that has a syntax error thus causing client connections to fail. Not executing init_connect for users that have the SUPER privilege enables them to open a connection and fix the init_connect value.

可以看到对这个参数的内容描述是 “SQL 语句”,说明这个参数的内容可能被拿来直接执行了。

为了方便检查日志,用自建的 MySQL 5.7.31 测试一下:

mysql> set global init_connect = "sort_buffer_size = 41943040";
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like '%init_conn%';
+---------------+-----------------------------+
| Variable_name | Value                       |
+---------------+-----------------------------+
| init_connect  | sort_buffer_size = 41943040 |
+---------------+-----------------------------+
1 row in set (0.00 sec)

mysql> exit
Bye
root@test-debian:~# mysql -h127.0.0.1 -utest -ptest
...省略...
Server version: 5.7.31-log MySQL Community Server (GPL)
...省略...
mysql> show databases;
ERROR 2013 (HY000): Lost connection to MySQL server during query
mysql>

发现可以复现 Lost connection 现象,说明问题就在这里了,如果是直接执行了语句,那么报错信息可能会记录在 error log:

2020-10-21T06:32:38.520817Z 53620 [Warning] Aborted connection 53620 to db: 'unconnected' 
user: 'test' host: '127.0.0.1' (init_connect command failed)
2020-10-21T06:32:38.520844Z 53620 [Warning] You have an error in your SQL syntax; 
check the manual that corresponds to your MySQL server version for the right syntax 
to use near 'sort_buffer_size = 41943040' at line 1

试一试,如果改成正常的 SQL 语句,看看效果怎么样:

mysql> set global init_connect = "set session sort_buffer_size = 41943040";
Query OK, 0 rows affected (0.00 sec)

mysql> exit
Bye
root@VM-56-136-debian:~# mysql -h127.0.0.1 -utest -ptest
...省略...
Server version: 5.7.31-log MySQL Community Server (GPL)
...省略...
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.00 sec)

mysql> show variables like '%init_conn%';
+---------------+-----------------------------------------+
| Variable_name | Value                                   |
+---------------+-----------------------------------------+
| init_connect  | set session sort_buffer_size = 41943040 |
+---------------+-----------------------------------------+
1 row in set (0.00 sec)

mysql>

PS:腾讯云数据库 MySQL 也会遇到一样的问题,使用的时候需要注意

扩展一下

这个功能也会有一部分 DBA 拿来做一些特殊用途,比如对业务账号做一些限制之类的,参考文档的描述,所有非 super 权限的账号在登录的时候都会执行一次。而 DBA 账号通常会有 super 权限,登录的时候是不会执行 init_connect 记录的命令

解决方案

在 init_connect 参数中设置正确的 SQL 语句。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 技术分享 | 是谁删了表?

    爱可生 DBA 团队成员,负责项目数据库日常问题处理及公司 DMP 平台问题处理,对数据库有强烈的兴趣。认为不会游泳的厨师绝不是一个好数据库工程师。

    爱可生开源社区
  • MYSQL 复杂查询超时连接 lost Error 与 错别字

    最近的错别字是越来越厉害,上一篇开头就是两个错别字,恨得我要死,不检查,并且一边写一边查让写的语句也变得像是 translation的。所以最近在反思,数量和质...

    AustinDatabases
  • MySQL远程连接丢失问题解决方法(Lost connection to MySQL server)

    Mysql错误Lost connection to MySQL server at ‘reading initial communication packet’...

    爱游博客
  • Packet for query is too large (12164278 > 4194304). You can change this value

    Packet for query is too large (12164278 > 41943...

    Java架构师必看
  • mysql 插入 emoji报错1366

    最近做项目需要用到emoji表情,好不容易把前端搞定,提交数据到后台发现无法插入数据库,异常提示如下:

    kirin
  • Mysql配置文件 扩展详细配置(下)

    避免MySQL的外部锁定,减少出错几率增强稳定性。 5以前版本skip-locking,新版本skip-external-locking

    陈不成i
  • MYSQL用法(十九) MySQL中查询时”Lost connection to MySQL server during query”报错的解决方案

    dw_user 表数据量比较大,直接查询速度慢,容易"卡死",导致数据库自动连接超时....

    Java架构师必看
  • MySQL连接数管理

    MySQL 连接状态是数据库中比较重要的一个指标,比如说目前总共有多少个连接、各连接处于什么状态等等,这些连接状态也能从侧面反映出数据库当前运行状况。本篇文章我...

    MySQL技术
  • nodejs的mysql管理

    nodejs要想操作mysql需要安装第三方库--mysql,有了这个模块,操作mysql数据库就变得很容易了。连接mysql可以说有三种方式,分别是普通模式、...

    OECOM
  • 尴尬的bug:一条查询语句让MySQL崩溃

    前几天睡觉前接到前同事的一个信息,说有个奇怪的SQL问题,想让我帮忙看看,给点建议,我以为是一种非常复杂的SQL,他的反馈能让MySQL崩溃。

    jeanron100
  • Mac下遇到 'reading initial communication packet’ 问题

    今天在开发过程中,一个单位跑的好好的项目,在家中的Mac下运行时,遇到了下面这个错误:

    大江小浪
  • 技术分享 | 探究 Druid 连接池探活方式的实现

    爱可生交付服务团队北京 DBA,对数据库及周边技术有浓厚的学习兴趣,喜欢看书,追求技术。

    爱可生开源社区
  • 生产集群spark报错问题

    shuffle write的分区数由上一阶段的RDD分区数控制,shuffle read的分区数则是由Spark提供的一些参数控制。

    Bob hadoop
  • Mysql连接错误:Lost connection to Mysql server at 'waiting for initial communication packet'

    在远程连接mysql的时候,连接不上,出现如下报错: Lost connection to MySQL server at 'waiting for initi...

    洗尽了浮华
  • 不可忽视的MySQL字符集

    墨墨导读:字符集是一组符号和编码。collation是一组用于比较字符集中的字符的规则。

    数据和云
  • 异步IO\数据库\队列\缓存

    到目前为止,我们已经学了网络并发编程的2个套路, 多进程,多线程,这哥俩的优势和劣势都非常的明显,我们一起来回顾下

    hankleo
  • MySQL中的kill命令,你用过吗?

    先来说说这俩语法的概念,第一种kill query pid指的是断开当前线程中正在执行的语句,而不断开线程连接。第二种kill pid的方法指的是断开该线程的连...

    AsiaYe
  • 如何在 Kubernetes 集群中搭建一个复杂的 MySQL 数据库?

    实际生产环境中,为了稳定和高可用,运维团队一般不会把 MySQL 数据库部署在 Kubernetes 集群中,一般是用云厂商的数据库或者自己在高性能机器(如裸金...

    高楼Zee
  • MySQL · 最佳实践 · 如何索引JSON字段

    原文地址: http://mysql.taobao.org/monthly/2017/12/09/

    二狗不要跑

扫码关注云+社区

领取腾讯云代金券