MySQL权限需按角色分层管控:root仅用于初始化与灾备,应用账号限SELECT/INSERT/UPDATE/DELETE,运维账号可查状态但不可访问业务数据,开发账号仅限开发库;须禁用远程root、定期审计高危权限、绑定IP、设密码过期策略,并通过FLUSH PRIVILEGES和SHOW GRANTS验证。

MySQL安装完成后,权限不能全给root,也不能全不给——得按角色分清楚,谁该看什么、能改哪些、能不能删库,必须提前规划好。
基础权限分层原则
权限设计要遵循最小必要原则:只给业务实际需要的权限,不因图省事而授予权限过大。
- 超级管理员(如root):仅用于初始化、灾备恢复、全局配置调整,日常不登录使用
- 应用账号:限定到具体数据库,只开放SELECT/INSERT/UPDATE/DELETE,禁用DROP、CREATE、ALTER、GRANT等高危操作
- 运维账号:可查性能状态(SHOW PROCESSLIST、SHOW STATUS)、管理慢日志、执行备份命令,但不可访问业务数据表
- 开发/测试账号:仅限开发库,允许建表、删表、清空数据,但禁止访问生产库及系统库(mysql、information_schema等)
常用权限分配示例
以一个电商系统为例,假设业务库名为ecommerce_db:
- 应用连接账号:
GRANT SELECT, INSERT, UPDATE, DELETE ON ecommerce_db.* TO 'app_user'@'192.168.10.%' IDENTIFIED BY 'pwd123'; - 报表查询账号:
GRANT SELECT ON ecommerce_db.orders TO 'report_user'@'10.0.5.%';(只查orders表) - DBA维护账号:
GRANT RELOAD, PROCESS, SHOW DATABASES, LOCK TABLES ON *.* TO 'dba_admin'@'10.0.1.%';(不碰业务数据) - 禁止远程root登录:
UPDATE mysql.user SET host='localhost' WHERE user='root' AND host!='localhost'; FLUSH PRIVILEGES;
权限回收与定期审计要点
权限不是设一次就完事,需持续管理:
- 离职或转岗人员账号立即禁用:
REVOKE ALL PRIVILEGES ON *.* FROM 'old_user'@'%'; DROP USER 'old_user'@'%'; - 每季度检查高危权限持有者:
SELECT user,host,Select_priv,Insert_priv,Drop_priv,Create_priv,Grant_priv FROM mysql.user WHERE Drop_priv='Y' OR Grant_priv='Y'; - 避免通配符滥用:不用
'%'@'%',优先绑定内网IP段或跳板机地址 - 密码策略同步启用:
ALTER USER 'app_user'@'%' PASSWORD EXPIRE INTERVAL 90 DAY;
权限生效与验证方式
赋权后必须验证是否生效,且确认实际行为符合预期:
- 执行
FLUSH PRIVILEGES;确保内存权限表刷新(部分版本自动刷新,但显式执行更稳妥) - 用对应账号登录后,运行
SHOW GRANTS;查看当前权限清单 - 模拟业务操作验证:比如用app_user尝试
DROP TABLE products;,应明确报错Access denied - 检查错误日志:
tail -f /var/log/mysql/error.log,留意拒绝类记录(Access denied for user)










