为了有效控制数据库用户的访问权限,在MySQL数据库中创建了一个新用户,但使用刚创建的用户和密码却发现连接不了MySQL数据库,通过查看官网手册及《MySQL技术内幕》一书,才逐渐熟悉MySQL的用户账号认证方式,这里做一个简单总结。另外本篇文章基于MySQL5.5版本,如果需要测试文章内容,低于此版本请先升级MySQL数据库https://www.zerostopbits.com/how-to-upgrade-mysql-5-1-to-mysql-5-5-on-centos-6-7/

MySQL数据库中有一个名称为mysql的系统数据库,USE mysql;进入该数据库,SHOW TABLES查看该数据库下的表,可以看到大概有二三十张表,本篇文章仅讨论user表

下面使用CREATE命令创建一个用户账号:

CREATE USER JING IDENTIFIED BY 'TESTPASSWORD';

每新创建的用户账号就会在user表下增加一条记录,使用SELECT命令查看user表可以找到刚刚创建的那个用户,用户名(User)为JING,密码(Password)已被加密:

使用Xshell连接到CentOS服务器(我的MySQL数据库装在京东云的CentOS服务器上),输入mysql -u JING -p连接MySQL数据库服务器,输入密码后却拒绝访问,返回如下结果:

ERROR 1045 (28000): Access denied for user 'JING'@'localhost' (using password: YES)

这就非常奇怪了,明明使用正确的账号和密码,怎么就连接不了了呢,这种时候如果不了解MySQL的账户认证方式,可能会急得直跺脚吧! ̄へ ̄

下面就来简单介绍一下MySQL的用户账号认证方式:

首先MySQL的用户账号(account)由两部分组成:用户名(User)和主机名(Host)。格式为’User’@’Host’,简单举几个创建用户的例子:

# 用户名为Mary,密码为watermelon,必须从指定的主机地址192.168.128.3连接服务器

CREATE USER 'Mary'@'192.168.128.3' IDENTIFIED BY 'watermelon';

# 用户名为Jack,密码为pineapple,必须从C类子网192.168.128连接服务器

CREATE USER 'Jack'@'192.168.128.%' IDENTIFIED BY 'pineapple';

# 用户名为Jane,密码为pear,必须是test.com域名或其子域名下的主机连接服务器

CREATE USER 'Jane'@'%.test.com' IDENTIFIED BY 'pear';

# 用户名为Michael,密码为banana,只能从本地连接服务器

CREATE USER 'Michael'@'localhost' IDENTIFIED BY 'banana';

# 用户名为Bob@localhost,密码为jujube,可从任意主机连接服务器

CREATE USER 'Bob@localhost' IDENTIFIED BY 'jujube';

# 用户名为Smith,密码为orange,可从任意主机连接服务器

CREATE USER 'Smith'@'%' IDENTIFIED BY 'orange';

# 用户名为JING,密码为TESTPASSWORD,可从任意主机连接服务器

CREATE USER 'JING' IDENTIFIED BY 'TESTPASSWORD';

从这几个例子可以得出下面几条结论:

MySQL的账户认证除了需要用户名和密码正确之外,还必须从指定的主机连接服务器才能够成功访问MySQL数据库服务器

主机名可以使用%通配符

主机名可以是域名、IPv4地址、localhost,实际上还可以是IPv6地址、127.0.0.1等(localhost和127.0.0.1还是有一些区别的,不要误以为两者完全等价)

主机名可以省略,如果省略则默认主机名为%,表示任意主机,注意如果省略主机名,则@符号也需要省略,’JING’@”的主机名为空字符串并不是%

用户名和主机名需要用@符号隔开

除此之外,还有如下几点需要了解

用户名和主机名可以使用单引号括起来,也可以省略单引号,但如果包含像%、_等特殊字符,则单引号不可以省略

MySQL服务器对用户的连接请求先根据主机地址(Host)匹配,再根据用户名(User)行匹配,最后才会匹配密码(Password)

重点在于第7点,根据第7点写出下面的SQL语句:

SELECT Host, User, Password FROM user ORDER BY Host DESC, User DESC;

返回结果如下:

回到刚开始的问题,为什么我使用正确的用户名和密码连接MySQL服务器会被拒绝访问呢?

这是因为我使用CREATE USER JING IDENTIFIED BY ‘TESTPASSWORD’;命令创建的用户JING可以通过任意主机访问MySQL服务器,而我通过Xshell登录京东云主机,然后使用mysql -u JING -p命令连接MySQL服务器,使用的主机地址(Host)为:localhost,用户名(User)为:JING,密码(Password)为:TESTPASSWORD。根据SELECT Host, User, Password FROM user ORDER BY Host DESC, User DESC;返回的结果,MySQL会从上往下逐个去校验匹配,最终匹配第2条记录,即Host为localhost,User为空,密码为空。而一旦成功匹配一条记录,便不会继续向下匹配了。

综合上面的分析,如果想要成功连接MySQL,只要执行mysql -u JING -p,当需要输入密码时,不用输入任何内容直接回车就可以了;如果我是通过我的Windows笔记本想要使用用户JING连接我的京东云MySQL数据库,只要打开cmd执行如下命令然后输入密码(此处需要输入密码是因为MySQL只能匹配到Host为%,User为JING,Password为TESTPASSWORD的那条记录)即可成功连接:

mysql -u JING -h 116.196.114.75 -p

登录之后我们也可以通过如下命令查看当前是通过哪个账号(account)连接的,从而验证上面的结论:

SELECT CURRENT_USER();

Xshell登录京东云主机返回的结果:

我的Windows命令行返回的结果:

mysql账号认证_浅谈MySQL用户账号认证方式相关推荐

  1. mysql 用户通配符_浅谈mysql通配符进行模糊查询的实现方法

    在mysql数据库中,当我们需要模糊查询的时候 ,我们会使用到通配符. 首先我们来了解一下2个概念,一个是操作符,一个是通配符. 操作符 like就是SQL语句中的操作符,它的作用是指示在SQL语句后 ...

  2. mysql维护计划任务_浅谈MySQL event 计划任务

    一.查看event是否开启 show variables like '%sche%'; set global event_scheduler =1; 二. -- 设置时区并设置计划事件调度器开启,也可 ...

  3. mysql revoke 授权_浅谈MySQL中授权(grant)和撤销授权(revoke)用法详解

    MySQL 赋予用户权限命令的简单格式可概括为: grant 权限 on 数据库对象 to 用户 一.grant 普通数据用户,查询.插入.更新.删除 数据库中所有表数据的权利 grant selec ...

  4. mysql sql优化_浅谈mysql中sql优化

    说到sql优化,一般有几个步骤呢,在网上看到了一篇很不错的帖子.在这分享一下吧,也是自己学习的一个过程. 一.查找慢查询 1.1.查看SQL执行频率 SHOW STATUS LIKE 'Com_%'; ...

  5. mysql signed 长度_浅谈mysql字段长度设置

    mysql 中最常用的数据类型是tinyint,smallint,int,bigint,char,varchar; char(n)和varchar(n)存储固定长度的字符数据,长度最大为254字节.使 ...

  6. mysql 变量 数据类型_浅谈mysql(二)数据类型

    //我...我才是不是傲娇呢 //如有问题还请多多指教.上回我们说到我们如何使用MySQL,关键是要看它的用途.用途衍生语句.之后文章的思路,也是如此,从用途出发,然后再到语句. 那么,我们先问几个问 ...

  7. mysql表空间_浅谈mysql中各种表空间(tablespaces)的概念

    mysql中,会涉及到各种表空间的概念,虽然,很多方面这些概念和Oracle有相似性,但也有很多不同的地方,初学者很容易被这些概念弄的晕头转向,从而,混淆这些概念的区别和理解,下面,就简要介绍和说明一 ...

  8. mysql下日志_浅谈mysql下日志记录

    1,如何查看mysql执行命令历史 #.mysql_history     此文件记录了在mysql中执行命令的历史 2,事务日志: transaction log:事务型存储引擎自行的管理和使用. ...

  9. mysql declare与set的区别_浅谈MySQL存储过程中declare和set定义变量的区别

    在存储过程中常看到declare定义的变量和@set定义的变量.简单的来说,declare定义的类似是局部变量,@set定义的类似全局变量. 1.declare定义的变量类似java类中的局部变量,仅 ...

最新文章

  1. 一个Solidity源文件的布局
  2. WWDC上这个神级功能,一言不合又要改变未来购物趋势
  3. linux find 忽略大小写查找文件
  4. maven配置阿里云镜像后Eclipse不生效解决办法
  5. 洛谷P3349:小星星(容斥dp)
  6. Visual Studio 添加 自定义 路径宏
  7. 微商分销代理商城源码-代理等级和升级条件
  8. 华为 HarmonyOS 2.0 全面升级,构建中国软件的“根”!
  9. php使用memcached缓存总结
  10. 抽屉效果_仿QQ抽屉效果界面python
  11. uniapp 运行到手机或模拟器
  12. Flink(55):Flink高级特性之流式文件写入(Streaming File Sink)
  13. 系统结构考点之CRAY-1向量处理机
  14. 只有一条线的生存分析图 复杂一点的生存分析 及其参数详细解释
  15. Quartus之仿真错误#** Error (suppressible): (vsim-19) Failed to access library ‘ ‘ at “ “
  16. tomcat 日志拆分
  17. Windows Server 2012 R2在硬盘的分区
  18. 2021年计算机二级考试系统是哪个版本?
  19. Android DLNA投屏-基本原理
  20. windows defender might impact performance

热门文章

  1. hadoop整合hbase
  2. inFace发布618战报:蝉联造型梳TOP1,销售额相比去年双11增长906%
  3. 用html5设置国际象棋棋盘,绘制国际象棋棋盘
  4. 您无法登录,因为您使用的登录方法......
  5. RK3588 camera2 支持4K录像
  6. 数据库实现递归查询,获取节点的所有子孙节点
  7. 用什么软件测试高考成绩,优志愿、知涯升学等志愿填报软件测评出来啦!最好用的是这个...
  8. 如何查询自己的个人征信报告
  9. 游戏党福音,Google play游戏明年登录Windows
  10. 宏基微型计算机机箱怎么打开,机箱也智能 自己动手打造自动温控机箱