初次安装MySQL后,如何通过skip-grant-tables跳过验证重置root密码?

2026-04-30 13:552阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计959个文字,预计阅读时间需要4分钟。

初次安装MySQL后,如何通过skip-grant-tables跳过验证重置root密码?

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@localhostroot@%),你要分别更新,或明确指定目标 host

重启前务必清理 skip-grant-tables

这是最容易被跳过的一步。用 skip-grant-tables 启动的服务处于“裸奔”状态——任何本地用户都能无密码进库、读写任意数据。所以:

  • Linux:如果用 mysqld_safe 启动,直接 killall mysqldsudo 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——这两个点一旦出错,你会反复陷入“以为改好了,实际没生效”的循环。

标签:Mysql

本文共计959个文字,预计阅读时间需要4分钟。

初次安装MySQL后,如何通过skip-grant-tables跳过验证重置root密码?

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@localhostroot@%),你要分别更新,或明确指定目标 host

重启前务必清理 skip-grant-tables

这是最容易被跳过的一步。用 skip-grant-tables 启动的服务处于“裸奔”状态——任何本地用户都能无密码进库、读写任意数据。所以:

  • Linux:如果用 mysqld_safe 启动,直接 killall mysqldsudo 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——这两个点一旦出错,你会反复陷入“以为改好了,实际没生效”的循环。

标签:Mysql