MySQL“Access denied”报错需先确认用户名、连接参数、Host匹配三要素;1045是登录认证失败,1142是登录后权限不足;8.0创建用户应显式指定caching_sha2_password插件并授予最小必要权限。

MySQL报错“Access denied for user”怎么快速定位
这不是权限配置错了,就是连接参数对不上。最常见的是用root用户连远程库时没开远程访问,或者密码输错但误以为是权限问题。先确认三件事:
– 当前用的用户名是不是SELECT USER();返回的那个
– 连接命令里写的-u和-p是否匹配mysql.user表里的记录
– 如果是远程连接,检查Host字段是不是%或对应IP,不是localhost
GRANT语句执行后权限不生效的常见原因
执行了GRANT SELECT ON db1.* TO 'u1'@'%';却还是报错,大概率卡在两个地方:
– 忘记加FLUSH PRIVILEGES;(虽然5.7+多数情况自动刷新,但某些配置下仍需手动触发)
– 用户host不匹配:比如创建的是'u1'@'192.168.1.%',但你从192.168.1.100连,结果发现子网掩码没覆盖到
– 权限层级搞错:给db1.table1授了权,但SQL里查的是db1.table2,或者用了USE db2;再查table1,这时需要数据库级或全局权限
ERROR 1045 (28000)和ERROR 1142的区别怎么看
ERROR 1045 (28000)是认证失败,属于登录阶段问题;ERROR 1142才是权限不足,说明已成功登录,只是操作被拒。
– 出现1045:检查mysql.user表中User、Host、authentication_string三列,注意MySQL 8.0默认用caching_sha2_password插件,旧客户端可能不兼容
– 出现1142:运行SHOW GRANTS FOR 'u1'@'%';看实际分配的权限,注意USAGE不等于“什么都能干”,它只是登录权限
MySQL 8.0创建用户并授权的最小安全写法
别再用INSERT INTO mysql.user硬插了,容易漏掉plugin或account_locked字段。标准流程是:
– 创建用户并设密码(显式指定认证插件,避免客户端兼容问题):
CREATE USER 'app_rw'@'10.0.2.%' IDENTIFIED WITH caching_sha2_password BY 'StrongPass!2024';
– 授予最小必要权限:
GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'app_rw'@'10.0.2.%';
– 刷新权限(保险起见):
FLUSH PRIVILEGES;
注意:不要用
GRANT ALL PRIVILEGES,尤其不能给mysql系统库授权;Host尽量具体,不用%除非真需要泛域名访问
权限体系本身不复杂,但Host匹配逻辑、认证插件变更、大小写敏感性(比如user表中Host值区分大小写)、以及FLUSH PRIVILEGES的触发时机,这几个点最容易反复踩坑。










