本篇带领对用户的授权和回收似懂非懂的朋友进行简单剖析,希望能起到抛砖引玉的效果。放弃前戏,直奔主题!!!
实战未动,语法先行
1. 在MySQL中,拥有GRANT权限的用户才可以执行GRANT语句,其语法格式如下:
GRANT priv_type [(column_list)] ON database.table
TO user [IDENTIFIED BY [PASSWORD] 'password']
[, user[IDENTIFIED BY [PASSWORD] 'password']] ...
[WITH with_option [with_option]...]
priv_type 参数表示权限类型; columns_list 参数表示权限作用于哪些列上,省略该参数时,表示作用于整个表; database.table 用于指定权限的级别; user 参数表示用户账户,由用户名和主机名构成,格式是“'username'@'hostname'”; IDENTIFIED BY 参数用来为用户设置密码; password 参数是用户的新密码。
2. WITH 关键字后面带有一个或多个 with_option 参数。这个参数有 5 个选项,详细介绍如下:
GRANT OPTION:被授权的用户可以将这些权限赋予给别的用户; MAX_QUERIES_PER_HOUR count:设置每个小时可以允许执行 count 次查询; MAX_UPDATES_PER_HOUR count:设置每个小时可以允许执行 count 次更新; MAX_CONNECTIONS_PER_HOUR count:设置每小时可以建立 count 个连接; MAX_USER_CONNECTIONS count:设置单个用户可以同时具有的 count 个连接。
3. MySQL 中可以授予的权限有如下几组:
列权限,和表中的一个具体列相关。例如,可以使用 UPDATE 语句更新表 students 中 name 列的值的权限。 表权限,和一个具体表中的所有数据相关。例如,可以使用 SELECT 语句查询表 students 的所有数据的权限。 数据库权限,和一个具体的数据库中的所有表相关。例如,可以在已有的数据库 mytest 中创建新表的权限。 用户权限,和 MySQL 中所有的数据库相关。例如,可以删除已有的数据库或者创建一个新的数据库的权限。
4. 对应地,在 GRANT 语句中可用于指定权限级别的值有以下几类格式:
*:表示当前数据库中的所有表。 *.*:表示所有数据库中的所有表。 db_name.*:表示某个数据库中的所有表,db_name 指定数据库名。 db_name.tbl_name:表示某个数据库中的某个表或视图,db_name 指定数据库名,tbl_name 指定表名或视图名。 db_name.routine_name:表示某个数据库中的某个存储过程或函数,routine_name 指定存储过程名或函数名。
权限类型那点事
1. 授予数据库权限时,<权限类型>可以指定为以下值:

因笔者比较懒,上面截图是直接摘自互联网,如有侵权请告知,将会在第一时间删除。
2. 授予表权限时,<权限类型>可以指定为以下值:

因笔者比较懒,上面截图是直接摘自互联网,如有侵权请告知,将会在第一时间删除。
3. 授予列权限时
<权限类型>的值只能指定为 SELECT、INSERT 和 UPDATE,同时权限的后面需要加上列名列表 column-list。
4. 最有效率的权限是用户权限。
授予用户权限时,<权限类型>除了可以指定为授予数据库权限时的所有值之外,还可以是下面这些值:
CREATE USER:表示授予用户可以创建和删除新用户的权限。 SHOW DATABASES:表示授予用户可以使用 SHOW DATABASES 语句查看所有已有的数据库的定义的权限。
原理略懂,直接开干(实战)
1. 创建用户并授权
注意,mysql8或以上版本已经废弃了grant的一个特性:如果权限被授予给一个不存在的用户,MySQL 会自动执行一条 CREATE USER 语句来创建这个用户,但同时必须为该用户设置密码。(注意,该特性已在mysql8或以上版本废弃了)
mysql> CREATE USER 'ttr2'@'%' IDENTIFIED BY 'ttr2';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'ttr2'@'%' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;
2. 查看用户权限
# 查看普通用户权限,方式1
mysql> show grants for ttruser1@localhost;
+----------------------------------------------+
| Grants for ttruser1@localhost |
+----------------------------------------------+
| GRANT USAGE ON *.* TO `ttruser1`@`localhost` |
+----------------------------------------------+
# 查看普通用户权限,方式2
mysql> select * from mysql.user where user="ttruser1" and host="localhost"\G;
# 查看root用户权限
mysql> show grants for root@localhost\G;
新创建的普通用户默认是没有任何权限,只能登录进去 查看刚创建完的用户,查看权限,USAGE ON *.*表示该用户对任何数据库和任何表都没有权限。
3. 给用户授权(各种场景)
授权所有权限给ttr1@localhost用户(已经和root权限是一样的,也可以说ttr1也是额外的管理员了)
grant all privileges on *.* to ttr1@localhost;
# 或
grant all on *.* to ttr1@localhost;
# 或
grant super on *.* to ttr1@localhost;
授予具体的查权限(select)给tantianran用户
grant select on *.* to tantianran@localhost;
让用tantianran只能查zabbixdb库的hosts表里的name字段
grant select(name) on zabbixdb.hosts to tantianran@localhost;
允许root用户可远程连接到mysql数据库
# 查看
mysql> select user,host from mysql.user;
+------------------+----------------+
| user | host |
+------------------+----------------+
| zabbix | % |
| syn_a | 192.168.11.152 |
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost | # 可以看到root用户的当前主机配置信息为localhost
+------------------+----------------+
6 rows in set (0.00 sec)
# 修改Host为通配符%
update mysql.user set host='%' where user='root';
# Host修改完成后记得执行flush privileges使配置立即生效
flush privileges;
# 修改root账户的密码,并将加密方法由caching_sha2_password修改为mysql_native_password
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'Root.123456';
知识拓展:Host列指定了允许用户登录所使用的IP,比如user=root Host=192.168.1.1。这里的意思就是说root用户只 能通过192.168.1.1的客户端去访问。user=root Host=localhost,表示只能通过本机客户端去访问。而 % 是个 通配符 ,如果Host=192.168.1.%,那么就表示只要是IP地址前缀为“192.168.1.”的客户端都可以连 接。如果 Host=% ,表示所有IP都有连接权限。注意:在生产环境下不能为了省事将host设置为%,这样做会存在安全问题,具体的设置可以根据生产环境的IP进行设置。
4. 回收用户权限
revoke all privileges on *.* from tantianran@localhost; # 回收所有权限
revoke select on *.* from tantianran@localhost; # 回收掉具体的权限
写在最后
本篇只是简单剖析,后续笔者抽空再来一次更深入、更彻底的剖析。时间有限,就此搁笔。望多多关注、点赞、转发!
文章转载自TtrOpsStack,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




