MySQL 忘记密码:服务器上重置 root

前言

运维或开发时,经常会遇到 MySQL root 密码遗忘、交接后无人知晓的情况。
本文以 Linux 服务器上的本机 MySQL 为例,说明如何通过临时跳过权限校验来重置密码。
下文命令以常见发行版与 MySQL 5.7 / 8.x 为例,具体服务名与配置路径请按环境调整。
不涉及从备份恢复数据,也不覆盖云厂商托管库的控制台改密流程。

准备

操作前请确认你拥有服务器的 rootsudo 权限。
重置期间 MySQL 会短暂不可用,生产环境尽量选低峰操作。
建议先备份关键配置文件,避免改坏启动参数。

常见服务名可能是 mysqldmysql
可用下面命令确认当前状态:

1
2
3
systemctl status mysqld
# 或
systemctl status mysql

重置步骤

核心思路是:先停库,再以 --skip-grant-tables 启动,无密码登录后改密,最后恢复正常启动。

停止服务

先停止正在运行的 MySQL,避免新旧进程抢占数据目录。

1
2
3
sudo systemctl stop mysqld
# 或
sudo systemctl stop mysql

确认进程已退出:

1
ps -ef | grep -E 'mysqld|mysql' | grep -v grep

若仍有残留进程,可再确认并按需结束,避免强杀误伤其他业务进程。

跳过权限表

临时以跳过授权表的方式启动,此时无需密码即可登录。
推荐用 mysqld_safe(若系统仍提供)或直接带参数启动 mysqld

1
sudo mysqld_safe --skip-grant-tables --skip-networking &

若没有 mysqld_safe,也可手动指定数据目录与用户启动(路径按安装方式调整):

1
sudo mysqld --skip-grant-tables --skip-networking --user=mysql &

--skip-networking 可避免重置窗口内被远程连接,降低风险。
若必须远程操作本机,可暂时去掉该参数,但务必尽快完成改密并恢复。

无密码登录

服务起来后,直接本地登录:

1
mysql -u root

若提示 socket 路径不对,可显式指定(示例路径,按实际调整):

1
mysql -u root -S /var/lib/mysql/mysql.sock

修改密码

进入 MySQL 后,先刷新权限表,再按版本改密。
MySQL 8.x 推荐使用 ALTER USER

1
2
3
4
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码';
FLUSH PRIVILEGES;
EXIT;

root 还允许从其他主机登录,需一并修改对应账号,例如:

1
2
ALTER USER 'root'@'%' IDENTIFIED BY '你的新密码';
FLUSH PRIVILEGES;

MySQL 5.7 常见写法如下(部分环境仍可用):

1
2
3
4
FLUSH PRIVILEGES;
UPDATE mysql.user SET authentication_string = PASSWORD('你的新密码') WHERE User = 'root' AND Host = 'localhost';
FLUSH PRIVILEGES;
EXIT;

恢复启动

改密完成后,结束临时启动的 MySQL 进程,再按正常方式启动服务。

1
2
3
4
5
sudo pkill mysqld
# 若使用了 mysqld_safe,也可能看到 mysqld_safe 相关进程,一并确认退出
sudo systemctl start mysqld
# 或
sudo systemctl start mysql

用新密码验证登录:

1
mysql -u root -p

输入新密码后能进入,即说明重置成功。

验证

登录成功后,可简单检查当前用户与权限是否正常:

1
2
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
SHOW GRANTS FOR 'root'@'localhost';

再用业务账号或应用配置做一次真实连接测试,确认应用侧也已同步新密码。

扩展

若 systemd 管理不便临时加参数,可编辑服务覆盖文件,加入启动参数后再重启。
例如创建覆盖配置:

1
sudo systemctl edit mysqld

在编辑器中写入类似内容(改完记得删掉或还原,勿长期开启):

1
2
3
[Service]
ExecStart=
ExecStart=/usr/sbin/mysqld --skip-grant-tables --skip-networking

然后执行:

1
2
sudo systemctl daemon-reload
sudo systemctl restart mysqld

完成改密后,务必删除该覆盖配置并恢复默认 ExecStart,再 daemon-reload 与重启,避免服务长期处于无鉴权状态。

部分发行版(如 Debian/Ubuntu)还可能使用 debian-sys-maint 账户维护服务。
若本机有 /etc/mysql/debian.cnf,也可阅读其中账号密码用于本机维护,但这不等于找回你业务用的 root 密码,仍建议按上文正式重置。

总结

  1. 停止 MySQL 服务。
  2. --skip-grant-tables(建议同时 --skip-networking)临时启动。
  3. 无密码登录后执行 FLUSH PRIVILEGESALTER USER 改密。
  4. 杀掉临时进程,恢复 systemctl 正常启动并用新密码验证。

注意:跳过权限表期间库几乎等同于无鉴权,操作窗口尽量短。
生产环境改密后,同步更新应用、脚本与监控里的连接配置,避免连环故障。