之前有一次忘记了 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 start 或 systemctl start mysql |
| 验证登录 | mysql -u root -p |