Linux VPS 忘记 MySQL Root 密码的解决方法全过程笔记

之前有一次忘记了 VPS 上的 MySQL root 密码,导致无法登录数据库。当时第一次遇到这个问题,通过学习,终于掌握了解决方法,核心是通过**跳过权限验证(--skip-grant-tables)**来重新设置密码。整理了一下操作笔记,以便后续遇到同样问题时直接查阅。

注意

本方法需要服务器 Root 权限,并建议在维护期间操作。重置过程中数据库将短暂不可用。


一、停止 MySQL 服务

Ubuntu / Debian:

systemctl stop mysql

service mysql stop

CentOS:

systemctl stop mysqld

如果使用 LNMP 一键安装包:

lnmp mysql stop

二、以跳过权限验证模式启动 MySQL

先创建 Socket 目录(如果目录已存在可忽略):

mkdir -p /var/run/mysqld
chown mysql:mysql /var/run/mysqld

然后启动 MySQL:

mysqld_safe --skip-grant-tables --skip-networking &

如果系统没有 mysqld_safe

mysqld --skip-grant-tables --skip-networking &

参数说明

参数 作用
--skip-grant-tables 跳过权限验证,无需密码即可登录
--skip-networking 禁止网络连接,仅允许本地访问,更安全

三、登录 MySQL

mysql -u root

如果不知道当前 MySQL 版本,可以查看:

mysql --version

建议先查看 Root 用户对应的 Host:

SELECT User,Host FROM mysql.user;

通常为:

root    localhost

四、重置 Root 密码

MySQL 5.7 / MySQL 8.0(推荐)

FLUSH PRIVILEGES;

然后执行:

ALTER USER 'root'@'localhost'
IDENTIFIED BY '你的新密码';

注意:

如果先执行 ALTER USER,可能出现:

ERROR 1290 (HY000)

因此必须先执行 FLUSH PRIVILEGES;


MySQL 5.6 及更早版本

FLUSH PRIVILEGES;

然后:

SET PASSWORD FOR 'root'@'localhost' = PASSWORD('你的新密码');

五、退出 MySQL

exit;

六、关闭临时启动的 MySQL

推荐优先使用:

mysqladmin shutdown

如果无法关闭,再执行:

pkill mysqld_safe
pkill mysqld

七、正常启动 MySQL

Ubuntu / Debian:

systemctl start mysql

CentOS:

systemctl start mysqld

LNMP:

lnmp mysql start

八、验证密码

mysql -u root -p

输入刚刚设置的新密码,能够正常登录说明修改成功。


常见问题

1. 提示 ERROR 1290 (HY000)

原因:

--skip-grant-tables 模式下直接执行了 ALTER USER

解决:

FLUSH PRIVILEGES;

然后重新执行:

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

2. 找不到 mysqld_safe

部分新版系统已不再提供 mysqld_safe

可以改为:

mysqld --skip-grant-tables --skip-networking &

3. root@localhost 不存在

查看当前用户:

SELECT User,Host FROM mysql.user;

根据查询结果修改对应账户,例如:

ALTER USER 'root'@'127.0.0.1'
IDENTIFIED BY '新密码';

命令速查

操作 命令
停止 MySQL(systemd) systemctl stop mysql
跳过权限启动 mysqld_safe --skip-grant-tables --skip-networking &
登录 MySQL mysql -u root
查看版本 mysql --version
查看用户 SELECT User,Host FROM mysql.user;
MySQL 5.7/8.0 修改密码 ALTER USER ... IDENTIFIED BY ...;
MySQL 5.6 修改密码 SET PASSWORD FOR ...;
正常启动 lnmp mysql startsystemctl start mysql
验证登录 mysql -u root -p