MySQL 是一个广泛使用的关系型数据库管理系统。其权限管理功能对于保证数据库的安全性至关重要。本文将为你详细介绍 MySQL 中的权限管理。

1. MySQL 权限介绍

MySQL 中存在 4 个控制权限的表,分别为:

  • user 表
  • db 表
  • tables_priv 表
  • columns_priv 表

当前版本为 mysql 5.7.22。

MySQL 的权限验证过程如下:

  1. 先从 user 表中的 Host, User, Password 这 3 个字段中判断连接的 ip、用户名、密码是否存在。存在则通过验证。
  2. 通过身份认证后,进行权限分配,按照 user,db,tables_priv,columns_priv 的顺序进行验证。首先,会检查全局权限表 user。如果 user 中对应的权限为 Y,则此用户对所有数据库的权限都为 Y,将不再检查 db, tables_priv, columns_priv。如果为 N,则到 db 表中检查此用户对应的具体数据库,并得到 db 中为 Y 的权限;如果 db 中为 N,则检查 tables_priv 中此数据库对应的具体表,取得表中的权限 Y,以此类推。

1.1 MySQL 权限级别

权限分为以下几个级别:

  • 全局性的管理权限:作用于整个 MySQL 实例级别。
  • 数据库级别的权限:作用于某个指定的数据库上或者所有的数据库上。
  • 数据库对象级别的权限:作用于指定的数据库对象上(如表、视图等)或者所有的数据库对象上。

权限信息存储在 mysql 库的 user, db, tables_priv, columns_priv, and procs_priv 这几个系统表中。待 MySQL 实例启动后,这些权限信息就会加载到内存中。

查看 MySQL 中存在的用户:

mysql> select user,host from mysql.user;

例如,来看 root 用户在权限系统表中的数据:

mysql> use mysql; mysql> select * from user where user='root' and host='localhost'\G; #所有权限都是Y,表示具有所有权限
mysql> select * from db where user='root' and host='localhost'\G; #没有此条记录
mysql> select * from tables_priv where user='root' and host='localhost'; #没有此条记录

2. MySQL 权限详解

2.1 常见权限概览

  • All/All Privileges 权限:代表全局或者全数据库对象级别的所有权限。
  • Alter 权限:允许修改表结构的权限,但必须要求有 create 和 insert 权限配合。如果是 rename 表名,则要求有 alter 和 drop 原表, create 和 insert 新表的权限。
  • Alter routine 权限:允许修改或者删除存储过程、函数的权限。
  • Create 权限:允许创建新的数据库和表的权限。
  • Create routine 权限:允许创建存储过程、函数的权限。
  • Create tablespace 权限:允许创建、修改、删除表空间和日志组的权限。
  • Create temporary tables 权限:允许创建临时表的权限。
  • Create user 权限:允许创建、修改、删除、重命名 user 的权限。
  • Create view 权限:允许创建视图的权限。
  • Delete 权限:允许删除行数据的权限。
  • Drop 权限:允许删除数据库、表、视图的权限,包括 truncate table 命令。

2.2 其他权限相关的操作

2.2.1 查看用户权限

查看 root@localhost 用户的权限:

mysql> show grants for root@localhost;

2.2.2 设置用户资源限制

你可以通过设置全局变量 max_user_connections 来限制所有用户在同一时间连接 MySQL 实例的数量。但此参数无法对每个用户区别对待,所以 MySQL 提供了对每个用户的资源限制管理。

2.2.3 修改用户密码

修改用户密码的方式包括:

mysql> ALTER USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass'; mysql> SET PASSWORD FOR 'jeffrey'@'localhost' = PASSWORD('mypass');

你也可以在创建用户时指定密码:

mysql> CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';

2.2.4 用户账户锁定

当客户端尝试使用锁定状态的用户登录 MySQL 时,将会收到以下错误信息:

Access denied for user ‘user_name’@’host_name’. Account is locked.