目录
[1. 用户与账号管理](#1. 用户与账号管理)
[1.1 查看用户](#1.1 查看用户)
[1.2 创建用户](#1.2 创建用户)
[1.3 修改密码](#1.3 修改密码)
[1.4 删除用户](#1.4 删除用户)
[2. 权限与授权](#2. 权限与授权)
[2.1 MySQL支持的权限列表](#2.1 MySQL支持的权限列表)
[2.2 show 查看用户权限](#2.2 show 查看用户权限)
[2.3 grant 授予权限](#2.3 grant 授予权限)
[2.4 revoke 回收权限](#2.4 revoke 回收权限)
1. 用户与账号管理
1.1 查看用户
a. 用户信息的存放
MySQL数据库管理系统的用户信息保存在mysql数据库 中的user表中。
查看所有数据库:
sql
show databases;

查看mysql数据库中表:
sql
use mysql;
show tables;

b. 查看用户信息
数据库默认初始有4个用户: mysql.infoschema、mysql.session、mysql.sys、root
【注意:这4个用户千万不能删除!!!】
其中root是 MySQL 的超级管理员账户,拥有所有数据库的完全控制权限。在user表中可以查看所有的用户:
sql注意:\G要在命令行工具才能使用 select host, user, authentication_string from user\G\G的作用是以行的形式展示列中的数据:
- user:⽤户名。
- host:允许登录的主机。如果是localhost,表⽰只能从本机登陆。
- authentication_string:加密后的⽤户密码。
除了这3种属性,user表还能查到用户的权限:

Y表示该用户拥有权限,N表示没有权限。root账户拥有所有的权限。
1.2 创建用户
语法:
create user [ if not exists ] '用户名'@'可登录的主机IP' identified by '密码明文';
- 用户名要用单引号包裹,区分大小写(与字符集校验规则无关)。
- 主机的IP地址要单引号包裹。
- 密码要用单引号包裹。MySQL 8.0 默认启用密码验证策略,要求:[至少8位长度] [包含大小写字母、数字、特殊字符]
- 新创建出来的用户是没有任何权限的,需要手动授权。
a. 可填写的主机地址
1. 通配符%:
- %表示所有主机都可以连接到数据库 。强烈建议不要这样设置,因为会导致严重的安全问题。
- 如果不指定主机IP (只有用户名,也没@符 ),那么就相当于使用了**'user_name'@'%'**。
- user_name和host_name分别⽤单引号包裹,如果写成 'user_name@host_name' ,相当于使用了 'user_name@host_name'@'%'。
2. 通过子网掩码 或CIDR表示法设置主机范围:
- 198.0.0.0 / 255.0.0.0 或 198.0.0.0 / 24:可连接 198 A段⽹络中的任意⼀台主机。
- 198.51.0.0 / 255.255.0.0 或 198.51.0.0 / 16:可连接 198.51 B段⽹络中的任意⼀台主机。
- 198.51.100.0 / 255.255.255.0 或 198.51.100.0 / 8:可连接 198.51.100 C段⽹络中的任意⼀台主机。
- 198.51.100.1:只包含特定IP地址的主机,这里只能连接 198.51.100.1 D段网络中的主机。
- localhost:它表示只有本机才允许登录,相当于IP地址127.0.0.1。
- 允许在IP地址中使用%通配符 。⽐如, 198.51.100.% 匹配 198.51.100 C段⽹络中的任何主机。MySQL8.0.35中已弃⽤(虽然支持该语法,但是很少用了),以后可能会删除。
b. 示例
-- 例1:添加一个名为bit的新用户,只允许从本机登录
sql
# 密码我设置为123456
create user 'bit'@'localhost' identified by '123456';
select host, user, authentication_string from user;

-- 例2:添加⼀个名为bit1的新用户,允许从192.168.1.1/24网段登录
sql
create user 'bit1'@'192.168.1.1/24' identified by '123456';
select host, user, authentication_string from user;

1.3 修改密码
语法:
有三种方式:
- alter user '用户名'@'可登录的主机IP' identified by '新密码';
- set password for '用户名'@'可登录的主机IP' = '新密码';
- set password = '新密码';
- 前两种方式都可以为指定的用户修改密码,第3种方式只能为当前登录的用户设置密码。
- 如果是修改其他用户的密码,那么当前登录的用户必须要有相应的权限 ,通常需要
CREATE USER权限。- 必须把 '用户名'@'主机IP' 写全,否则 MySQL 会认为是操作 '用户名'@'%',这可能导致意外的安全问题和数据丢失
-- 示例:用root账户把bit1的密码改成'654321'
修改前:

sql
ALTER USER 'bit1'@'192.168.1.1/24' IDENTIFIED BY '654321';
修改后:

1.4 删除用户
语法:
drop user [ if exists ] '用户名'@'可登录的主机IP' [ ,... ];
- 可以同时删除多个用户,每个账户用逗号隔开。
- 删除用户需要有相应的权限,通常是 CREATE USER 权限。
- 可以自己删除自己,不过也需要当前登录的账户具有相应的权限,但是这种行为不推荐。
- 必须把 '用户名'@'主机IP' 写全,否则 MySQL 会认为是操作 '用户名'@'%',这可能导致意外的安全问题和数据丢失。
-- 示例:删除用户bit1
删除前:

sql
drop user if exists 'bit1'@'192.168.1.1/24';
删除后:'bit1'@'192.168.1.1/24' 已经不存在了。

2. 权限与授权
2.1 MySQL支持的权限列表
MySQL的权限系统非常精细,可以根据不同的层级进行控制。下面这个表格汇总了MySQL中常见的权限及其主要作用范围:
数据库对象层级
| 权限名称 | 主要作用范围 | 简要说明 |
|---|---|---|
| ALL 或 ALL PRIVILEGES | 全局 | 授予除GRANT OPTION之外的所有权限。 |
| ALTER | 全局、数据库、表 | 允许修改表或索引结构。 |
| ALTER ROUTINE | 全局、数据库 | 允许修改或删除存储过程和函数。 |
| CREATE | 全局、数据库、表 | 允许创建数据库和表。 |
| CREATE ROLE | 全局 | 允许创建角色。 |
| CREATE ROUTINE | 全局、数据库 | 允许创建存储过程和函数。 |
| CREATE TEMPORARY TABLES | 全局、数据库 | 允许使用CREATE TEMPORARY TABLE创建临时表。 |
| CREATE USER | 全局 | 允许执行CREATE USER、DROP USER、RENAME USER和REVOKE ALL PRIVILEGES等账户操作。 |
| CREATE VIEW | 全局、数据库 | 允许创建或修改视图。 |
| DELETE | 全局、数据库、表 | 允许从数据库表中删除数据。 |
| DROP | 全局、数据库、表 | 允许删除数据库、表和视图。 |
| DROP ROLE | 全局 | 允许删除角色。 |
| EVENT | 全局、数据库 | 允许为事件调度器创建、修改或删除事件。 |
| EXECUTE | 全局、数据库 | 允许执行存储过程和函数。 |
| FILE | 全局 | 允许执行SELECT ... INTO OUTFILE和LOAD DATA INFILE等文件操作。 |
| GRANT OPTION | 全局、数据库、表、列、存储过程 | 允许将自己拥有的权限授予其他用户(或从其他用户回收)。 |
| INDEX | 全局、数据库、表 | 允许创建或删除索引。 |
| INSERT | 全局、数据库、表、列 | 允许向数据库表中插入数据。 |
| LOCK TABLES | 全局、数据库 | 允许使用LOCK TABLES语句显式锁定表。 |
| PROCESS | 全局 | 允许使用SHOW PROCESSLIST查看所有进程(包括其他用户的)。 |
| REFERENCES | 全局、数据库、表 | 允许创建外键约束。 |
| RELOAD | 全局 | 允许执行FLUSH操作(如FLUSH TABLES等)。 |
| REPLICATION CLIENT | 全局 | 允许查询主/从服务器状态。 |
| REPLICATION SLAVE | 全局 | 允许从服务器从主服务器读取二进制日志。 |
| SELECT | 全局、数据库、表、列 | 允许从数据库表中查询数据。 |
| SHOW DATABASES | 全局 | 允许使用SHOW DATABASES查看所有数据库列表。 |
| SHOW VIEW | 全局、数据库 | 允许使用SHOW CREATE VIEW查看视图定义。 |
| SHUTDOWN | 全局 | 允许执行mysqladmin shutdown关闭数据库。 |
| SUPER | 全局 | 允许执行管理操作(如CHANGE MASTER TO、KILL、PURGE LOGS等)。 |
| TRIGGER | 全局、数据库、表 | 允许创建、删除或执行触发器。 |
| UPDATE | 全局、数据库、表、列 | 允许更新数据库表中的数据。 |
| USAGE | 全局 | 无任何权限,仅用于创建能登录的用户。 |
- 如果用户含有的权限是ALL,意味着他拥有除 grant option 之外的所有权限。
- 如果用户唯一 的权限是USAGE,意味着他没有任何权限。
2.2 show 查看用户权限
除了通过查看user表中的字段信息可以得知用户权限,还可以通过 show 关键字来直接显示用户拥有的权限。
语法:
show grants for '用户名'@'可登录的主机IP';
-- 示例:新创建的用户没有任何权限
在user表直接查看用户信息和权限表格:
sqlSELECT * FROM user WHERE user = 'bit' and host = 'localhost';
从图中可以看到,bit用户所有 "_priv" 列的值都为N,也就是没有任何权限。
通过user表来查看用户权限表格,这样显示出来的内容太多了,很难一眼就确定用户拥有哪些权限,所以我们换一种方法。
通过show语法直接显示用户拥有的权限:
sqlshow grants for 'bit'@'localhost';可以看到,bit用户拥有的权限类型是usage,也就是没有任何权限。
以bit用户的身份登录mysql

USAGE权限下只能查看系统数据库 ,不能查看用户数据库,而 information_schema和 performance_schema 都是系统数据库。系统数据库中的表存储着元数据 ,这些元数据即使是USAGE权限的用户也是++可以通过select查询++的。
2.3 grant 授予权限
语法:
grant 权限类型1 [,权限类型2... ] on 权限等级(范围) to '用户名'@'可登录的主机IP' [ with grant option ];
- 可以同时授予多种权限给同一个用户,每种权限用逗号隔开。且每种权限的所在的权限层级都相同。
- 权限等级的限定有3种:(注意库名与表名之间有个小点 )
- 全局权限:*.* :表示所有数据库下的所有表。
- 数据库级权限:
- db_name.* :表示指定数据库下的所有表。
- * :表示作用于当前数据库,即当前数据库下的所有表 。使用前最好先用 use 关键字来确定当前所使用的数据库。
- 表级权限:
- db_name.tbl_name :表示指定数据库下的指定表。
- tbl_name :表示当前数据库下的指定表 。使用前最好先用 use 关键字来确定当前所使用的数据库。
- [ with grant option ] :可选项,允许用户将⾃⼰的权限授权给其它用户。只有权限的最初源头,才有权签发
WITH GRANT OPTION。从root那里获得此资格的用户,只是一个"执行者 ",而非"签发者"。
-- 例1:使用root用户把SELECT 权限给予bit用户,作用范围是test1数据库下的所有表
sql
grant SELECT on test1.* to 'bit'@'localhost';
show grants for 'bit'@'localhost';

此时在以bit用户的身份查看数据库,可以发现多了一个test1的数据库

-- 例2:使用root用户把ALL权限给予bit用户,作用范围是test1数据库下的所有表
由于SELECT权限是ALL权限的子集,所以授予ALL权限后,不再显示SELECT权限:
sql
grant ALL on test1.* to 'bit'@'localhost';
show grants for 'bit'@'localhost';

2.4 revoke 回收权限
语法:
revoke [ if exists ] 权限类型1 [,权限类型2... ] on 权限范围 from '用户名1'@'主机1' [,'用户名2'@'主机2'... ];
可以同时从多个用户身上回收多个权限。如果不使用 if exists 的话,必须保证权限列表、用户列表 和 权限范围 3者都互相对应。
普通用户的权限回收是"纵向的"和"直接的" ,只能作用于自己的直接下游 。遵循 **"谁授予,谁回收"**的原则,不能对 "自己下属的下属" 进行回收操作。
root用户的权限回收是**"全局的"和"任意的"**,可以作用于任何用户,并能触发级联效应。
级联效应: 当回收一个用户的权限时,如果该用户的这个权限是其他下级用户权限的唯一来源,则会把下级用户的相同类型权限一并回收。
【由root用户触发,与下级用户的权限类型有关,与下级用户权限的作用范围无关。
【如果不是唯一来源,那么该下级用户的权限不会被回收。
-- 例1:回收bit用户的SELECT权限
sql
revoke if exists SELECT on test1.* from 'bit'@'localhost';
show grants for 'bit'@'localhost';
ALL权限除去SELECT权限,剩下以下权限:

-- 例2:回收bit用户的所有权限
虽然bit用户已经没有ALL权限了,但是直接对ALL权限进行回收就能把它的子集权限也回收掉:
sql
revoke if exists ALL on test1.* from 'bit'@'localhost';
show grants for 'bit'@'localhost';

本期分享完毕,感谢大家的支持Thanks♪(・ω・)ノ








