MySQL报错“Access denied”时,应先确认用户是否存在、密码是否正确、Host是否匹配,再检查权限、bind-address、认证插件、账户状态及SQL_MODE等。
MySQL 报错 Access denied for user 'xxx'@'xxx' 时,第一件事不是调权限,而是确认这个用户真正在 mysql.user 表里、密码没输错、也没被意外删除。
SELECT User, Host FROM mysql.user WHERE User = 'your_user';
Host 字段必须匹配——'user'@'localhost' 和 'user'@'127.0.0.1' 是两个不同用户,前者走 Unix socket,后者走 TCPUPDATE mysql.user 直接改 authentication_string,优先用 ALTER USER 'user'@'host' IDENTIFIED BY 'newpass';
执行了 GRANT 不代表立刻生效,也不代表权限覆盖你当前连接的 Host 和数据库名。
SHOW GRANTS FOR 'user'@'host';,看输出里有没有你期望的库/表级权限(比如
GRANT SELECT ON `mydb`.* TO ...)GRANT SELECT ON *.*,那可以访问所有库;但若写成 GRANT SELECT ON mydb.*,就不能访问 otherdb
FLUSH PRIVILEGES; ——不过更推荐重启 mysqld 或直接用 ALTER USER/GRANT,它们会自动刷新内存权限缓存用户权限全对,还是连不上?很可能是网络层拦住了。
bind-address 默认是 127.0.0.1 或 localhost,这意味着只接受本地回环连接;远程用户需要设为 0.0.0.0 或具体 IP,且防火墙放行 3306 端口
GRANT 中的 Host 一致:用 mysql -h 127.0.0.1 -u user -p 连,就要求有 'user'@'127.0.0.1' 权限;用 mysql -h localhost 连,则匹配 'user'@'localhost'
caching_sha2_password 插件,老客户端可能不兼容,可临时改用:ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password BY 'pass';
权限和连接都对,但一执行查询就报错?可能是账户被锁或 SQL_MODE 拦截了隐式操作。
SELECT User, Host, account_locked, password_expired FROM mysql.user WHERE User = 'your_user';若
account_locked 是 Y,需执行 ALTER USER 'user'@'host' ACCOUNT UNLOCK;
CREATE TEMPORARY TABLES)在严格 SQL_MODE 下会被拒绝,尤其是开启 STRICT_TRANS_TABLES 时,建议先用 SELECT @@sql_mode; 查当前模式USE otherdb; 或跨库查询(如 SELECT * FROM otherdb.table),即使有该库权限,也可能因未显式授权而失败实际中最容易卡住的地方,是 Host 匹配和 bind-address 配置这两个点——它们不在权限表里,却决定连接能否建立。先确认你能连上,再谈能不能查。