初次安装MySQL后,如何通过skip-grant-tables跳过验证重置root密码?
- 内容介绍
- 文章标签
- 相关推荐
本文共计959个文字,预计阅读时间需要4分钟。
MySQL初次安装后,若未设置密码或系统自动生成了临时密码但未记住,可以使用以下命令直接控制并重置密码:
为什么必须先停掉 mysqld 服务
MySQL 不允许在运行状态下修改授权表启动参数。如果你直接执行 mysqld --skip-grant-tables,大概率会报错 Another MySQL daemon is already running 或端口被占用。必须先确保原服务已彻底退出:
- Linux:用
sudo systemctl stop mysqld(注意不是mysql,多数发行版服务名是mysqld) - Windows:用管理员权限运行 CMD,执行
net stop mysql;若失败,去任务管理器结束所有mysqld.exe进程 - 验证是否干净退出:Linux 上跑
ps aux | grep mysqld,Windows 上看任务管理器,确认无残留进程
跳过权限表启动的两种可靠方式
不要依赖改 /etc/my.cnf 后重启——配置文件可能被覆盖、路径不一致、或 systemd 忽略自定义项。推荐以下任一方式,更可控:
-
方式一(推荐):终端中直接启动:
sudo mysqld_safe --skip-grant-tables --skip-networking &。--skip-networking很关键,它禁用 TCP 连接,防止未授权远程访问 -
方式二:临时修改配置文件,在
[mysqld]段下加一行skip_grant_tables=1,保存后执行sudo systemctl start mysqld。操作完必须手动删掉这行,否则下次启动仍跳过权限校验
启动成功后,终端不会返回 prompt,而是挂起输出(显示类似 Starting mysqld daemon with databases from /var/lib/mysql),这是正常现象——说明服务已在后台运行。
登录后改密码必须分清 MySQL 版本
MySQL 5.7 和 8.0+ 的密码字段和语法完全不同,混用会导致改密失败或后续无法登录:
- MySQL 5.7:执行
UPDATE mysql.user SET authentication_string = PASSWORD('新密码') WHERE User = 'root' AND Host = 'localhost'; - MySQL 8.0+:
PASSWORD()函数已被移除,必须用ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码'; - 无论哪个版本,执行完都必须跟
FLUSH PRIVILEGES;,否则修改只存在内存里,不写入磁盘 - 别漏掉
Host条件。如果SELECT User, Host FROM mysql.user WHERE User='root';返回多行(比如root@localhost和root@%),你要分别更新,或明确指定目标 host
重启前务必清理 skip-grant-tables
这是最容易被跳过的一步。用 skip-grant-tables 启动的服务处于“裸奔”状态——任何本地用户都能无密码进库、读写任意数据。所以:
- Linux:如果用
mysqld_safe启动,直接killall mysqld或sudo pkill mysqld终止进程;再执行sudo systemctl start mysqld - Windows:关掉那个挂着
mysqld --skip-grant-tables的 CMD 窗口,然后在新窗口运行net start mysql - 改完密码后立刻测试:
mysql -u root -p,输入新密码。如果提示Access denied,大概率是没执行FLUSH PRIVILEGES;,或版本语法写错了
真正麻烦的不是步骤多,而是 skip-grant-tables 留在配置里没删、或忘记 FLUSH PRIVILEGES——这两个点一旦出错,你会反复陷入“以为改好了,实际没生效”的循环。
本文共计959个文字,预计阅读时间需要4分钟。
MySQL初次安装后,若未设置密码或系统自动生成了临时密码但未记住,可以使用以下命令直接控制并重置密码:
为什么必须先停掉 mysqld 服务
MySQL 不允许在运行状态下修改授权表启动参数。如果你直接执行 mysqld --skip-grant-tables,大概率会报错 Another MySQL daemon is already running 或端口被占用。必须先确保原服务已彻底退出:
- Linux:用
sudo systemctl stop mysqld(注意不是mysql,多数发行版服务名是mysqld) - Windows:用管理员权限运行 CMD,执行
net stop mysql;若失败,去任务管理器结束所有mysqld.exe进程 - 验证是否干净退出:Linux 上跑
ps aux | grep mysqld,Windows 上看任务管理器,确认无残留进程
跳过权限表启动的两种可靠方式
不要依赖改 /etc/my.cnf 后重启——配置文件可能被覆盖、路径不一致、或 systemd 忽略自定义项。推荐以下任一方式,更可控:
-
方式一(推荐):终端中直接启动:
sudo mysqld_safe --skip-grant-tables --skip-networking &。--skip-networking很关键,它禁用 TCP 连接,防止未授权远程访问 -
方式二:临时修改配置文件,在
[mysqld]段下加一行skip_grant_tables=1,保存后执行sudo systemctl start mysqld。操作完必须手动删掉这行,否则下次启动仍跳过权限校验
启动成功后,终端不会返回 prompt,而是挂起输出(显示类似 Starting mysqld daemon with databases from /var/lib/mysql),这是正常现象——说明服务已在后台运行。
登录后改密码必须分清 MySQL 版本
MySQL 5.7 和 8.0+ 的密码字段和语法完全不同,混用会导致改密失败或后续无法登录:
- MySQL 5.7:执行
UPDATE mysql.user SET authentication_string = PASSWORD('新密码') WHERE User = 'root' AND Host = 'localhost'; - MySQL 8.0+:
PASSWORD()函数已被移除,必须用ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码'; - 无论哪个版本,执行完都必须跟
FLUSH PRIVILEGES;,否则修改只存在内存里,不写入磁盘 - 别漏掉
Host条件。如果SELECT User, Host FROM mysql.user WHERE User='root';返回多行(比如root@localhost和root@%),你要分别更新,或明确指定目标 host
重启前务必清理 skip-grant-tables
这是最容易被跳过的一步。用 skip-grant-tables 启动的服务处于“裸奔”状态——任何本地用户都能无密码进库、读写任意数据。所以:
- Linux:如果用
mysqld_safe启动,直接killall mysqld或sudo pkill mysqld终止进程;再执行sudo systemctl start mysqld - Windows:关掉那个挂着
mysqld --skip-grant-tables的 CMD 窗口,然后在新窗口运行net start mysql - 改完密码后立刻测试:
mysql -u root -p,输入新密码。如果提示Access denied,大概率是没执行FLUSH PRIVILEGES;,或版本语法写错了
真正麻烦的不是步骤多,而是 skip-grant-tables 留在配置里没删、或忘记 FLUSH PRIVILEGES——这两个点一旦出错,你会反复陷入“以为改好了,实际没生效”的循环。

