Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【MySQL基础篇】十三、用户与权限管理

【MySQL基础篇】十三、用户与权限管理

作者头像
利刃大大
发布于 2025-05-22 05:15:42
发布于 2025-05-22 05:15:42
8600
代码可运行
举报
文章被收录于专栏:csdn文章搬运csdn文章搬运
运行总次数:0
代码可运行

Ⅰ. 认识用户管理

1、概念

MySQL 中的用户管理是指通过创建、配置和管理用户帐户,控制用户对数据库服务器的访问权限。MySQL 数据库服务器允许管理员创建多个用户帐户,并对这些帐户的权限进行灵活配置,以确保数据库的安全性和数据的隐私。

​ 而如果我们只使用 root 用户,并且如果密码强度不大的话,是存在很大的安全隐患的。这时,就需要使用 MySQL 的用户管理。

2、mysql 中的用户信息

MySQL 中的用户,都存储在系统数据库 mysqluser 表中,如下所示:

​ 这其实我们在 linux 中对应的目录下也能找到:

​ 我们可以查看其中的一些字段:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> select host,user,authentication_string from user;
+-----------+---------------+-------------------------------------------+
| host      | user          | authentication_string                     |
+-----------+---------------+-------------------------------------------+
| localhost | root          | *8C19F9348EC7664CA2D94837E24FDAE7AA6730A6 |
| localhost | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| localhost | mysql.sys     | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
+-----------+---------------+-------------------------------------------+
3 rows in set (0.00 sec)
  • host:表示这个用户可以从哪个主机登陆,如果是 localhost,表示只能从本机登陆
  • user:用户名
  • authentication_string:用户密码通过 password() 函数加密后得到的
  • *_priv:用户拥有的权限(上面没有查询,认识就行,这里 * 号表示通配符的意思)

Ⅱ. 用户的操作

​ 下面的用户操作,其实本质就是在上面所提到的 user 表中的增删改操作,但是我们还是更建议使用下面 mysql 提供的语句去增删改用户!

1、创建用户

root 可以使用 create user 语句创建新的用户账户。语法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
create user 用户名@主机名 identified by 密码;

​ 其中用户名和主机名中间的 @ 号是必须的,然后主机名可以是具体的 IP 地址或主机名,也可以使用通配符 %(表示任意主机,但是强烈不推荐使用!!!)。

​ 再强调一次,不要轻易添加一个可以从任意地方登陆的 user,也 很不建议暴露自己的公网 IP

​ 可能实际在设置密码的时候,因为 mysql 本身的认证等级比较高,一些简单的密码无法设置,会爆出如下报错:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ERROR 1819 (HY000): Your password does not satisfy the current policyrequirements

​ 解决方案:https://blog.csdn.net/zhanaolu4821/article/details/93622812

​ 查看密码设置相关要求:show variables like 'validate_password%';

2、删除用户

​ 如果不再需要某个用户账户,管理员可以使用 drop user 语句删除该账户:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
drop user '用户名'@'主机名';

3、修改密码

root 可以使用 alter user 语句来修改用户的密码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
alter user '用户名'@'主机名' identified BY 新密码;

​ 其实 root 也可以用 set 语句来进行设置用户的密码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
set password for '用户名'@'主机名' = password(新密码);

​ 如果是用户想修改自己的密码的话,则可以使用如下命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
set password = password(新密码);

举例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> create user liren@localhost identified by 'TTh0@514fs';  #增加用户
Query OK, 0 rows affected (0.00 sec)

mysql> select host,user,authentication_string from user;  #查询用户表
+-----------+---------------+-------------------------------------------+
| host      | user          | authentication_string                     |
+-----------+---------------+-------------------------------------------+
| localhost | root          | *031970029E0C6366F4DDE6BAAC435F3AE9CF55C9 |
| localhost | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| localhost | mysql.sys     | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| localhost | liren         | *C3DB967086D8B256F0500C5D84572C276F28D711 |
+-----------+---------------+-------------------------------------------+
4 rows in set (0.00 sec)

mysql> drop user liren@localhost;		#删除用户
Query OK, 0 rows affected (0.00 sec)

mysql> select host,user,authentication_string from user;   #发现用户表中用户不见
+-----------+---------------+-------------------------------------------+
| host      | user          | authentication_string                     |
+-----------+---------------+-------------------------------------------+
| localhost | root          | *031970029E0C6366F4DDE6BAAC435F3AE9CF55C9 |
| localhost | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| localhost | mysql.sys     | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
+-----------+---------------+-------------------------------------------+
3 rows in set (0.00 sec)

mysql> create user liren@localhost identified by 'TTh0@514fs';
Query OK, 0 rows affected (0.00 sec)

mysql> set password=password('T14520!5fs');		#修改密码
Query OK, 0 rows affected, 1 warning (0.00 sec)

Ⅱ. 刷新指令 – flush privileges

flush privileges 是一个 MySQL 数据库管理命令,用于 重新加载权限表并使最新的权限更改生效。当在 MySQL 中修改了用户权限或角色权限,需要使用 flush privileges 命令来通知数据库重新加载这些更改,以便新的权限设置能够立即生效。

​ 通常情况下,当通过 grantrevoke 命令授予或撤销用户的权限时,MySQL 并不会立即生效这些更改,而是在适当的时机进行刷新。使用 flush privileges 命令可以手动触发权限表的刷新,以确保最新的权限设置生效。

​ 语法如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
flush privileges;

​ 执行此命令后,MySQL 会重新加载权限表,并将最新的权限更改应用到正在运行的数据库会话中。

​ 需要注意的是,大多数情况下我们不需要频繁使用 flush privileges 命令。只有在更改了用户权限或角色权限后,才需要执行该命令以确保更改生效。在正常情况下,MySQL 会自动在适当的时机刷新权限表。

​ 此外,从 MySQL 8.0.16 版本开始, flush privileges 命令实际上不再是必需的,因为权限表会在更改权限时自动刷新。但为了确保一致性,执行 flush privileges 仍然是一个良好的实践。

Ⅲ. 认识权限管理

1、概念

MySQL 中的权限管理是一种机制,允许管理员控制用户或角色对数据库服务器和其中的数据的访问和操作权限。通过仔细配置权限,可以 确保只有授权用户能够执行特定的数据库操作,从而保障数据库的安全性和数据的隐私

​ 以下是 MySQL 中的权限管理的一些关键方面:

  1. 用户和角色:MySQL 中,可以创建用户帐户并为其分配不同的权限。此外,自 MySQL 8.0 版本起,还引入了角色的概念,可以创建角色并分配给用户,从而更好地管理权限。
  2. 权限级别: MySQL 的权限可以分为全局级别、数据库级别和表级别。这意味着管理员可以控制用户在整个数据库服务器、特定数据库或特定表上的操作权限。
  3. 权限类型: MySQL 支持多种权限类型,包括 SELECT、INSERT、UPDATE、DELETE、CREATE、DROP、GRANT 等等。管理员可以根据需求为用户分配适当的权限,以便他们执行所需的操作。
  4. 授权和撤销: 使用 grant 命令可以为用户或角色授予特定的权限,而使用 revoke 命令可以撤销已授予的权限。
  5. 权限验证: MySQL 使用用户名、密码和主机信息进行身份验证。只有通过验证的用户才能连接到数据库服务器并执行操作。
  6. 视图和存储过程权限: 用户可以被授予创建和使用视图、存储过程以及其他数据库对象的权限。
  7. 权限继承: 角色可以继承其他角色的权限,从而简化权限管理和配置。

2、MySQL权限信息以及权限表

MySQL 数据库给一个合法用户赋予的权限分为五个级别:全局级(全局访问)、数据库级(指定数据库的访问)、表级(指定表的访问)、列级(指定列的访问)、存储过程和函数级(指定存储过程和函数的访问),这些权限从全局到局部的级别依次递减。

MySQL 数据库中 权限级别的划分是通过系统权限表来实现的。系统中有 6 张权限表与 5 个权限级别相对应,分别为:user 表、db 表、host 表、tables_priv 表、columns_priv 表以及 procs_priv 表。

​ 这些表默认存放在叫做 mysql 的库中,该 6 个表的主要信息为:

  1. user表:称为全局表,又被称为超级用户表,因为 默认情况下 root 用户具有所有的权限。其用于前面的登录验证外,还用于判定合法登录用户是否拥有数据库服务器的全局操作权限。
    • 该表包含下面几列:
      • 用户信息列(Host、User、Password)
      • 权限列(数据库操作中 29 个全局权限 29 列,通过 N/Y 断定用户是否有该权限)
      • 安全列 (ssl_type、ssl_cipher、x509_issuer、x509_subject)
      • 资源控制列(max_questions、max_updates、max_connections、max_user_connections)
  2. db 表:是 针对某个数据库 的,它用来指定用户对某个指定的数据库中的对象具有哪些操作权限。
    • 该表包含下面几列:
      • 用户信息列(Host、Db、User)
      • 权限列(数据库级权限 19 列)
  3. host表:作为 db 表一个辅助表,大部分情况下不用。
    • 如果想要用户能在从若干主机使用一个数据库,在用户的 db 表行的 Host 值设为空值,然后将那些主机的信息存入 host 表。host 表没有 user 字段,其他和 db 表一样
  4. tables_priv表:用来指定用户对某个表格 所具有的权限。
    • 该表包含下面几列:
      • 用户信息列(Host、Db、User、Table_name)
      • 权限列(表级权限 Table_priv、Column_priv 用户所拥有对该表的所有列级权限,如果该列为空,那么 columns_priv 表中用户就没有对该表的列级权限记录)
      • 其他列(授权时间 Timestamp、授权者 Grantor)
  5. columns_priv表:用于指定用户对某个字段 所拥有的权限。
    • 该表包含下面几列:
      • 用户信息列(Host、Db、User、Table_name)
      • 权限列(column_priv 列级权限)
      • 其他列(授权时间 timestamp)
  6. procs_priv表:该表用于指定用户对某一个单独的存储过程或函数
    • 该表包含下面几列:
      • 用户信息列(Host、Db、User、Routine_name、Routine_type)
      • 权限列(Proc_priv 存储过程权限)
      • 其他列(授权时间 Timestamp、授权者 Grantor)

3、MySQL授权规则

MySQL 数据库授权过程由系统管理员以及权限转授者完成。系统拥有一套比较简单的授权管理规则:

  • 规则一:管理员 root 用户或拥有全局 grant_priv 的用户可以将系统资源的任何权限授予任何用户,能从任何用户回收任何权限
    • 如果用户拥有全局的 grant_priv 权限,用户就可以将全局/数据库级/表级/列级/存储过程级所有的权限授予他人,比如系统中的超级用户 root 就有全局的 grant_priv 权限,他就可能生成更多的超级用户。
    • 这样如果一个普通用户创建了自己的数据库或表并且包含一些机密信息,就很容易被超级授权者将权限授予其他人,容易泄漏用户的信息。
  • 规则二:数据库对象(数据库/表)创建者,没有所创建对象的任何操作权限(存储过程或函数除外),必须通过 root 用户统一授权
  • 规则三:普通用户如果要将权限授予其他用户或回收该权限,必须拥有该权限的使用权以及转授权。

4、MySQL权限检查机制

MySQL 用户访问请求的处理也是根据用户所拥有的权限的级别来实现的。

​ 具体规则为:如果高优先级的表中用户具有所请求的操作权限,那么就无需查阅优先级较低的授权表了,但是如果高优先级的表中对应权限的值为 N,那么就需要进一步查看低优先级的授权表。

​ 也就是说,如果某个用户发送一个的某一个请求,将作如下处理:

  1. 首先检查 user
    • 如果表中相应权限字段为 Y,则不用考虑其他四个表,访问接受;
    • 如果为 N 且请求的权限为全局级权限,访问拒绝;
    • 如果为 N 但请求的权限不是全局级权限,则需要继续查找 db 表。
  2. 检查 db 表中用户所指定数据库的相应权限信息
    • 如果表中相应权限字段为 Y,不再考察低优先级表,访问接受;
    • 如果为 N 且请求的权限为数据库级权限,访问拒绝;如果为 N 但请求的权限不是数据库级权限,继续检查 tables_priv 表。
  3. 检查 tables_priv 表中用户所指定表格的相应权限信息,查看用户指定表格记录的表级权限字段 Table_privs 是否包含该请求权限
    • 如果包含,访问接受
    • 如果没有,判断请求的权限是否为表级权限,
      • 如果请求的是列级权限,查看查看用户指定表格记录的表级权限字段 Column_privs 是否包含该请求权限
        • 如果有,继续检查columns_privs 表格
        • 如果没有,访问拒绝。
  4. 检查 colums_priv 表,查看表中是否有对表格指定字段的请求操作权限
    • 如果有相关权限记录,访问接受
    • 如果没有访问拒绝。

Ⅳ. 权限的操作

1、查看用户现有权限

方法一:使用 SHOW GRANTS 命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
show grants for '用户名'@'主机名';

方法二:使用 information_schema.USER_PRIVILEGES 视图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from information_schema.USER_PRIVILEGES where GRANTEE = "'用户名'@'主机名'";

​ 下面我们两种方式都采用一下,来举个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> select * from information_schema.USER_PRIVILEGES where GRANTEE = "'liren'@'localhost'";
+---------------------+---------------+----------------+--------------+
| GRANTEE             | TABLE_CATALOG | PRIVILEGE_TYPE | IS_GRANTABLE |
+---------------------+---------------+----------------+--------------+
| 'liren'@'localhost' | def           | USAGE          | NO           |
+---------------------+---------------+----------------+--------------+
1 row in set (0.00 sec)

mysql> show grants for liren@localhost;
+-------------------------------------------+
| Grants for liren@localhost                |
+-------------------------------------------+
| GRANT USAGE ON *.* TO 'liren'@'localhost' |
+-------------------------------------------+
1 row in set (0.00 sec)

2、授予权限 – grant

​ 创建用户账户后,默认情况下该用户没有任何权限。管理员可以使用 grant 语句授予用户特定的权限,以允许其执行特定的数据库操作!

​ 此时可以通过下面语句进行授权:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
grant 权限列表 on 库.对象名 to '用户名'@'主机名' [identified by '密码'];

说明:

权限列表中,多个权限用逗号分开,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
grant select on ...						-- 表示赋予查询权限
grant select, delete, create on ....	-- 表示赋予查询、删除、创建权限
grant all [privileges] on ... 			-- 表示赋予该用户在该对象上的所有权限

对于「库.对象名」来说:

  • *.*:代表本系统中的所有数据库的所有对象(表、视图、存储过程等)
  • 库.*:表示某个数据库中的所有数据对象(表、视图、存储过程等)

identified by 是可选项。 如果用户存在,赋予权限的同时修改密码;如果该用户不存在,就是创建用户。

​ 在授权的时候可以参考该图!

​ 注意,如果发现授予权限后,没有生效的话,可以执行前面讲过的刷新指令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
flush privileges;

3、回收权限 – revoke

​ 管理员可以使用 revoke 语句从用户账户中撤销特定的权限。语法如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
revoke 权限列表 on 库.对象名 from '用户名'@'主机名';

​ 这里就不演示操作了,比较简单!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-01-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL用户和权限管理(一)
第一部分:主要是MYSQL数据库的权限体系以及MYSQL访问控制的两个阶段;我们都知道,MYSQL初始化完成之后,自带四个默认的数据库;下面的内容主要涉及到的是mysql库中相关的内容;
SEian.G
2021/03/03
3.2K0
MySQL 之用户和权限管理
在MySQL 5.7.24中,关于用户及用户权限的相关信息,都保存在了mysql库中的user表中,可以将user表中大致分为用户列、权限列、安全列、资源控制列这几种。
小手冰凉
2020/05/21
2K0
MariaDB/MySQL用户和权限管理详解
MariaDB/MySQL中的user由用户名和主机名构成,如"root@localhost",同用户名但不同主机名对MySQL/MariaDB来讲是不同的,也就是说"root@localhost"和"root@127.0.0.1"是不同的用户,尽管它们都是本机的root。
星哥玩云
2022/08/16
1.7K0
MariaDB/MySQL用户和权限管理详解
MySQL 用户与权限管理
    MySQL权限系统的主要功能是证实连接到一台给定主机的用户,并且赋予该用户在数据库上的相关DML,DQL权限。MySQL存取控制包含2个阶段,一是服务器检查是否允许你连接;二是假定你能连接,服务器检查你发出的每个请求。看你是否有足够的权限实施它。本文主要描述MySQL权限系统相关的用户创建、授权、撤销权限等等。
Leshami
2018/08/13
9.2K0
MySQL用户和权限管理(二)
在前面的文章中MySQL用户和权限管理(一)介绍了MYSQL用户和权限体系以及访问控制的两个阶段;
SEian.G
2021/03/03
3.1K0
带您深入了解MySQL的权限管理 转
MySQL 的权限表在数据库启动的时候就载入内存,当用户通过身份认证后,就在内存中进行相应权限的存取,这样,此用户就可以在数据库中做权限范围内的各种操作了。
双面人
2019/04/10
6420
MySQL用户账户管理与权限管理详解
MySQL 的权限表在数据库启动的时候就载入内存,当用户通过身份认证后,就在内存中进行相应权限的存取,这样,此用户就可以在数据库中做权限范围内的各种操作了。
星哥玩云
2022/08/17
5.4K0
第十一章《mysql用户与权限》
mysql关于用户的信息保存在mysql.user表当中,关于用户的权限主要是存储在mysql库中(user、db、host、tables_priv、columns_priv)这5个表中。
Java架构师必看
2021/06/02
8250
第十一章《mysql用户与权限》
访问权限控制系统|全方位认识 mysql 系统库
在上一期《权限系统表|全方位认识 mysql 系统库》中,我们针对mysql 系统库中的权限表做了一个简单的认识,本期我们将在上一期的基础上详细介绍MySQL 的访问权限控制系统,下面请跟随我们一起开始 mysql 系统库的系统学习之旅吧。
老叶茶馆
2020/12/15
2.5K0
MySQL 用户与权限管理
MySQL5.7官网介绍:https://dev.mysql.com/doc/refman/5.7/en/grant.html
Power
2025/03/01
3990
用户管理(MySQL)
如果我们只能使用root用户,这样存在安全隐患。这时,就需要使用MySQL的用户管理。
ljw695
2025/01/03
2250
用户管理(MySQL)
MySQL操作之用户管理权限管理:(DC)(五)
MySQL中用户分为root用户和普通用户。root用户为超级管理员,具有所有权限(创建用户、删除用户、管理用户)。
ha_lydms
2023/08/09
4480
MySQL操作之用户管理权限管理:(DC)(五)
2024Mysql And Redis基础与进阶操作系列(3)作者——LJS[含MySQL用户,权限,角色管理;举例说明详解步骤及常见报错问题对应的解决方法]
不建议通过 DELETE FROM USER u WHERE USER='li4' 进行删除,系统会有残留信息保
盛透侧视攻城狮
2024/10/22
1810
2024Mysql And Redis基础与进阶操作系列(3)作者——LJS[含MySQL用户,权限,角色管理;举例说明详解步骤及常见报错问题对应的解决方法]
Mysql用户与权限操作
用户是数据库的使用者和管理者。 MySQL通过用户的设置来控制数据库操作人员的访问与操作范围。 服务器中名为mysqI的数据库,用于维护数据库的用户以及权限的控制和管理。 MySQL中的所有用户信息都保存在mysql.user数据表中。
海盗船长
2021/12/07
3.6K0
Mysql用户与权限操作
MySQL权限管理 原
·  管理权限(如 super, process, file等)不能够指定某个数据库,on后面必须跟 *.*
拓荒者
2019/03/11
2.2K0
【MySql】用户管理——用户管理|权限管理
如果我们只能使用root用户,这样存在安全隐患。这时,就需要使用MySQL的用户管理。 比如张三只能操作mytest这个数据库,李四只能操作msg这个数据库,而root可以操作所有的库,如果给他们root账户,风险太大了,数据库都能操作,所以我们需要对用户进行管理。
平凡的人1
2023/10/15
6940
【MySql】用户管理——用户管理|权限管理
mysql安全权限的讲解
MySQL 默认有个root用户,但是这个用户权限太大,一般只在管理数据库时候才用。如果在项目中要连接 MySQL 数据库,则建议新建一个权限较小的用户来连接。
张哥编程
2024/12/19
1260
mysql---用户和权限管理复习
host:指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost,如果想让该用户可以从任意远程主机登陆,可以使用通配符%,主要有以下几种写法
大忽悠爱学习
2021/11/15
1.8K0
一文看尽MySQL用户权限管理,真香!
mysql数据库(系统数据库)下的表:user、db、tables_priv、columns_priv、proce_priv、proxies_priv共同构成授权表;
陈哈哈
2020/07/06
12K1
一文看尽MySQL用户权限管理,真香!
mysql中grant权限_mysql外网访问权限
开启远程连接: 2, 修改 Mysql-Server 用户配置 mysql> USE mysql; — 切换到 mysql DB Database changed mysql> SELECT User, Password, Host FROM user; — 查看现有用户,密码及允许连接的主机 +——+———-+———–+ | User | Password | Host | +——+———-+———–+ | root | | localhost | +——+———-+———–+ 1 row in set (0.00 sec) mysql> — 只有一个默认的 root 用户, 密码为空, 只允许 localhost 连接 12 mysql> — 下面我们另外添加一个新的 root 用户, 密码为空, 只允许 192.168.1.100 连接 mysql> GRANT ALL PRIVILEGES ON *.* TO ‘root’@’192.168.1.100’ IDENTIFIED BY ” WITH GRANT OPTION; mysql> — @’192.168.1.100’可以替换为@‘%’就可任意ip访问,当然我们也可以直接用 UPDATE 更新 root 用户 Host, 但不推荐, SQL如下: mysql> — UPDATE user SET Host=’192.168.1.100′ WHERE User=’root’ AND Host=’localhost’ LIMIT 1; mysql> flush privileges; Query OK, 0 rows affected (0.00 sec)
全栈程序员站长
2022/08/04
6K0
相关推荐
MySQL用户和权限管理(一)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验