问题根源分析
错误代码 1045 的核心原因只有一个:MySQL 服务器拒绝你提供的连接凭证(用户名、密码、主机)。

这通常由以下四种情况之一导致:
- 密码错误:你输入的密码不正确。
- 用户名错误:你使用的用户名在 MySQL 中不存在。
- 主机名错误:你尝试连接的主机(IP 地址或域名)不被该用户允许。
- 权限问题:用户存在,但被
mysql.user表中的plugin或authentication_string字段配置得有问题(使用了auth_socket插件而没有提供密码)。
解决方案:分步排查指南
请按照以下步骤逐一检查,这能解决 99% 的 1045 错误。
第 1 步:检查最常见的原因 - 密码
这是最容易犯也最容易解决的问题。
- 确认大小写:MySQL 密码是区分大小写的,请确保你输入的密码大小写完全正确。
- 检查空格:复制粘贴密码时,不要不小心复制了前后的空格。
- 重置密码:如果你怀疑自己忘记了密码,请跳到下面的【终极解决方案:重置 root 密码】部分。
第 2 步:检查连接命令中的用户名和主机
你连接时使用的命令通常是:mysql -u [用户名] -p -h [主机名]

- 检查用户名:确认
[用户名]是否正确,你是否把root写成了rot? - 检查主机名:这是非常关键的一步!
'用户名'@'主机名'是一个完整的身份标识。- 本地连接:如果你在 MySQL 服务器所在的机器上连接,主机名通常是
localhost或0.0.1。localhost通常通过 Unix socket 连接,可能会有特殊权限。0.0.1强制使用 TCP/IP 连接。
- 远程连接:如果你从另一台电脑连接,主机名应该是服务器的公网 IP 地址或局域网 IP 地址。
- 通配符主机:一个用户可能被配置为只能从特定 IP 连接,
'root'@'192.168.1.%',如果你用'root'@%'(允许任何主机) 连接,但你的用户不是这样配置的,就会失败。
- 本地连接:如果你在 MySQL 服务器所在的机器上连接,主机名通常是
临时解决本地连接问题:
如果你在本地连接,且用户是 'root'@'localhost',但遇到问题,可以尝试强制使用 TCP/IP 连接:
# 使用 127.0.0.1 代替 localhost mysql -u root -p -h 127.0.0.1
第 3 步:检查用户认证方式
在某些新版本的 MySQL 或特定安装(如 macOS Homebrew)中,root 用户可能被配置为使用 auth_socket 插件,这种插件不检查密码,而是检查操作系统用户和 MySQL 用户名是否一致。
-
症状:你输入任何密码都提示 "Access denied",但如果你直接用
sudo mysql(在 Linux/macOS 上) 登录,却能成功。 -
检查方法:
(图片来源网络,侵删)- 你需要有办法进入 MySQL(通过
sudo mysql)。 - 执行以下 SQL 查询:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
plugin列显示的是auth_socket或unix_socket,那就说明问题出在这里。
- 你需要有办法进入 MySQL(通过
-
解决方法: 你可以将认证方式更改为传统的
mysql_native_password,这样就可以使用密码登录了。-- 1. 修改 root 用户的认证插件 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的新密码'; -- 2. 刷新权限使更改生效 FLUSH PRIVILEGES; -- 3. 退出,然后用新密码重新尝试登录 EXIT;
终极解决方案:重置 root 密码
如果你确定密码忘记了,或者所有方法都无效,可以按照以下步骤强制重置 root 密码,这个过程需要你有服务器的管理员权限(通常是 sudo)。
假设你的 MySQL 数据目录是 /var/lib/mysql(这是最常见的路径)
步骤 1:停止 MySQL 服务
-
对于使用
systemd的系统 (如 Ubuntu 16.04+, Debian 8+, CentOS 7+):sudo systemctl stop mysql
-
对于使用
init.d的旧系统:sudo /etc/init.d/mysql stop
步骤 2:以安全模式启动 MySQL
这一步的关键是跳过权限表,这样你就可以无需密码登录。
sudo mysqld_safe --skip-grant-tables &
--skip-grant-tables告诉 MySQL 不要加载权限控制表。&符号让这个命令在后台运行,这样你就可以立即使用终端了。
看到 [1] <进程号> 的输出表示命令已成功在后台启动。
步骤 3:无密码登录 MySQL
你可以直接登录了,因为 MySQL 不再检查权限。
mysql -u root
你应该能看到 mysql> 提示符,而无需输入密码。
步骤 4:更新 root 用户密码
在 mysql> 提示符下,执行以下 SQL 语句。注意:在 MySQL 5.7.6 及更高版本中,password 字段名已更改为 authentication_string。
-- 切换到 mysql 数据库
USE mysql;
-- 更新 root 密码 (请将 'YourNewPassword' 替换为你想要设置的新密码)
-- 对于 MySQL 5.7.6 及更高版本
UPDATE user SET authentication_string = PASSWORD('YourNewPassword') WHERE User = 'root';
-- 对于 MySQL 5.7.5 及更早版本
UPDATE user SET password = PASSWORD('YourNewPassword') WHERE User = 'root';
-- 刷新权限
FLUSH PRIVILEGES;
-- 退出 MySQL
EXIT;
步骤 5:重启 MySQL 服务
杀掉之前在后台运行的 mysqld_safe 进程,然后正常启动 MySQL 服务。
-
找到并杀掉进程:
sudo pkill mysqld_safe sudo pkill mysqld
-
正常启动 MySQL:
sudo systemctl start mysql
步骤 6:验证新密码
使用你的新密码尝试登录:
mysql -u root -p
输入你刚刚设置的 YourNewPassword,如果成功,恭喜你,问题解决!
总结与建议
| 错误现象 | 最可能的原因 | 解决方案 |
|---|---|---|
| 密码输错 | 密码不正确(区分大小写) | 仔细核对密码,或重置密码。 |
本地连接失败,sudo mysql 成功 |
root@localhost 使用了 auth_socket 插件 |
使用 ALTER USER 命令修改为 mysql_native_password。 |
| 远程连接失败 | '用户名'@'远程IP' 不存在或权限不足 |
登录 MySQL 后,为该用户授予从特定主机访问的权限。 |
| 完全记不住密码 | 需要重置密码 | 按照上面的【终极解决方案】操作。 |
希望这个详细的指南能帮助你成功解决问题!如果问题仍然存在,请提供你的操作系统、MySQL 版本以及你完整的连接命令,以便进一步分析。
