mysql新用户连不上主因是缺usage权限,该权限赋予连接和使用数据库能力,仅grant select不包含登录权;还需排查残留super等高危权限、information_schema访问缺失、主机/库名格式错误等问题。

直接给开发人员配只读账号,不能只跑一条 GRANT SELECT 就完事——漏掉 USAGE 连不进库,没清掉残留的 SUPER 或 LOCK TABLES 权限,就等于开了后门。
为什么新用户连不上?多半是缺 USAGE 权限
MySQL 新建用户默认没有连接权,GRANT SELECT 只给操作权,不自动带登录能力。开发用客户端一连就报 ERROR 1045 (28000): Access denied,八成是这原因。
- 必须显式补上连接权限:
GRANT USAGE ON *.* TO 'dev_ro'@'192.168.5.%'; -
USAGE不等于“空权限”,它代表“允许连接+使用数据库”,但不做任何数据操作 - 这条语句可和
GRANT SELECT分开执行,顺序无所谓;但不能省
GRANT SELECT 后仍能写表?说明有残留写权限
权限是叠加的,不是覆盖的。如果这个账号以前被授过 ALL PRIVILEGES 或从角色继承了 INSERT,只加 SELECT 完全无效。
- 先查清底细:
SHOW GRANTS FOR 'dev_ro'@'192.168.5.%'; - 看到
INSERT、UPDATE、DROP、CREATE TEMPORARY TABLES等任意一项,都得立刻REVOKE - 重点盯
SUPER:SELECT User, Host, Super_priv FROM mysql.user WHERE User = 'dev_ro';,结果为Y必须REVOKE SUPER ON *.* - 别信“我只授了 SELECT”——旧权限不会自动消失
开发常用命令失败?可能是 information_schema 权限没跟上
开发连上后常跑 SHOW CREATE TABLE users; 或 DESCRIBE orders;,这些依赖 information_schema 查询,而默认不包含在 GRANT SELECT ON db.* 里。
- MySQL 8.0+ 默认限制对
information_schema的访问,需单独授权:GRANT SELECT ON `information_schema`.`TABLES` TO 'dev_ro'@'192.168.5.%'; - 如果还要看列注释或函数定义,再加:
GRANT SELECT ON `information_schema`.`COLUMNS` TO ... - 不要授
INFORMATION_SCHEMA.*全库——暴露太多元数据,够用即可 -
SELECT FOR UPDATE必然失败,这不是配置错,是锁机制需要额外权限,只读账号不该也不需支持
IP 和库名细节不注意,权限就白设
生产环境最常踩的两个坑:主机名用 '%' 放行所有 IP,以及库名含短横线或关键字却没加反引号。
- 开发账号建议限定内网段:
'dev_ro'@'192.168.5.%',别用'%' - 库名如
user-analytics或order_db,必须用反引号:GRANT SELECT ON `user-analytics`.* TO ... - 跨多个业务库只读?逐个授权:
GRANT SELECT ON `sales`.* TO ...、GRANT SELECT ON `log`.* TO ...,别偷懒用*.* -
FLUSH PRIVILEGES;在 MySQL 8.0.16+ 非必需,但低版本或某些中间件(如 ProxySQL)要求它,建议保留
真正安全的只读账号,不是“没给写权限”,而是“确认没留任何绕过路径”——SUPER、LOCK TABLES、EXECUTE、TRIGGER、甚至 SHOW VIEW(视图定义可能含副作用),都得一个个核对。开发要的是能查、能看结构、连得上;不是给你一个能绕过权限模型的账号。











