前言



有这么一种情况,你设置了一个账号,一个密码。目的是为了限制用户使用这个账号进行登录,查询指定库 或者 通过这个账号做一个主从。你很确认你的密码是什么,甚至是刚刚设置完,但是你始终无法通过这个密码进行登录或连接



问题原因



数据库是否正常启动


是否指定ip,端口,socket


对登录mysql的安全限制


mysql授权问题(常见问题)




解决方法



<1>如果数据库正常启动,root等账号,是否可本地登录和远程登录

本地都登录不进去,查看日志是否报错,可跳过密码进入数据库,重置权限
仅远程无法登录,查看下一步



<2>是使用数据库工具登录的还是直接使用的命令行
如果使用的工具,配置的ip,端口,账号,密码是否正确
如果使用命令行,是否指定-h ip, -P 端口,-S socket

如果确认都配置正确,查看下一步



<3>如果是远程连接,你的客户端是否能ping通或者连接该数据库的端口(3306?3307?其他?)
如果不可以连接,应该是对数据库服务器的访问限制,查看<4> <5>
如果可以连接,但是提示密码错误,应该是数据库的访问权限问题<6>



<4>登录数据库服务器,查看是否有iptables的限制,限制部分ip访问数据库端口

如果是iptables限制,可设置允许该客户端网络访问

如果没有iptables规则,firewalld也没开。查看下一步





<5>如果不是iptables,而用户无法连接数据库服务器,有可能从vpn设置的限制

查找你的vpn服务器,上修改配置文件并重启

vim /etc/openvpn/server.conf
增加该vpn对这个数据库服务器的访问路由

client-to-client
push "route 10.50.50.50 255.255.255.255 vpn_gateway"

以上ip仅为示例


<6>进入数据库,查看用户的权限

查看你的授权的sql,查看你授权的用户是否还存在着其他网段的授权



示例

已知你的sql为

grant all privileges on *.* to 'cloud'@'%' identified by 'du..ol?2f245@45^%';

而数据库中看到,你授权的用户,还存在一个其他网段的授权

mysql> SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
+-------------------------------+
| query                         |
+-------------------------------+
| User: 'root'@'%';             |
| User: 'ufo'@'10.10.50.%';     |
| User: 'root'@'127.0.0.1';     |
| User: 'root'@'::1';           |
| User: 'cloud'@'%';            |
| User: 'cloud'@'10.50.50.%';   |
| User: 'exporter'@'localhost'; |
| User: 'root'@'localhost';     |
+-------------------------------+
8 rows in set (0.00 sec)


因此是权限设置导致 客户端登录时根据其网段 匹配的规则有误。

把那个网段的规则,也修改一下密码,或取消该网段的授权

grant all privileges on *.* to 'cloud'@'10.50.50.%' identified by 'du..ol?2f245@45^%';
or
drop user 'cloud'@'10.50.50.%';



补充



<1> 当用户从客户端请求登陆时,MySQL将授权表中的条目与客户端所提供的条目进行比较,包括用户的用户名,密码和主机

<2>授权表中的Host字段是可以使用通配符作为模式进行匹配的

<3>授权表中的User字段不允许使用模式匹配,但是可以有一个空字符的用户名代表匿名用户,并且空字符串可以匹配所有的用户名

<4>当user表中的Host和User有多个值可以匹配客户端提供的主机和用户名时,MySQL将user表读入内存,并且按照一定规则排序,按照排序规则读取到的第一个匹配客户端用户名和主机名的条目对客户端进行身份验证

<5>对于Host字段,按照匹配的精确程度进行排序,越精确的排序越前

<6>对于User字段,非空的字符串用户名比空字符串匹配的用户名排序更靠前

<7>User和Host字段都有多个匹配值时,先使用主机名排序最前的条目,再在主机名字段相同时再选取用户名排序更前的条目。因此User和Host字段都有多个匹配值时,主机名最精确匹配的条目被用户对用户进行认证