MySQL 忘记 root 密码怎么办:免密进入、重置密码全流程,秒级找回


忘了 MySQL 的 root 密码?装了 MySQL 后第一次登录进不去?换服务器后数据库密码不知道?几乎每个站长和运维都踩过这个坑。好消息是,MySQL 提供了跳过权限验证的启动方式,让你在不知道密码的情况下重置 root 密码。这篇文章把操作流程讲清楚,Ubuntu / CentOS 通用,照做就能找回。

一、原理:用 skip-grant-tables 绕过密码

MySQL 在启动时加一个参数 --skip-grant-tables,就会跳过权限表检查,任何账号免密登录。用它进入后,再重置 root 密码,最后恢复正常启动即可。

核心三步:停服务 → 免密启动 → 改密码 → 恢复正常。

二、准备工作

先确认 MySQL 是怎么装的、怎么启停。常见的有三种:

# systemd 管理(最常见)
sudo systemctl stop mysql
# 或
sudo systemctl stop mysqld
# 或 MariaDB
sudo systemctl stop mariadb

如果 stop 不了(比如内存不够),看文末"免重启方案"。

三、方案 A:systemd 覆盖(推荐,最稳)

在 systemd 下临时加启动参数,不用手动起进程:

sudo systemctl stop mysql

# 给 mysql 服务加一个临时 override
sudo mkdir -p /etc/systemd/system/mysql.service.d
echo -e "[Service]\nExecStart=\nExecStart=/usr/sbin/mysqld --skip-grant-tables --skip-networking" | sudo tee /etc/systemd/system/mysql.service.d/skip-grant.conf

sudo systemctl daemon-reload
sudo systemctl start mysql

--skip-networking 加一层保险:只允许本机连接,防止免密状态下被外网趁虚而入。

现在免密进入:

mysql -uroot

如果 ExecStart 路径不对(不是 /usr/sbin/mysqld),用 which mysqld 查一下再改。

四、方案 B:手动启动(老系统 / 容器通用)

1. 停服务:

sudo systemctl stop mysql

2. 手动以跳过权限方式后台启动:

sudo mysqld_safe --skip-grant-tables &
# 或指定数据目录
sudo mysqld --skip-grant-tables --skip-networking &

3. 等几秒后免密进入:

mysql -uroot

五、重置密码(关键一步)

进入 MySQL 后,执行(注意 MySQL 5.7+ 与 8.0 写法不同):

MySQL 5.7 及以下:

FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码';
-- 老版本没有 ALTER USER 时用:
-- SET PASSWORD FOR 'root'@'localhost' = PASSWORD('你的新密码');
FLUSH PRIVILEGES;
EXIT;

MySQL 8.0:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的新密码';
-- 或仅设置密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码';
FLUSH PRIVILEGES;
EXIT;

8.0 里 mysql.user 表结构变了,不要再用老教程里的 UPDATE mysql.user 写法,用 ALTER USER 最稳。

六、恢复正常启动并验证

1. 停掉免密实例:

sudo systemctl stop mysql

2. 删掉 override 配置:

sudo rm -f /etc/systemd/system/mysql.service.d/skip-grant.conf
sudo systemctl daemon-reload

(方案 B 的话,先 pkill mysqld 确认进程已停。)

3. 正常启动:

sudo systemctl start mysql

4. 用新密码登录验证:

mysql -uroot -p

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

七、免重启方案:flush-privileges 快速法

如果 MySQL 已经在跑、又启用了 skip-grant-tables(比如某些面板环境),直接在 MySQL 里刷新权限再改:

FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';

适合宝塔等面板环境(面板自己管理进程),但面板环境优先用面板的重置功能。

八、常见问题

Q1:ALTER USER 报语法错误?

大概率版本不对。mysql --version 看版本:5.7 用老写法,8.0 用新写法。老版本报错换 SET PASSWORD。

Q2:连 mysql -uroot 都进不去?

可能没真正以 --skip-grant-tables 启动。用 ps aux | grep mysqld 看启动参数是否带上了,注意 mysqld_safe 启动后真正的进程是 mysqld,确认路径正确。

Q3:忘了 socket / 连不上?

默认 socket 在 /var/run/mysqld/mysqld.sock,连接报 socket 错就确认目录存在且属主是 mysql:mkdir -p /var/run/mysqld && chown mysql:mysql /var/run/mysqld。

Q4:改完密码,网站还是连不上?

网站配置里存的旧密码要一起改(wp-config.php、.env 等)。改密码后重启下 Web 服务/PHP-FPM 让连接池释放旧连接。

Q5:MariaDB 通用吗?

完全通用,命令把 mysql 换成 mariadb 即可。

九、安全提醒

免密启动期间服务完全无防护,务必: - 加 --skip-networking,只允许本机 - 全程在本地终端操作 - 重置完立刻恢复普通启动 - 顺便检查有没有异常账号:SELECT user,host FROM mysql.user;

总结

忘记 MySQL root 密码不可怕:停服务 → --skip-grant-tables 免密启动 → ALTER USER 改密码 → 恢复正常启动,全程几分钟。记住 8.0 用 ALTER USER 别用老式 UPDATE 语法,重置后顺手改掉站点配置文件里的数据库密码即可。更多数据库操作参考本站 MySQL 基础教程。


手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

Linux 服务器负载过高排查教程:load average、top、uptime 全看懂,找到 CPU 占用元凶

Linux 查看端口占用与进程排查教程:lsof、netstat、ss 三件套,找出谁在占端口

评 论
更换验证码