MySQL错误代码1045的全称是Access denied for user,意思是当前使用的账号没有权限访问对应的MySQL服务,这是数据库运维和开发过程中非常常见的登录类报错,多数情况下和账号密码、用户权限、主机限制三个维度的问题相关。

错误代码1045的常见触发场景
在出现该错误时,命令行或者客户端通常会返回类似如下的提示信息:
ERROR 1045 (28000): Access denied for user 'test_user'@'192.168.0.101' (using password: YES)
常见的触发场景包括:输入了错误的数据库账号或密码、使用的账号没有被授予对应数据库的访问权限、当前登录的客户端主机不在账号允许登录的主机范围内。
第一步:排查账号密码是否正确
首先确认输入的账号和密码是否和MySQL中存储的一致,如果你有root账号的权限,可以登录到MySQL服务后查看用户对应的密码信息:
-- 查看所有用户和对应的主机信息,authentication_string是加密后的密码 SELECT user, host, authentication_string FROM mysql.user;
如果不确定密码是否正确,可以尝试用root账号重置目标用户的密码:
-- 重置test_user的密码为new_password,注意替换成实际密码 ALTER USER 'test_user'@'localhost' IDENTIFIED BY 'new_password'; -- 刷新权限使修改生效 FLUSH PRIVILEGES;
第二步:排查用户权限配置问题
如果密码确认正确,接下来需要检查该用户是否拥有对应数据库的访问权限,可以通过以下命令查看用户的权限详情:
-- 查看test_user在localhost主机的所有权限 SHOW GRANTS FOR 'test_user'@'localhost';
如果用户没有对应库的权限,需要手动授予权限,例如授予test_user对test_db数据库的所有权限:
-- 授予test_user对test_db的所有操作权限 GRANT ALL PRIVILEGES ON test_db.* TO 'test_user'@'localhost'; FLUSH PRIVILEGES;
第三步:排查主机限制问题
MySQL的用户是由用户名+主机共同组成的,比如'test_user'@'localhost'和'test_user'@'192.168.0.%'是两个完全不同的用户,如果你从192.168.0.101的机器登录,但是用户只允许localhost登录,就会触发1045错误。
可以通过以下命令查看用户允许登录的主机范围:
SELECT user, host FROM mysql.user WHERE user = 'test_user';
如果当前客户端主机不在允许范围内,可以修改用户的主机限制,或者新建允许对应主机登录的用户:
-- 修改已有用户的主机为允许所有IP登录,生产环境不建议使用% UPDATE mysql.user SET host = '%' WHERE user = 'test_user' AND host = 'localhost'; FLUSH PRIVILEGES; -- 或者新建允许192.168.0网段登录的用户 CREATE USER 'test_user'@'192.168.0.%' IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON test_db.* TO 'test_user'@'192.168.0.%'; FLUSH PRIVILEGES;
常见注意事项
- 每次修改用户权限、密码、主机信息后,都需要执行
FLUSH PRIVILEGES命令刷新权限,否则修改不会生效。 - 生产环境尽量不要将用户的主机设置为%,避免产生安全风险,建议根据实际需要限制允许登录的IP范围。
- 如果使用的是MySQL 8.0及以上版本,默认的密码认证插件是caching_sha2_password,部分旧客户端可能不支持,可以修改用户的认证插件为mysql_native_password。
-- 修改用户认证插件为mysql_native_password ALTER USER 'test_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; FLUSH PRIVILEGES;