mysql的权限体系按照作用范围分为多个层级,其中全局权限和库级权限是最常用的两类权限,两者的核心差异体现在权限生效的范围和可执行的操作上,合理区分两者能大幅提升数据库权限管理的规范性和安全性。

mysql权限层级基础概念
mysql的权限体系采用分层设计,从全局到具体对象逐层细化,不同层级的权限优先级和生效范围各不相同。常见的权限层级从高到低依次为全局层级、数据库层级、表层级、列层级、子程序层级,其中全局权限和库级权限是管理数据库整体访问能力的基础权限类型。
全局权限的定义与特点
全局权限是作用在mysql整个数据库实例上的权限,拥有全局权限的用户可以对实例内的所有数据库、所有表执行对应操作,这类权限的权限信息存储在mysql.user系统表中。
全局权限的作用范围
全局权限的生效范围是整个mysql实例,不受具体数据库、表的限制。例如拥有全局SELECT权限的用户,可以查询实例下所有数据库的所有表数据;拥有全局CREATE权限的用户,可以在实例内任意创建新的数据库。
常见的全局权限类型
- SUPER:允许执行超级管理员操作,比如修改全局变量、终止其他用户的连接等
- PROCESS:允许查看所有用户的进程信息
- RELOAD:允许执行刷新日志、重置缓存等重载操作
- SHUTDOWN:允许关闭mysql实例
- CREATE USER:允许创建、删除、修改其他用户
- 全局的
SELECT、INSERT、UPDATE、DELETE:允许对所有数据库的所有表执行对应DML操作
全局权限的配置示例
给用户admin授予所有全局权限的语句如下:
-- 授予admin用户所有全局权限,允许从任意主机连接 GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION; -- 刷新权限使配置生效 FLUSH PRIVILEGES;
上述语句中*.*的第一个*代表所有数据库,第二个*代表所有表,是全局权限的典型标识。
库级权限的定义与特点
库级权限是仅作用在指定数据库上的权限,拥有库级权限的用户只能对单个或多个指定数据库内的所有对象执行对应操作,权限信息存储在mysql.db系统表中。
库级权限的作用范围
库级权限的生效范围被限定在指定的数据库内,无法操作其他数据库的对象。例如给用户授予test_db数据库的SELECT权限,该用户只能查询test_db库下的所有表,无法查询其他库的数据,也不能创建新的数据库。
常见的库级权限类型
- 库级的
SELECT、INSERT、UPDATE、DELETE:仅允许对指定库的所有表执行对应DML操作 - CREATE:允许在指定库内创建新的表、视图等对象
- DROP:允许删除指定库内的表、视图等对象
- ALTER:允许修改指定库内表的结构
- INDEX:允许在指定库的表上创建、删除索引
库级权限的配置示例
给用户dev_user授予test_db数据库的所有权限的语句如下:
-- 授予dev_user用户test_db数据库的所有权限 GRANT ALL PRIVILEGES ON test_db.* TO 'dev_user'@'192.168.0.1'; -- 刷新权限使配置生效 FLUSH PRIVILEGES;
上述语句中test_db.*代表test_db数据库下的所有表,是库级权限的典型标识。
全局权限和库级权限的核心区别
两者的差异可以从多个维度进行对比,具体区别如下表所示:
| 对比维度 | 全局权限 | 库级权限 |
|---|---|---|
| 作用范围 | 整个mysql实例,覆盖所有数据库和表 | 仅指定的单个或多个数据库,不影响其他库 |
| 存储系统表 | mysql.user | mysql.db |
| 权限标识 | 权限授予时对象为*.* | 权限授予时对象为库名.* |
| 适用角色 | 数据库管理员、需要跨库操作的超级用户 | 业务开发用户、仅需操作单个库的用户 |
| 安全风险 | 权限过大,泄露后影响整个实例数据安全 | 权限受限,即使泄露也仅影响指定库的数据 |
| 常见权限类型 | SUPER、PROCESS、RELOAD、全局DML权限等 | 库级DML权限、CREATE、DROP、ALTER等 |
权限生效的优先级规则
当用户同时拥有全局权限和库级权限时,mysql会按照权限范围从细到粗的优先级生效,即列级权限 > 表级权限 > 库级权限 > 全局权限。例如用户同时拥有全局SELECT权限和test_db库的SELECT权限,执行查询时仍以库级权限的范围为准,仅能查询test_db库的数据,除非全局权限的范围更大才会生效。
权限管理的最佳实践
- 遵循最小权限原则,仅给用户授予完成工作必需的最小范围权限,普通业务用户优先授予库级权限,避免直接授予全局权限
- 禁止使用
GRANT ALL ON *.*给普通用户授予权限,仅管理员账号可拥有必要的全局权限 - 定期查询
mysql.user和mysql.db表,清理不必要的全局权限和过期库级权限 - 给不同业务分配独立的数据库,通过库级权限隔离不同业务的访问范围,避免数据互相干扰
查询当前用户权限的语句如下,可用来验证权限配置是否符合预期:
-- 查询当前登录用户的所有权限 SHOW GRANTS; -- 查询指定用户的权限,例如查询dev_user的权限 SHOW GRANTS FOR 'dev_user'@'192.168.0.1';
注意:修改权限后必须执行FLUSH PRIVILEGES语句,或者重启mysql实例,权限配置才会生效。直接修改权限系统表后也必须执行该语句刷新权限缓存。