问题背景

用wordpress搭博客,数据库采用MySQL。为了调试方便,创建账户my_account ,允许它从任意主机访问数据库。CREATE USER `my_account`@'%' IDENTIFIED BY 'my_password';

修改 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'); // 数据服务地址

部署到云服务器上,本地浏览器访问博客,提示数据库拒绝访问(本地连接远程数据没问题),以下为错误日志。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 指代 主机)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)

匿名账户

也就是 User 为空的账户,可以匹配任意用户名。如下指令创建了匿名账户。CREATE USER ''@'localhost' IDENTIFIED BY 'pwd3';

身份校验

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

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

答案是“优先级”。大致规则如下:首先,检查 Host 字段。如果有多个 Host 符合条件,则选择匹配度最高的记录(IP地址 > 通配符%)。

其次,检查 User 字段。如果有多个 User 符合条件,则选择匹配度最高的记录。匿名用户可以匹配任何用户,因此匹配度最低。

优先级匹配例子

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

+------------+-----------+-----------+| my_account | %         | 123       |

|            | localhost | 456       |

+------------+-----------+-----------+

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

为什么呢?回顾下匹配的优先级。首先,检查 Host 字段。localhost、% 都符合要求。localhost 匹配度高于 %,因此匹配到第2条记录。

接着,检查 User 字段。第2条记录是匿名账户,可匹配任意User值,因此,第2条记录符合要求。

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

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

写在后面

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

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

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

如有错漏,敬请指出。

相关链接

mysql数据库连接被拒绝访问_记一次MySQL数据库拒绝访问的解决过程相关推荐

  1. mysql增量备份具体步骤_记一次mysql全量备份、增量备份的学习过程

    增量备份依赖于全量备份,因此首先要有全量备份,在全量备份的基础上,添加增量备份. 为了方便操作,我们先来做些准备工作.在客户端直接输入mysql.mysqldump.mysqladmin.mysqlb ...

  2. mysql删库后恢复_记一次MySQL删库的数据恢复

    昨天因为不可描述的原因,数据库直接被 drop database删除.在第一时间停止数据库服务和Web服务,备份MySQL数据目录下的所有文件之后,开始走上数据恢复之路. 第一次干这种事,各种不得法. ...

  3. mysql binlog更新记录缺失_记一次mysql数据库binlog丢失引起的故障

    线上某业务需要对日志信息入库并进行分析最后呈现在管理后台上.某天突然发现后台没有前一天的分析数据.首先认为是java程序问题,于是查看应用程序日志,发现数 线上某业务需要对日志信息入库并进行分析最后呈 ...

  4. python会不会内存泄露_记一次python 内存泄漏问题及解决过程 python 嵌套读取文件 内存泄露...

    如何解决Python2的内存泄漏问题 python本身不会造成内存泄露,如果用的C/C++写的模块(包),如果处理不好,可能会造成内存泄露,但是也是C/C++的模块造成的 欢迎来到四十五资源网,pyt ...

  5. 阿里云下mysql远程访问被拒绝_记一次MySQL数据库拒绝访问的解决过程

    最近在折腾wordpress博客,连接MySQL数据库时提示拒绝访问.经过排查,解决了问题.这里记录下解决问题的方案,以及解决的思路.如有遇到类似问题的读者可以参考下. 用wordpress搭博客,数 ...

  6. mysql 多数据源访问_通过Spring Boot配置动态数据源访问多个数据库的实现代码

    之前写过一篇博客<Spring+Mybatis+Mysql搭建分布式数据库访问框架>描述如何通过Spring+Mybatis配置动态数据源访问多个数据库.但是之前的方案有一些限制(原博客中 ...

  7. 端口如何支持非localhost访问_新特性解读 | MySQL 8.0.19 支持 DNS SRV

    转载自公众号:玩转MySQL 作者:洪斌 MySQL Router 是 InnoDB Cluster 架构的访问入口,在架构部署上,官方给出的建议是 router 与应用端绑定部署,避免 router ...

  8. mysql勒索_记一次mysql数据库被勒索(下)

    背景: nextcloud的mysql数据库被黑,删库勒索.参考:记一次mysql数据库被勒索(上) mysql数据库恢复成功,nextcloud还是无法连接.参考:记一次mysql数据库被勒索(中) ...

  9. mysql挂载数据卷_记一次生产数据库数据文件进行分区转移

    概述 由于之前同事没有对磁盘分区做规划,可以看到数据和系统是在同个分区的,没有单独规划一个数据分区给数据库,还有个分区是640G没有用上.下面简单介绍一下mysql数据库数据文件的转移过程. 1.新建 ...

最新文章

  1. 在Project 2010中添加自定义任务窗格
  2. 计算机房活动记录,兴趣小组活动记录表
  3. 前端学习(2921):vue的事件
  4. quartz各版本MySQL数据库存储建表SQL语句
  5. 电路 晶振频率_都说晶振是电路的心脏,你真的了解它吗?
  6. 信息学奥赛一本通(1125:矩阵乘法)
  7. 吴恩达深度学习 —— 2.13 逻辑回归的向量化
  8. mysql-server rpm_Mysql rpm包安装
  9. fastadmin在html中查询数据,常见问题 · fastadmin 常见问题 · 看云
  10. ubuntu美化--壁纸软件
  11. 【译】PCL官网教程翻译(20):惯性矩和偏心距描述符 - Moment of inertia and eccentricity based descriptors
  12. js 下拉层级多选_Jquery实现select二级联动多选下拉菜单
  13. Android 屏幕旋转的处理
  14. 多台计算机共享内存_共享内存多处理器和指令执行| 计算机架构
  15. 【Git配置技巧】01. 配置文件git config介绍
  16. c语言的真假,C语言丨还没搞懂逻辑运算符?一篇文章教你区分“真假”!
  17. GitHub CEO 说:开源已经胜利,等;开源之道每周评论(2019 11 18)
  18. 爬虫实战——豆瓣电影Top250
  19. 2017-2018 2 20179214《网络实践攻防》第三周作业(一)
  20. P2754 [CTSC1999] 家园

热门文章

  1. 玲珑杯 1160 - 康娜与玲珑杯
  2. 平稳随机过程的严平稳随机过程与宽平稳随机过程区别联系
  3. 蓝牙BLE设备主机重启回连流程分析
  4. Praat脚本-024 | 如何使用PyToBI工具自动标注韵律边界调
  5. Thinkphp使用Validate里的正则表达式验证中文名字和身份证号码
  6. 两年Java开发经验,裸辞之后筹备半年时间,重面阿里终于如愿拿到P6级offer [Java岗],你知道我是怎么走过来的吗?
  7. Oracle-标识符无效问题
  8. 【Vue】前端人脸识别框架 tracking.js 活体检测/拍照在 vue2 的使用
  9. 途南技术 | 微软OneNote如何导出pdf文件?不完美的小bug
  10. linux下Qwt 安装