不要再在my.cnf里添加initconnect='set names utf8mb4'了,否则一直报ERROR 1184 (08S01): Aborted connection 9080 to db: 'unconnected' user

分类:笔记 日期:2021-05-15 作者:caocaofff 浏览:898

果然是实践出真知,网络上的教程各种复制粘贴坑了不少人啊。

最近准备迁移主机,所以遇到了下面的事情。
理论上迁移一个mysql+php+nginx的博客很简单,文件还原、数据库还原、数据库用户(包括权限)重建、SSL证书重新申请。。。
一套动作下来,发现博客始终无法访问,提示数据库查询错误。

心里纳闷,很不应该啊,于是开始排除问题:
先用博客独立的数据库账户登录,执行show databases;时就出现报错:

No connection. Trying to reconnect...
Connection id:    9080
Current database: *** NONE ***

ERROR 1184 (08S01): Aborted connection 9080 to db: 'unconnected' user: 'xxx' host: 'localhost' (init_connect command failed)

QQ截图20210515181858.png

提示很明显,说init_connect参数里的命令执行失败。
关于这个参数的作用,我引用其他人的描述:

init_connect 是可以动态在线调整的,这样就有了一些其他的用处

经过测试init_connect 是用户登录到数据库上之后,在执行第一次查询之前执行 里面的内容的。 如果init_connect
的内容有语法错误,导致执行失败,会导致用户无法执行查询,从mysql 退出。

init_connect 对具有super 权限的用户是无效的。

也可以看看官方描述:

For users that have the CONNECTION_ADMIN privilege (or the deprecated 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 CONNECTION_ADMIN or SUPER privilege enables them to open a connection and fix the init_connect value.

这段话的大概意思是,当用户具有CONNECTION_ADMIN,SUPER权限用户登录时,是不需要执行init_connect参数的内容的,而不具备这些权限的用户登录时,需要执行init_connect参数的内容,当init_connect参数的内容语句有问题时,就会报错了,这就解释了为什么root用户没有问题,而普通用户发生了问题。

用root用户执行数据库,查询init_connect参数:

show variables like 'init_connect';

QQ截图20210515182652.png

然后直接用普通用户去执行这个参数里的命令,注意,我这里的参数是加了引号的,然后我分别测试不加引号和加引号执行效果:

QQ截图20210515183054.png

马上就发现问题了,居然是引号导致!

这个问题理论上会相当普遍,因为很多教程里在说明如何让mysql支持utf8mb4编码时,都提到要在配置文件my.cnf里加上这么个配置:

init_connect='SET NAMES utf8mb4'

但是也只能在像我这种情况才会发生错误,所以只要在配置文件里把这个配置的引号去掉,然后重启数据库服务就正常了。

评论 (暂无评论)

发表评论

昵称:  
邮箱:  
网址:

验证码:captcha