使用Navicat链接proxysql无法进行用户管理

2017/12/28 posted in  MySQL
Tags: 

今天使用Navicat链接proxysql修改后端数据库用户权限的时候,莫名其妙的出现了一个报警

这个问题在之前并没有遇到过,看这个描述,因该是找不到password字段,初步的猜测是在proxysql中设置的mysql版本号和实际连接的mysql版本号不一致,而恰巧这两个版本中记录mysql用户信息的表结构也不一致,导致Navicat根据错误的版本号使用了错误的查询语句,最后导致查询报错。

随后我查询的proxysql中标记的版本号,和后端连接的mysql的版本号,发现这两个值确实不一致,而直接连接后端的数据库访问用户管理项的时候,也没有报错。

那么事情就好办了,修改一下proxysql的mysql-server_version然后load mysql variables to run;,完结,撒花~

但是事情永远不可能向你想象中的那么顺利,load之后,报错依旧。

这。。。

好,祭出牛刀,tcpflow

tcpflowtcpdump差不多,都是抓包的,但是个人感觉比tcpdump好用

怎么安装就不说了,我本地是ArchLinux,直接yaourt就可以了,CentOS的我以后可能会写篇文章单独讲。

直接上命令,查看发往proxysql的流量

$ sudo tcpflow -c -p -i any dst port 3306

于是可以看到,当我们在Navicat上点击用户表单的时候,会向mysql发送一条命令

SELECT user, host, password, ssl_type, ssl_cipher, x509_issuer, x509_subject, max_questions, max_updates, max_connections, super_priv, max_user_connections FROM mysql.user ORDER BY user

这里会查询一个password字段,而当我们直接连接后端的mysql节点的时候,发送的请求是

SELECT user, host, authentication_string, ssl_type, ssl_cipher, x509_issuer, x509_subject, max_questions, max_updates, max_connections, super_priv, max_user_connections, plugin, password_expired, password_lifetime FROM mysql.user ORDER BY user

注意,这里已经没有了password字段,取而代之的是authentication_string字段,这就是5.6版本和5.7版本的区别。

但是我明明已经将proxysql中的版本号改掉,并且load了,但是为什么没有生效?!

好吧,可能是bug吧,事实上proxysql虽然号称可以试试修改配置项,但是实际操作中配置项修改后不能实时生效的绝对不知这一处,比如修改监听端口就需要重启服务才能生效。

那么我们保存配置save mysql variables to disk;

然后重启服务

$ service proxysql restart

再次用Navicat访问用户表单,终于正常了。

整个总结下来就两个字坑爹