MySQL权限按作用范围分四类
MySQL权限不是笼统的一套,而是按控制粒度划分为四个层级,权限逐级收敛、互不覆盖:
全局权限(*.*):影响整个MySQL服务,比如CREATE USER、
DROP USER、
RELOAD、
SUPER。授予时必须写成
GRANT ... ON *.*。 数据库权限(db_name.*):仅对指定数据库生效,如
CREATE、
DROP、
ALTER、
GRANT OPTION。用户可建库删库,但不能碰其他库。 表权限(db_name.table_name):细化到某张表,常用
SELECT、
INSERT、
UPDATE、
DELETE、
INDEX、
TRIGGER等。 列权限(db_name.table_name.column_name):最细粒度,只允许对特定字段执行
SELECT或
UPDATE,例如
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 ROUTINE、
EXECUTE— 管理和调用存储过程
•
REFERENCES— 在建表时定义外键(需配合目标表的
SELECT权限)
几个关键权限的实际影响要注意
有些权限看似普通,但实际影响超出直觉,部署时常被忽略:
DROP权限在表级 = 允许
DROP TABLE;但在数据库级 = 允许
DROP DATABASE;若授予
DROP ON *.*,用户可删掉
mysql系统库 —— 权限丢失、服务瘫痪。
TRUNCATE TABLE虽不是独立权限,但执行它需要该表的
DROP权限(因底层是先删后重建)。
GRANT OPTION不是数据操作权,而是“转授权力”——拿到它,用户就能把已有权限再授给他人,相当于二级管理员,务必严格控制。
ALL PRIVILEGES≠ 所有权限全开:它不包含
GRANT OPTION和
PROXY等特殊权限,显式添加才生效。
权限查看与验证方法
授完权别急着走,三步确认是否生效:
查用户当前所有权限:SHOW GRANTS FOR 'user'@'host';查权限来源(哪个层级生效):
SELECT * FROM mysql.db WHERE User='user' AND Host='host';(对应数据库级) 权限变更后必须刷新:
FLUSH PRIVILEGES;(仅当直接改
mysql系统表时强制需要;用
GRANT/REVOKE则自动生效,无需手动刷)
