mysql权限有哪些类型_常见权限说明

MySQL权限分为全局、数据库、表、列四级,逐级收敛;管理类权限控制系统行为,操作类权限面向数据CRUD;DROP、TRUNCATE、GRANT OPTION等权限影响重大,需谨慎授权;授予权限后可用SHOW GRANTS、查询mysql系统表及FLUSH PRIVILEGES验证。

MySQL权限按作用范围分四类

MySQL权限不是笼统的一套,而是按控制粒度划分为四个层级,权限逐级收敛、互不覆盖:

  • 全局权限(*.*):影响整个MySQL服务,比如CREATE USERDROP USERRELOADSUPER。授予时必须写成GRANT ... ON *.*
  • 数据库权限(db_name.*):仅对指定数据库生效,如CREATEDROPALTERGRANT OPTION。用户可建库删库,但不能碰其他库。
  • 表权限(db_name.table_name):细化到某张表,常用SELECTINSERTUPDATEDELETEINDEXTRIGGER等。
  • 列权限(db_name.table_name.column_name):最细粒度,只允许对特定字段执行SELECTUPDATE,例如GRANT SELECT(name, email) ON mydb.users TO 'u1'@'localhost';

管理类权限和操作类权限要区分

权限本质有两种用途,混淆容易导致越权或功能异常:

  • 管理类权限:不操作数据,而是控制系统行为。例如:
      • REPLICATION CLIENT — 查看主从状态(SHOW SLAVE STATUS
      • FILE — 读写服务器本地文件(LOAD DATA INFILE / SELECT ... INTO OUTFILE),风险极高,慎授
      • PROCESS — 查看所有线程(SHOW PROCESSLIST
      • SHUTDOWN — 关闭MySQL服务
  • 操作类权限:面向数据对象的常规CRUD及结构变更。例如:
      • SELECT/INSERT/UPDATE/DELETE
      • CREATE ROUTINEEXECUTE — 管理和调用存储过程
      • REFERENCES — 在建表时定义外键(需配合目标表的SELECT权限)

几个关键权限的实际影响要注意

有些权限看似普通,但实际影响超出直觉,部署时常被忽略:

  • DROP权限在表级 = 允许DROP TABLE;但在数据库级 = 允许DROP DATABASE;若授予DROP ON *.*,用户可删掉mysql系统库 —— 权限丢失、服务瘫痪。
  • TRUNCATE TABLE虽不是独立权限,但执行它需要该表的DROP权限(因底层是先删后重建)。
  • GRANT OPTION不是数据操作权,而是“转授权力”——拿到它,用户就能把已有权限再授给他人,相当于二级管理员,务必严格控制。
  • ALL PRIVILEGES ≠ 所有权限全开:它不包含GRANT OPTIONPROXY等特殊权限,显式添加才生效。

权限查看与验证方法

授完权别急着走,三步确认是否生效:

  • 查用户当前所有权限:SHOW GRANTS FOR 'user'@'host';
  • 查权限来源(哪个层级生效):SELECT * FROM mysql.db WHERE User='user' AND Host='host';(对应数据库级)
  • 权限变更后必须刷新:FLUSH PRIVILEGES;(仅当直接改mysql系统表时强制需要;用GRANT/REVOKE则自动生效,无需手动刷)