使用Navicat链接proxysql无法进行用户管理
2017/12/28
posted in
MySQL
2017/12/28
posted in
MySQL
今天使用Navicat
链接proxysql
修改后端数据库用户权限的时候,莫名其妙的出现了一个报警
这个问题在之前并没有遇到过,看这个描述,因该是找不到password
字段,初步的猜测是在proxysql
中设置的mysql
版本号和实际连接的mysql
版本号不一致,而恰巧这两个版本中记录mysql
用户信息的表结构也不一致,导致Navicat
根据错误的版本号使用了错误的查询语句,最后导致查询报错。
随后我查询的proxysql
中标记的版本号,和后端连接的mysql
的版本号,发现这两个值确实不一致,而直接连接后端的数据库访问用户管理项的时候,也没有报错。
那么事情就好办了,修改一下proxysql的mysql-server_version
然后load mysql variables to run;
,完结,撒花~
…
…
但是事情永远不可能向你想象中的那么顺利,load
之后,报错依旧。
这。。。
好,祭出牛刀,tcpflow
tcpflow
和tcpdump
差不多,都是抓包的,但是个人感觉比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访问用户表单,终于正常了。
整个总结下来就两个字坑爹