先执行SELECT USER(), CURRENT_USER()确认实际认证账号,再用SHOW GRANTS FOR CURRENT_USER()查真实权限;两者不一致说明MySQL按host匹配选中了权限更小的同名用户,SHOW GRANTS仅反映CURRENT_USER()对应记录的权限。
先执行 SELECT USER(), CURRENT_USER(); —— 90% 的“权限不足”根本不是没授权,而是你连的根本不是你以为的那个用户。
MySQL 权限校验只认 CURRENT_USER() 返回的账号,不是你登录时写的那个。比如 USER() 是 'app'@'192.168.1.100',而 CURRENT_USER() 是 'app'@'%',那就要立刻查后者有没有被授过权。
SHOW GRANTS FOR CURRENT_USER(); —— 这是唯一反映当前会话真实权限的命令;别用 SHOW GRANTS FOR 'app'@'192.168.1.100',它可能根本不存在或不生效GRANT USAGE ON *.* TO ...,说明这个账号只允许登录,不能操作任何对象otherdb.table)必须显式授权:仅 GRANT SELECT ON mydb.* 不够,得补 GRANT SELECT ON otherdb.table TO ...
CURRENT_USER() 可能有角色但没激活:检查是否执行了 SET ROLE role_name;,或配置了 activate_all_roles_on_login=ON
错误信息里藏着关键线索,比如 ERROR 1142 (42000): SELECT command denied to user 'u'@'localhost' for table 'mysql.user',说明缺的是对 mysql.user 表的 SELECT 权限,不是整个 mysql 库。
SHOW GRANTS FOR CURRENT_USER() ON mysql.user;(MySQL 8.0.16+ 支持)直接验证该表权限,旧版本跳过即可ERROR 1449(DEFINER 账号不存在)或 ERROR 1142(DEFINER 有账号但缺基表权限),此时要查 SHOW CREATE VIEW view_nameG 看 DEFINER 和 SQL SECURITY
SHOW VIEW 权限,否则报 ERROR 1349,跟语法无关mysqldump 失败,除了 SELECT,还必须有 SHOW VIEW、TRIGGER、LOCK TABLES
权限写了,FLUSH PRIVILEGES; 也执行了,还是报错?大概率卡在连接层。
'u'@'localhost' 和 'u'@'127.0.0.1' 是两个不同账号;Linux 下 localhost 走 socket,127.0.0.1 走 TCP,应用连哪个,就得给哪个授权FLUSH PRIVILEGES; 在用 GRANT 授权后通常自动触发,但直接改 mysql.user 表后必须手动执行;不过——千万别直接改系统表,风险高且不可靠''@'localhost' 时,它会优先匹配无用户名的连接,导致权限意外降级:用 DROP USER ''@'localhost'; 清理最易被忽略的点:CURRENT_USER() 返回的账号,其 plugin 字段是否兼容客户端?MySQL 8.0 默认用 caching_sha2_password,老客户端连不上会报 ERROR 1045,看起来像权限问题,其实是认证失败。
Tplink企业版路由器WiFi名称的默认设置介绍(Tplink企业版路由器WiFi名称的默认设置是什么)
Tplink路由器灯常亮无法上网的原因分析(如何解决Tplink路由器灯常亮无法上网的问题)
Tplink千兆企业级路由器自动重启的作用和优势介绍(如何设置Tplink千兆企业级路由器自动重启功能)
一根天线的tplink路由器有哪些(一根天线的Tplink路由器的特点和优势介绍)
tplink路由器外网访问不了nas(Tplink路由器外网访问NAS的原因分析)
Tplink无法搜到路由器的原因分析(如何解决Tplink无法搜到路由器的问题)