这次给大家带来怎样处理mysql数据库拒绝访问,处理mysql数据库拒绝访问的注意事项有哪些,下面就是实战案例,一起来看一下。
用wordpress搭博客,数据库采用mysql。为了调试方便,创建账户my_account ,允许它从任意主机访问数据库。
create user `my_account`@'%' identified by 'my_password';copy
修改 wp-config.php 相应配置,注意 db_host 设置为 127.0.0.1。
define('db_user', 'my_account'); // 账号
define('db_password', 'my_password'); // 密码
define('db_host', '127.0.0.1'); // 数据服务地址copy
部署到云服务器上,本地浏览器访问博客,提示数据库拒绝访问(本地连接远程数据没问题),以下为错误日志。
error 1045 (28000): access denied for user 'my_account'@'localhost' (using password: yes)`copy
简单排查后,解决了问题,这里记录下解决方案,以及出错的原因。
解决方案
1、方案一:删除 mysql.user表 中,host字段为 localhost 的匿名账号(账户名为空)。
2、方案二:创建 my_account@localhost 账户,用于本地连接数据库。
笔者采用了方案 一。
首先,确认下 mysql.user 表中是否存在匿名账户。
mariadb [(none)]> select user, host from mysql.user where host = 'localhost' and user = '';
+------+-----------+
| user | host |
+------+-----------+
| | localhost |
+------+-----------+
1 row in set (0.00 sec)copy
接着,删除相应匿名账户,再次尝试登陆,成功。
mariadb [(none)]> drop user ''@'localhost';
query ok, 0 rows affected (0.00 sec)copy
问题分析
为什么匿名账户会导致数据库连接失败?
需要对mysql的账户创建、客户端连接校验有一定的了解。
创建mysql账户
基础语法如下:
create user 账户名@主机 identified by 密码;copy
注意点:(以下用 user 指代账户名,host 指代 主机)
host 表示 允许账户从哪台主机访问数据库。主要用于做安全限制,可以是 主机名、ip地址、%(通配符);
user 允许重复,只要 host 是不同的就行。
当 host 设置为 % 时,表示允许从任意主机连接数据库。
比如,存在两个xiaoming账户,一个允许从本机连接数据库,一个允许从 14.215.177.39 连接数据库。
mariadb [(none)]> select user, host from mysql.user where user = 'xiaoming';
+---------+---------------+
| user | host |
+---------+---------------+
| xiaoming | 14.215.177.39 |
| xiaoming | localhost |
+---------+---------------+
2 rows in set (0.00 sec)copy
匿名账户
也就是 user 为空的账户,可以匹配任意用户名。如下指令创建了匿名账户。
create user ''@'localhost' identified by 'pwd3';copy
身份校验
数据库服务器收到客户端连接,首先会进行身份校验,将 user、host、password 字段,跟 mysql.user 表里的记录进行比较,确认是否合法账户。
这里有个问题:如果 mysql.user表 中存在多条匹配记录,该以哪条记录为准?
答案是“优先级”。大致规则如下:
首先,检查 host 字段。如果有多个 host 符合条件,则选择匹配度最高的记录(ip地址 > 通配符%)。
其次,检查 user 字段。如果有多个 user 符合条件,则选择匹配度最高的记录。匿名用户可以匹配任何用户,因此匹配度最低。
优先级匹配例子
举例,假设本地数据库有如下两个账户(password字段实际非明文)。
+------------+-----------+-----------+
| user | host | password |
+------------+-----------+-----------+
| my_account | % | 123 |
| | localhost | 456 |
+------------+-----------+-----------+copy
运行如下命令,最终登录的账户,匹配的是 第2条 记录。(读者可自行尝试,输入密码123登录失败,输入456登录成功)
mysql -u my_account -pcopy
为什么呢?回顾下匹配的优先级。
首先,检查 host 字段。localhost、% 都符合要求。localhost 匹配度高于 %,因此匹配到第2条记录。
接着,检查 user 字段。第2条记录是匿名账户,可匹配任意user值,因此,第2条记录符合要求。
因此,虽然账户 my_account 的 host字段 为%,但是在本地(数据库所在主机)连接数据库时,因为上述规则的存在,mysql 会认为你是用匿名账户在登录。
my_account 跟匿名账户的密码是不同的,因此密码校验不通过,拒绝访问。
相信看了本文案例你已经掌握了方法,更多精彩请关注其它相关文章!
推荐阅读:
react实现点击选中的li高亮步骤详解
node.js部署启动后台运行forever步奏详解
以上就是怎样处理mysql数据库拒绝访问的详细内容。
