error 1045 表明 mysql.user 表中 'root'@'localhost' 用户记录已丢失,非密码错误;必须通过 --skip-grant-tables 启动 mysqld,在无权限校验下重建该用户,并严格按 mysql 5.7 或 8.0+ 版本语法插入/更新记录,最后务必清除配置中 skip-grant-tables 和 skip-networking 后重启服务。

MySQL报ERROR 1045说明root@localhost记录已彻底丢失
不是密码错了,是系统表里根本查不到这个用户。执行 mysql -u root -p 时看到的 ERROR 1045 (28000): Access denied for user 'root'@'localhost' 就是明确信号——mysql.user 表中该行已被 DELETE 或 TRUNCATE,认证流程在第一步就终止了。别试 SET PASSWORD、mysqladmin 或重连,它们全依赖已有有效登录会话。
必须用 --skip-grant-tables 启动 mysqld 才能写回 root 记录
这是唯一安全入口,其他所谓“单用户模式”“初始化重建”都是误导。操作前先停服务:sudo systemctl stop mysql,再确认无残留进程:ps aux | grep mysqld。编辑配置文件(如 /etc/mysql/mysql.conf.d/mysqld.cnf),在 [mysqld] 段下加两行:
skip-grant-tables skip-networking
skip-networking 是关键,防止远程未授权访问;改完后手动启动(systemd 环境下常因 pid 冲突失败,直接跑命令更稳):
sudo mysqld --skip-grant-tables --skip-networking --user=mysql &
此时本地可无密码连接:mysql -u root,进库后立刻执行 USE mysql;。
INSERT 或 ALTER USER 必须按 MySQL 版本严格区分
MySQL 5.7 和 8.0+ 的 mysql.user 表结构、函数支持、默认插件完全不同,混用必失败:
- MySQL 5.7:可用
PASSWORD()函数,字段名仍兼容password(但推荐用authentication_string);执行:INSERT INTO mysql.user (Host,User,authentication_string,plugin,account_locked) VALUES ('localhost','root',PASSWORD('your_pass'),'mysql_native_password','N'); - MySQL 8.0+:
PASSWORD()已移除,password_last_changed非空,且默认插件是caching_sha2_password;不能 INSERT,必须分步:UPDATE mysql.user SET authentication_string='', password_last_changed=NOW() WHERE User='root' AND Host='localhost'; FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED BY 'your_pass';
- 无论哪个版本,都得显式设
account_locked='N',漏掉会导致用户被锁;ssl_cipher、x509_issuer、x509_subject这些 NOT NULL 字段也得填空字符串'',否则 INSERT 报错
改完不清理 skip-grant-tables 就等于裸奔
很多修复失败的真实原因,是重启服务后忘记删配置文件里的 skip-grant-tables 和 skip-networking。只要这两行还在,mysqld 就持续跳过所有权限检查——任意本地用户都能连上并 DROP TABLE。务必执行:
sudo systemctl stop mysql,删掉配置中的那两行,再
sudo systemctl start mysql。最后验证:mysql -u root -p 能正常登录,且 SELECT User,Host FROM mysql.user WHERE User='root'; 返回预期记录。











