忘了 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 基础教程。
