江城 恭城 柳江县 洱源县 邮箱 康乐县 阜新市 威信县 云南省 通渭县 茂名市 于都县 台安县 南汇区 青海省 永州市

文章导航安卓资源苹果资源

pc软件新闻网络办公服务器软件评测

安卓应用教程安卓游戏攻略tv资讯综合安卓评测

苹果ios资讯越狱备份教程ios软件教程mac教程

单机游戏角色扮演即时战略其它游戏游戏工具

网游lol周免英雄lol礼包

手游最新动态手游评测手游活动手游问答

您的位置:单机游戏角色扮演 → 怪物猎人世界新装备介绍 怪物猎人世界新装备新系统一览

鸿门宴_记一次MySQL数据库拒绝访问的解决过程

标签:实验田 j j斗地主为什么那么慢

问题背景

用wordpress搭博客,数据库采用MySQL。为了调试方便,创建账户my_account ,允许它从任意主机访问数据库。

CREATE USER `my_account`@"%" IDENTIFIED BY "my_password";

修改 wp-config.php 相应配置,注意 DB_HOST 设置为 127.0.0.1

部署到云服务器上,本地浏览器访问博客,提示数据库拒绝访问(本地连接远程数据没问题),以下为错误日志。

ERROR 1045 (28000): Access denied for user "my_account"@"localhost" (using password: YES)`

简单排查后,解决了问题,这里记录下解决方案,以及出错的原因。

解决方案

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)

接着,删除相应匿名账户,再次尝试登陆,成功。

MariaDB [(none)]> DROP USER ""@"localhost";
Query OK, 0 rows affected (0.00 sec)

问题分析

为什么匿名账户会导致数据库连接失败?

需要对MySQL的账户创建、客户端连接校验有一定的了解。

创建MySQL账户

基础语法如下:

CREATE USER 账户名@主机 IDENTIFIED BY 密码;

注意点:(以下用 User 指代账户名,Host 指代 主机)

  1. Hos大明狂士_2018年最新新闻网t 表示 允许账户从哪台主机访问数据库。主要用于做安全限制,可以是 主机名、IP地址、%(通配符);
  2. User 允许重复,只要 Host 是不同的就行。
  3. 当 Host 设置为 % 时,表示允许从任意主机连接数据库。

比如,存在两个xiaoming账户,一个允许从本机连接数据库,一个允许从 14.215.177.39 连接数据清华大学_2018年最新新闻网库。

MariaDB [(none)]> SELECT User,社保_2018年最新新闻网 Host FROM mysql.user WHERE User = "xiaoming";           
+---------+---------------+
| User    | Host          |
+---------+---------------+
| xiaoming | 14.215.177.39 |
| xiaoming | localhost     |
+---------+-------会声会影_2018年最新新闻网--------+
2 rows in set (0.00 sec)

匿名账户

也就是 User 为空的账户,可以匹配任意用户名。如下指令创建了匿名账户。

CREATE USER ""@"localhost" IDENTIFIED BY "pwd3";

身份校验

数据库服务器收到客户端连接,首先会进行身份校验,将 User、Host、Password 字段,跟 mysql.user 表里的记录进行比较,确认是否合法账户。

这里有个问题:如果 mysql.user表 中存在多条匹配记录,该以哪条记录为准?

答案是“优先级”。大致规则如下:

  1. 首先,检查 Host 字段。如果有多个 Host 符合条件,则选择匹配度最高的记录(IP地址 > 通配符%)。
  2. 其次,检查 User 字段。如果有多个 User 符合条件,则选择匹配度最高的记录。匿名用户可以匹配任何用户,因此匹配度最低。

优先级匹配例子

举例,假设本地数据库有如下两个账户(Password字段实际非明文)。

+------------+-----------+-----------+
| User       | Host      | Password  |
+------------+-----------+-----------+
| my_account | %         | 123       |
|            | localhost | 456       |
+------------+-----------+-----------+

运行如下命令,最终登录的账户,匹配的是 第2条 记录。(读者可自行尝试,输入密码123登录失败,输入456登录成功)

mysql -u my_account -p

为什么呢?回顾下匹配的优先级。

  1. 首先,检查 Host 字段。localhost、% 都符合要求。localhost 匹配度高于 %,因此匹配到第2条记录。
  2. 接着,检查 User 字段。第2条记录是匿名账户,可匹配任意User值,因此,第2条记录符合要求。

因此,虽然账户 my_account 的 Host字段 为%,但是在本地(数据库所在主机)连接数据库时,因为上述规则的存在,MySQL 会认为你是用匿名账户在登录。

my_account 跟匿名账户的密码是不同的,因此密码校验不通过,拒绝访问。

写在后面

因匿名用户存在,导致本地连autocad_2018年最新新闻网接数据库拒绝连接,这个问题很常见,有不少人认为这是MySQL的设计缺陷,比如 这里。

了解了MySQL的身份验证逻辑,遇到类似问题也就有思路了。关于%通配符,匹配优先级,上文并没有详细展开,感兴趣的读者可以自行查看官方文档。

另外,MySQL拒绝访问的原因有多种,读者应具体问题具体分析。

如有错漏,敬请指出。

相关链接

Host wildcard % which is said in docs that means "all hosts" excludes localhost

6.2.4 Access Control, Stage 1: Connection Verification

原文首发在笔者的个人博客,地址在这里

当前文章:http://www-yebeimodiao-com.huaiarts.cn/n2x2w6nr/f700e_151976.html

发布时间:2019-10-22 00:36:36

澳门银河送彩金  银河娱乐首页yh163am.com  银河优越会会员申请  澳门银河官网yh163am.com  银河优越会会员申请  2949.com澳门银河娱乐  澳门银河官网手机app  澳门银河www66356com  www.7163.com澳门银河  银河优越会会员申请  

相关阅读 BOSE SoundWear评测:用沉浸式音箱听歌打游戏三星手机新功能:英国病患可进行视频问诊古巴坠机事故致100余人遇难 3名幸存者被送医治疗特朗普:取消首脑会晤因朝近期声明释放“敌意”中粮出品/五谷为养,山萃红枣莲子桂圆粉608g装19.9元(30元券)300余名澳门中学生参加国旗手训练营书值 | 第 2 期:成为技术管理者,思维上应该如何转变?

文章评论
发表评论

热门文章 南孚京东年中狂欢购:全场低至9.9元起,赢599元世界杯球衣环球时报社评:中美贸易战停战是两国共同胜利夏天了,男人味太重也得收敛些直降260元/价保30天,Beats X蓝牙无线运动耳机798元秒杀

最新文章 一个时代结束,佳能卖出最后一台胶片相机吃荔枝会被查酒驾?食用完稍作休息乙醇就会散去 小米MIUI 10连接IoT设备更便捷:负一屏新增智能家居卡片Django Rest Framework源码剖析(四)-----API版本3999元,米家投影仪京东预售:120英寸巨幅画面,杜比音效

人气排行 《惩罚者》第二季首曝视频:漫威最强人类对射毁容反派清水加上这几种食物 效果好的没得夸清水加上这几种食物 效果好的没得夸亚拓士声明:坚决不承认并将严厉打击娱美德非法授权韩国青瓦台回应朝鲜推迟高级别会谈表态:将静观其变2100名高三生踩气球减压 家长守候捡垃圾