mysql没法外网链接 Host * is not allowed to connect to this MySQL serverphp
在本机登入mysql后,更改"mysql"数据库里的"user"表里的"host"项,从"localhost"改成'%'。mysql
代码以下 linux
mysql>sql
mysql>use mysql;数据库
mysql>select host from user where user='root';安全
mysql>update user set Host='%' where User='root';ide
#查看mysql库中的user表的host值(便可进行链接访问的主机/IP名称)函数
Linux中的mysql,user值为root的,有三条记录
修改了这条有密码的记录,重启mysql服务后,数据库能远程访问。
可是控制台就没法登陆mysql了。
缘由是,user表中其它几条记录影响了,所有删掉,只留下有密码的这一条记录便可。
2018年12月8日,客户用phpStudy,用了上述方法,只剩下一条root的,127.0.0.1没法登陆,用localhost就能够登陆,执行这个命令,其实就是在user表里添加一条记录
grant all privileges on . to 'root'@'127.0.0.1' identified by 'tXkj-8002-vErygood';this
2018年12月9日,在CentOS虚拟机里装好mysql,执行如下语句,物理机192.168.1.21仍是没法访问
grant all privileges on . to 'root'@'%' identified by '123456';
执行了如下语句,才能够访问
grant all privileges on . to 'root'@'192.168.1.21' identified by '123456';3d
缘由以下文所示:
https://www.linuxidc.com/Linux/2015-03/115164.htm
在安装完成MySQL后,咱们一般添加拥有相应权限的普通用户用来访问数据库。在使用用户本地登陆数据库的时候,常常会出现怎么登陆也没法登陆的状况,可是从其余的mysql客户端却能够登陆。
[root@mysql01 ~]# mysql -userver -p123456
ERROR 1045 (28000): Access denied for user 'server'@'localhost' (using password: YES)
本地登陆失败;
[root@mysql02 ~]# mysql -h192.168.47.166 -userver -p123456
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.5.36-log Source distribution
远程登陆成功;
1、登陆后查看mysql.user表的状况
image
能够看到,个人数据库中有server用户和匿名用户localhost;
•server用户的密码是'server'
•匿名用户的密码为空
2、在本机用server用户登陆,发现不用密码能够登陆;
[root@mysql01 ~]# mysql -userver -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.5.36-log Source distribution
Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> SELECT USER(), CURRENT_USER();
+--------------------------+-----------------------+
| USER() | CURRENT_USER() |
+-------------------------+------------------------+
| server@localhost | @localhost |
+-------------------------+-------------------------+
1 row in set (0.00 sec)br/>登陆成功了,使用USER()和CURRENT_USER()两个函数查看所使用的用户。
•USER()函数返回你在客户端登录时指定的用户名和主机名。
•CURRENT_USER()函数返回的是MySQL使用受权表中的哪一个用户来认证你的登陆请求。
这里发现,我使用'server'@'localhost'这个帐户登陆数据库(由于在本地登录时没指定主机,默认是以localhost登陆),可是数据库使用的是''@'localhost'这个帐户来进行登陆认证,而''@'localhost'这个匿名用户是没有密码的,所以我输入空密码登陆成功了。可是登陆后,所对应的用户的匿名用户。
通常在MySQL在安装完毕后,咱们使用mysql_install_db这个脚本生成受权表,会默认建立''@'localhost'这个匿名用户。正是由于这个匿名用户,影响了其余用户从本地登陆的认证。
那么MySQL是如何进行用户身份认证呢?
1、当用户从客户端请求登录时,MySQL将受权表中的条目与客户端所提供的条目进行比较,包括用户的用户名,密码和主机。受权表中的Host字段是可使用通配符做为模式进行匹配的,如test.example.com, %.example.com, %.com和%均可以匹配test.example.com这个主机。受权表中的User字段不容许使用模式匹配,可是能够有一个空字符的用户名表明匿名用户,而且空字符串能够匹配全部的用户名,就像通配符同样。 当user表中的Host和User有多个值能够匹配客户端提供的主机和用户名时,MySQL将user表读入内存,而且按照必定规则排序,按照排序规则读取到的第一个匹配客户端用户名和主机名的条目对客户端进行身份验证。
2、排序规则:对于Host字段,按照匹配的精确程度进行排序,越精确的排序越前,例如当匹配test.example.com这个主机时, %.example.com比%.com更精确,而test.example.com比%.example.com更精确。对于User字段,非空的字符串用户名比空字符串匹配的用户名排序更靠前。 User和Host字段都有多个匹配值,MySQL使用主机名排序最前的条目,在主机名字段相同时再选取用户名排序更前的条目。所以,若是User和Host字段都有多个匹配值,主机名最精确匹配的条目被用户对用户进行认证。
了解了这个认证流程,就知道为何server登陆失败了。
使用GaMe在本机登陆数据时,不指定-h参数默认为localhost主机登陆,而在MySQL中有两个匹配的条目:'server'@'%' 和 ''@'localhost'br/>匿名用户可以匹配的缘由上面说过,空字符串能够匹配全部的用户名,就像通配符同样。根据MySQL认证时的排序规则,第一个条目的用户名排序更前,第二个条目的主机名更精确,排序更前。而MySQL会优先使用主机名排序第一的条目进行身份认证,所以''@'localhost'被用户对客户端进行认证。所以,只有使用匿名用户的空密码才能登陆进数据库。就会出现下面的状况了。解决的方法:删除匿名用户(仅仅为了安全也有这个必要)为何root用户不会受影响,而只有普通用户不能从本地登陆?由于mysql_install_db脚本会在受权表中生成'root'@'localhost'这个帐户。一样的,使用root登陆MySQL 时,'root'@'localhost'和''@'localhost'都能匹配登陆的帐户,可是根据排序规则,主机名相同,而用户名非空字符串优先,所以'root'@'localhost'这个条目的排序更靠前。使用root本地登陆是不会被匿名用户遮盖。