应精确授予SELECT权限至具体表并限制IP段,GRANT后无需FLUSH PRIVILEGES,USAGE权限不可撤销且无需操作,使用mysql_native_password需确保插件已加载或配置默认认证插件。

只给查询权限,别误开SELECT以外的门
给业务账号只读权限时,很多人直接写 GRANT SELECT ON db.* TO 'user'@'%',看起来安全,但漏掉两个关键点:一是没加 WITH GRANT OPTION 的显式禁止(虽然默认不带,但显式省略易被误读),二是没限制表级粒度——如果数据库里有敏感日志表或配置表,db.* 会一并放开。真正最小化,得精确到具体表:GRANT SELECT ON db.orders TO 'reporter'@'10.20.%'。IP 段限制也建议加上,避免用 '%' 裸奔。
GRANT后必须FLUSH PRIVILEGES吗?
不需要。MySQL 5.7.6+ 和所有 8.0 版本中,GRANT 语句本身就会立即刷新权限缓存。执行 FLUSH PRIVILEGES 不仅多余,还可能掩盖问题:比如你刚 GRANT 了但忘了 IDENTIFIED BY 设密码,这时 flush 并不会帮你补上认证逻辑。常见错误现象是:命令没报错,但新用户连不上——八成是没设密码或 host 匹配失败。检查用:SELECT host,user,authentication_string FROM mysql.user WHERE user='xxx';
不能删USAGE权限,但可以清空它
新建用户时 MySQL 默认赋予 USAGE 权限,它代表“能连上但啥都不能干”。有人想彻底剥夺这个基础权限,去执行 REVOKE ALL ON *.* FROM 'u'@'h',结果发现用户反而连都连不上,报错 Access denied for user。这是因为 USAGE 不是普通权限,不能被 revoke;它只是个占位符。正确做法是:先 CREATE USER,再 GRANT 明确需要的权限,其余什么也不给——USAGE 会自然存在,但不赋予任何能力。别碰它,也别试图删它。
用mysql_native_password插件时权限生效延迟
在 MySQL 8.0 默认使用 caching_sha2_password 插件的前提下,如果为兼容老客户端显式指定 IDENTIFIED WITH mysql_native_password,权限仍会生效,但首次连接可能卡顿或报 Plugin 'mysql_native_password' is not loaded。这不是权限问题,而是插件未加载。解决方法只有两个:INSTALL PLUGIN mysql_native_password SONAME 'auth_socket.so'(不推荐),或更稳妥地:在 my.cnf 中加 default_authentication_plugin=mysql_native_password 并重启。否则即使 GRANT 写对了,用户也会因认证失败而无法触发权限校验。


















