MySQL远程访问设置终极方法(7)
The server uses sorting rules that order rows with the most-specific Host values first. Literal host names and IP addresses are the most specific. (The specificity of a literal IP address is not affected by whether it has a netmask, so 192.168.1.13 and 192.168.1.0/255.255.255.0 are considered equally specific.) The pattern ‘%' means “any host” and is least specific. The empty string ” also means “any host” but sorts after ‘%'. Rows with the same Host value are ordered with the most-specific User values first (a blank User value means “any user” and is least specific).
请注意这句话:“The server uses sorting rules that order rows with the most-specific Host values first. Literal host names and IP addresses are the most specific.”
那么,当从本地连接到数据库时,匿名用户将覆盖其他如'[any_username]'@'%'之类的用户。具体匹配过程如下:
在'root'@'localhost'可以匹配'root'@'%',''也可以匹配root,那么'root'@'localhost'也可以匹配''@'localhost'。根据上面的文档显示,主机(host)有比用户名称user更高的匹配优先级,则localhost比%有比更高的匹配优先级。所以,''@'localhost'比'root'@'%'匹配优先级更高,'root'@'localhost'就匹配到了''@'localhost'。根据我们上面的查询结果来看,''@'localhost'的密码为空,与登录时提供的密码123456不匹配。所以,就登录失败了。
说到这里,想必大家已经想到了解决方案:很简单,直接把匿名用户删掉就可以了。
但是,现在的问题时,在本地根本登录不上数据库,更别扯删除数据了。
怎么办?D瓜哥想到了三个解决办法,方法如下:
①、比较扯淡的解决方法,在另外一台电脑或者虚拟机上,远程连接这个数据库
这是我想到的一个比较扯淡的解决方法。既然我们已经允许了远程连接,那么我们就可以在另外一台电脑或者另外一个虚拟机上,远程连接到这个数据库,然后把删除匿名用户。步骤如下:
1.在远程电脑上连接到该数据库。命令如下:
mysql -h192.168.1.119 -uroot -p123456
2.然后,切换到mysql数据库。命令如下:
use mysql
3.删除匿名用户。SQL如下:
delete from user where user='';
4.退出,然后就可以在本地直接登录数据库了。
②、投机取巧的解决办法,在本地使用跳过权限表认证的登录数据库
刚刚在上面的原因解释中已经说过,虽然登录使用的root帐号,但是被数据库处理成了匿名用户。而登录用的帐号和密码与匿名帐号信息不匹配,才导致权限认证没有通过。那干脆就“不走寻常路”,跳过权限认证这一步,直接登录不就OK了。具体做法类似“忘记密码”的处理方式类似,所以,可以参考下面的 忘记数据库密码 。需要注意的时,这里和“忘记数据库密码”的处理不一样的是,这里不需要这里只需要登录进去,登录进去之后需要删除匿名帐号而不是重置密码。至于删除匿名帐号的方法,请参考上面的介绍,这里就不再赘述。
③、最诡异的解决办法,在本地伪装成远程主机来登录数据库
既然如果不知道IP地址,MySQL会默认认为从本地主机登录。那么,我们就指定一下主机,把自己伪装成远程主机登录。D瓜哥认为这个解决办法从MySQL的认证机制上是说得通的。
首先,使用ifconfig查出本地主机的IP(注意,不是127开头的回环地址)。
然后,使用如下命令登录:
- 上一篇:MySQL内存使用之线程独享介绍
- 下一篇:MySQL load语句详细介绍