早上连数据库,命令行敲完密码,回了一行 ERROR 1045 (28000): Access denied for user root@localhost。密码明明没改过,昨晚还好好的。同一个词在不同场景反复出现,先把范围分清,能省很多时间。
MySQL 的 1045 只说明认证没过
这个报错里有两个关键信息:用户名和来源主机。MySQL 的账号是 user 加 host 的组合,root@localhost 和 root@127.0.0.1 在它眼里是两个人。从本机用 -h 参数连 127.0.0.1,走的是 TCP,匹配的是 127.0.0.1 那条记录,可能压根没建过。
- 先确认账号:还能登的话执行 select user,host from mysql.user,看有没有对应组合
- 密码忘了:停服务,用 skip-grant-tables 启动,进去改密码,改完必须 flush privileges 再正常重启
- 权限不足:1045 是认证失败,1142 才是没权限,别混着查
- 插件问题:8.0 默认 caching_sha2_password,老客户端不支持,表现出来也是认证失败
Windows 文件系统的拒绝访问
另一类出现在资源管理器:删文件提示需要权限,或者进某个目录被拒。右键属性看安全选项卡,当前用户不在列表里,或者只给了读取。命令行可以用 icacls 查看和授权,takeown 拿所有权。系统盘下的目录多半归 TrustedInstaller 管,硬改有风险,先确认是不是真的需要动。
这类问题常见的诱因是重装系统后用户 SID 变了,老文件的 ACL 里还留着旧的 SID,看着像自己没有权限。加一条当前用户的完全控制,比整个盘重设权限安全得多。
Web 服务的 403
Apache 的目录禁止列表会返回 403 Forbidden,日志里写 client denied by server configuration,对应配置里的 Require all denied。IIS 常是身份验证配错,匿名账户没开。Nginx 则是目录没有 index 文件又没开 autoindex。
排查顺序建议固定:先看日志原文,再确认是哪个组件拒绝的,最后才改配置。上来就搜一句报错然后照抄网上的命令,很容易把能用的环境改坏。动之前备份一份原配置,这个习惯值钱。