开发人员应仅授予其负责Schema的最小必要权限,禁用GRANT ALL,按环境隔离账号与IP范围,显式禁止跨库访问,并通过实测验证权限生效。

给开发人员分配最小必要权限,不是赋 GRANT ALL
直接给 GRANT ALL ON *.* 看似省事,实际等于交出数据库钥匙。开发只需要读写自己负责的 Schema,其他库(比如 mysql、information_schema)必须显式排除。MySQL 权限是分层叠加的:全局 > 数据库 > 表 > 列,优先匹配最细粒度规则。如果先授了 ALL ON *.*,再 REVOKE 某个库,某些版本(如 5.7)可能因权限缓存导致撤回不生效。
- 用
CREATE USER 'dev_john'@'%' IDENTIFIED BY 'pwd123';单独建账号,不复用 root 或测试账号 - 只授权目标 Schema:
GRANT SELECT, INSERT, UPDATE, DELETE ON `myapp_prod`.* TO 'dev_john'@'%'; - 显式禁止跨库访问:
REVOKE ALL ON `other_app`.* FROM 'dev_john'@'%';(即使没授过,也建议写上,明确边界) - 执行
FLUSH PRIVILEGES;后才生效,但注意:仅在直接改mysql.user表时强制需要;用GRANT语句通常自动刷新
开发连的是 prod 还是 dev?权限得按环境隔离
同一个开发账号不能在 prod 和 dev 共用一套权限。常见错误是只建一个 'dev_user'@'10.20.%',结果测试脚本误连 prod 库并删了表。真实场景中,网络段、DNS 域名、甚至连接端口都该成为权限判断依据。
- 按子网区分:
GRANT ... ON `myapp_dev`.* TO 'dev_john'@'10.20.1.%';和GRANT ... ON `myapp_prod`.* TO 'dev_john'@'10.30.5.%'; - 避免通配符滥用:
'dev_john'@'%'允许从任意 IP 连,包括公网——除非你真需要远程调试,否则禁用 - 如果用跳板机或代理,IP 可能统一为内网出口地址,此时需配合应用层标识(如
SET SESSION app_env = 'dev';),但权限本身仍要靠 IP+账号双控
SHOW GRANTS 查到的权限和实际行为对不上?检查匿名用户和 host 匹配顺序
执行 SHOW GRANTS FOR 'dev_john'@'%'; 显示有权限,但连上去却报 Access denied for user,大概率是 MySQL 选错了匹配的 user@host 记录。MySQL 按 user 字段字典序、再按 host 精确度(越具体优先级越高)排序匹配,'dev_john'@'localhost' 会优先生效于 'dev_john'@'%',哪怕后者先创建。
- 查所有匹配项:
SELECT User, Host FROM mysql.user WHERE User = 'dev_john'; - 删掉干扰项:
DROP USER 'dev_john'@'localhost';(如果不需要本地登录) - 确认 host 是否被 DNS 反解扭曲:客户端连
10.20.1.100,但 MySQL 查HOSTNAME得到web01.internal,结果匹配到'dev_john'@'%.internal'—— 关键是关掉skip_name_resolve配置
开发需要建表或改结构?别直接给 ALTER,用 SQL Review 流程兜底
允许 ALTER TABLE 在 Schema 级权限下等同于开放 DDL 自主权,线上误操作风险极高。更安全的做法是:权限只开 SELECT, INSERT, UPDATE, DELETE,DDL 操作走独立流程。很多团队卡在这里,以为“开发要改字段”就必须放权,其实不是。
- 用
GRANT CREATE, INDEX, DROP ON `myapp_dev`.* TO 'dev_john'@'10.20.1.%';仅放开 dev 环境,prod 严格禁止 - 上线前 DDL 必须经 DBA 或自动化工具(如
gh-ost+pt-online-schema-change)审核,原始 SQL 不直连 prod 执行 - 如果开发真需临时加索引调试,可临时授
INDEX权限,用完立刻REVOKE,比长期开着ALTER安全得多
Schema 级权限看似简单,但 IP 匹配逻辑、host 解析、权限叠加顺序这些底层机制,稍不注意就会让“已授权”变成“未生效”或“超范围生效”。别依赖 SHOW GRANTS 的输出,一定要用目标账号连上去实测 SELECT * FROM information_schema.SCHEMATA 看能见哪些库。


















