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

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

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

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

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

解决方案

1、方案一:删除 mysql.user表 中,Host字段为 localhost 的匿名账号(账户名为空)。

2、方案二:创建 my_account@localhost 账户,用于本地连接数据库。

笔者采用了方案 一。

首先,确认下 mysql.user 表中是否存在匿名账户。

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

问题分析

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

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

创建MySQL账户

基础语法如下:

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

Host 表示 允许账户从哪台主机访问数据库。主要用于做安全限制,可以是 主机名、IP地址、%(通配符);

User 允许重复,只要 Host 是不同的就行。

当 Host 设置为 % 时,表示允许从任意主机连接数据库。

比如,存在两个xiaoming账户,一个允许从本机连接数据库,一个允许从 14.215.177.39 连接数据库。

匿名账户

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

身份校验

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

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

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

首先,检查 Host 字段。如果有多个 Host 符合条件,则选择匹配度最高的记录(IP地址 > 通配符%)。

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

优先级匹配例子

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

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

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

首先,检查 Host 字段。localhost、% 都符合要求。localhost 匹配度高于 %,因此匹配到第2条记录。

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

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

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

写在后面

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

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

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

如有错漏,敬请指出。

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

  1. mysql native数据同步_记一次MySQL(5.7版本)数据库的主从同步和备份

    我遇到的问题 我先后在BAT三大云服务器商购买了学生机,配置如下百度云2核/4G 阿里云1核/2G 腾讯云1核/2G 我的解决方案 由于我不知道百度云的续费规则,导致买了2核/4G的服务器之后以为像阿 ...

  2. mysql connection是什么_记一次MySQL出现too many connection

    今天中午的时候突然接到报警,MySQL连接数暴增..本来设置的max_conntion=6000, 这个数值连接已经够用.接到报警速度连接服务器连接mysql总是报如下错误: [mysql@local ...

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

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

  4. mysql查看脚本错误位置_记一次mysql启动不了查找经历

    在linux上用的是xampp,mysql启动没有报任何错误,但就是查找不到进程,于是找mysql错误日志,日志在哪?在lampp/var/mysql 以.err结尾的文件里.里面内容如下; /opt ...

  5. mysql 安装只有一半_记一次MySQL安装出现的坑爹问题。。。

    关键词:mysql安装msvcr100.dll缺失  vc++2010 : win10系统首次安装mysql,图方便下载了图形界面的安装包(5.6.4),本以为小事一桩:装一半失败.卸载清注册表.重装 ...

  6. mysql group by 性能_记一次Mysql group by的优化

    直接上干货: 数据量:50万 mysql版本:5.6.26 表结构: CREATE TABLE bet_order_product ( bet_order_product_id varchar(40) ...

  7. 修改mysql 视图字段类型_记一次mysql视图创建时自定义字段类型不同环境不同的原因...

    由于老项目使用的是hibernate,当项目启动时会去检查数据库字段类型等,发现一张视图中某个自定义字段在开发环境中类型为text,但是到了生产环境类型却为mediumtext,导致代码在生产上会有问 ...

  8. mysql无法启动修复_记一次MySQL无法启动及修复经历

    记得有次本地的MySQL无法启动,网上说,去删掉InnoDB日志就行,我就傻乎乎的去删掉了InnoDB相关的文件,果然,没有任何问题,正常启动了. 可是谁曾想,过了几天,故障复现了,我就按部就班的又去 ...

  9. mysql update不更新_记一次MySQL更新语句update的踩坑

    背景 最近在一次线上作业过程中执行了一句DML语句,本以为万无一失,结果应用反馈说没有更新,数据还是没有变,最后经过排查才发现是我语句写错了,导致update语句执行的结果与预期不符. 情景再现 为了 ...

最新文章

  1. HDFS 文件格式——SequenceFile RCFile
  2. a=a+b与a+=b有什么区别吗?
  3. (c语言)和与积的运算第四篇
  4. “中能融合杯”线下赛感悟
  5. 使用valgrind检测内存问题
  6. 东莞 小学计算机编程大赛,关于举办第二十一届东莞市中小学电脑制作活动的通知...
  7. Jackson ObjectMapper readValue过程
  8. 当Typora开始收费,开源免费的MarkText编辑器火了:一周新增2k+star
  9. java swing还有人用吗_Java不是自动管理内存吗,怎么还有内存泄漏?
  10. OpenSSL学习(十四):基础-指令passwd
  11. Elasticsearch 之(3)安装、启动elasticsearch和kibana
  12. 多路数据采集系统软件测试,基于AT89S52多路数据采集系统的设计-测试测量-与非网...
  13. Windows命令行快速启动快捷方式
  14. 使用proxychains匿名浏览,清理痕迹(六)
  15. 钉钉实时拍照和上传图片
  16. 大数据核心技术是什么
  17. 等级保护与解读《网络安全法》
  18. keychain service钥匙串服务
  19. 负基差会对股票量化对冲造成什么影响?
  20. 简述关系数据库的数据完整性规则_数据库的关系完整性

热门文章

  1. python 把数据写到tet_Python随身听023基础知识到底哪里用逗号?
  2. Remixer-谷歌的UI参数动态修改框架
  3. android studio防止反编译,防反编译利器-Android studio混淆代码压缩apk包体积
  4. python自定义配置文件读取_python读取和自定义配置文件的方法
  5. 天津理工大学计算机调剂信息,天津理工大学2020考研调剂信息
  6. Atata——C# Web测试自动化框架
  7. 通过GitHub Actions构建和部署Jekyll网站
  8. 使用LazZiya.ExpressLocalization开发多区域性ASP.NET Core 3、2、1项目
  9. 通过社交网络进行OWIN OAuth2身份验证
  10. .Net开发人员通过WCF使用Node.js