MySQL 多用户环境下的权限管理,核心是“最小权限原则”+“角色化分层控制”。直接给 root 权限或全库 GRANT 是高危操作,应按业务角色划分账号,精确到库、表、甚至列和操作类型。
一、按角色创建专用账号,避免共用账户
不同职能人员(如开发、运维、BI 分析师)应使用独立账号,禁止多人共享同一账号。账号命名建议带角色前缀,例如:
dev_app1(应用开发)、dba_backup(备份运维)、bi_report(只读报表)。
CREATE USER 'dev_app1'@'192.168.10.%' IDENTIFIED BY 'StrongPass!2024';限制登录来源 IP 段,提升基础安全性 禁用空密码、弱密码;建议配合 validate_password 插件强制密码复杂度
二、精细授权:从库级到列级逐层收敛
权限粒度越细,风险越低。优先用
GRANT ... ON database.*,慎用
ON *.*;必要时限制到单表或字段。 开发账号只需对业务库有 SELECT/INSERT/UPDATE(不含 DROP/ALTER):
GRANT SELECT, INSERT, UPDATE ON myapp_db.* TO 'dev_app1'@'192.168.10.%';报表账号仅需 SELECT,且可限制到特定视图或只读表:
GRANT SELECT ON myapp_db.v_sales_summary TO 'bi_report'@'%';敏感字段(如 user.email、order.card_no)可用视图 + 列权限隐藏:
GRANT SELECT(id, username, created_at) ON myapp_db.users TO 'bi_report'@'%';
三、用角色(Role)统一管理权限组(MySQL 8.0+)
角色让权限复用更高效。例如定义一个
app_developer角色,把常用权限一次性赋予,再将角色分配给多个账号。 创建并授权角色:
CREATE ROLE 'app_developer';<br>GRANT SELECT, INSERT, UPDATE ON myapp_db.* TO 'app_developer';将角色赋予用户:
GRANT 'app_developer' TO 'dev_app1'@'192.168.10.%';启用角色(会话级):
SET ROLE 'app_developer';或设为默认:
SET DEFAULT ROLE 'app_developer' TO 'dev_app1'@'192.168.10.%';
四、定期审计与清理,防止权限腐化
权限不是一劳永逸。上线后、人员变动、系统重构时,必须复查账号与权限。
查所有非系统账号:SELECT User, Host FROM mysql.user WHERE User NOT IN ('mysql.infoschema','mysql.session','mysql.sys','root');
查某账号具体权限:SHOW GRANTS FOR 'dev_app1'@'192.168.10.%';回收过期权限或删除离职人员账号:
DROP USER 'ex_employee'@'%';建议每季度执行一次权限基线比对,结合自动化脚本导出并校验
不复杂但容易忽略:每次授权后务必执行
FLUSH PRIVILEGES;(仅在直接修改 mysql 表时需要),常规 GRANT 语句会自动生效。权限变更无需重启 MySQL。
