一、场景描述
在用navicat连接linux服务器端的mysql时,连接失败,所以网上查找各种资料,先给mysql授权,使所有ip都可以访问,下面是授权过程:
1、进入mysql命令:mysql -uroot -proot
2、进入mysql数据库:use mysql;
3、授权:grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option; 注意,后面那个root是我的密码,你的如果不是可能会略有不同。
这些都做完,我利用navicat连接mysql还是连接不上,但是我ping 我的linux服务器地址是没问题的,telnet ip地址 端口号 也是没问题的,这个问题就很奇怪。
二、分析原因
于是我网上查找资料开始分析问题,首先查看mysql数据库中的user表,看看里面的host(端口)和user(root用户)是不是开放正确,下面的查询过程。
mysql> select user,host from user; +---------------+--------------+ | user | host | +---------------+--------------+ | root | % | | root | * | | root | 192.168.39.1 | | mysql.session | localhost | | mysql.sys | localhost | | root | localhost | +---------------+--------------+ 6 rows in set (0.00 sec)
注意:select user,host from mysql.user;这个查询语句是在mysql数据库中的,首先要sue mysql;否则会报错。
通过查询端口号和用户,我发现我的用户和端口号很神奇,网上大部分人的用户对应的端口号都是 root %,还有一些乱七八糟的用户对应端口,就是没有 (root *)这个组合,
查找资料了解到,( root %)组合中的% 是代表所有的ip都可以访问root用户,但是(root *)这个组合网上没见过
于是我猜测可能是我在授权的时候,输入错误多授权了一次,因此产生了错误,它分辨不清楚。
三、解决方式
上面分析到可能是用户分配问题,于是我删除(root *)这个组合,下面是删除过程
mysql> drop user 'root'@'*'; Query OK, 0 rows affected (0.01 sec) mysql> select t.host,t.user from user t; ERROR 1046 (3D000): No database selected mysql> select host,user from user; ERROR 1046 (3D000): No database selected mysql> use mysql; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> select host,user from user; +--------------+---------------+ | host | user | +--------------+---------------+ | % | root | | 192.168.39.1 | root | | localhost | mysql.session | | localhost | mysql.sys | | localhost | root | +--------------+---------------+ 5 rows in set (0.00 sec) mysql>
注意:drop user 'root'@'*';这个是删除用户的命令,我删除之后再次查看,确实没有了(root *)这个组合。
这个时候我再次用navicat连接mysql,发现连接成功,问题解决。