Ubuntu 22.04 + MySQL 8 无密码登录问题与 root 密码重置指南

背景场景

在 Ubuntu 系统中使用 aptdeb 包方式安装 MySQL 8 时:

  • 初次安装后会自动初始化数据库;
  • 没有提示 root 初始密码
  • 导致 mysql -u root -p 无法登录。

为了解决该问题,通常我们使用 --skip-grant-tables 方式跳过权限认证进入 MySQL,然后手动修改 root 密码,但这可能导致 权限表异常残留,重启后仍可免密登录


解决方案总览

我们将通过三步彻底修复这个问题:

  1. 启动 MySQL,跳过权限校验,进入无密码模式
  2. 清空 root 用户,重新创建 root 账户并配置密码
  3. 恢复配置文件,重启验证密码登录生效

步骤一:跳过密码验证启动 MySQL

1. 停止 MySQL 服务

bash 复制代码
sudo systemctl stop mysql

2. 启动 MySQL 并跳过授权验

bash 复制代码
sudo mysqld_safe --skip-grant-tables --skip-networking &

解释:

  • --skip-grant-tables: 跳过用户认证;
  • --skip-networking: 禁止远程连接(增强安全);
  • &: 后台运行。

3. 无密码登录 MySQL

bash 复制代码
mysql -u root

进入后会看到 mysql> 提示符。


步骤二:清除旧 root 用户并重新配置密码

1. 刷新权限(激活权限表)

sql 复制代码
FLUSH PRIVILEGES;

2. 删除所有旧 root 用户

sql 复制代码
DELETE FROM mysql.user WHERE User = 'root';

3. 创建新的 root 用户(本地登录)

sql 复制代码
CREATE USER 'root'@'localhost' IDENTIFIED BY 'YourStrongPassword';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;

4. (可选)允许远程登录

sql 复制代码
CREATE USER 'root'@'%' IDENTIFIED BY 'YourStrongPassword';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

5. 强制刷新权限

sql 复制代码
FLUSH PRIVILEGES;

6. 退出 MySQL

sql 复制代码
exit;

步骤三:恢复安全配置并验证

1. 停止无密码运行的 mysqld_safe

bash 复制代码
sudo pkill mysqld

2. 检查并删除 my.cnf 中跳过权限的配置项(如有)

bash 复制代码
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

确保 [mysqld] 部分中 没有 skip-grant-tables

3. 重启 MySQL

bash 复制代码
sudo systemctl restart mysql

4. 使用密码登录验证

bash 复制代码
mysql -u root -p
# 输入上面新设置的密码

常见问题解答

为什么删除了配置后还是免密?

mysql.user 表中旧的 root 用户没有密码,权限系统仍然允许直接登录。

为什么 CREATE USER 失败?

--skip-grant-tables 模式下权限未激活,部分语句需要先执行 FLUSH PRIVILEGES

ALTER USERUPDATE user 不生效?

可能是因为权限表没刷新、字段错误(MySQL 8 使用 authentication_string 字段),或因为之前的 root 用户已经损坏。


总结

步骤 关键操作
跳过验证 --skip-grant-tables 模式启动
修复 root 删除 + 重新创建 + 设置密码
权限生效 FLUSH PRIVILEGES 是关键命令
安全恢复 移除配置、重启服务、验证密码

该方案适用于无法找到初始密码、root 用户权限损坏等问题,是 MySQL 密码修复最稳妥的方式。


附加建议

  • 修改密码后建议立即执行:
sql 复制代码
ALTER USER 'root'@'localhost' PASSWORD EXPIRE NEVER;
  • 建议设置复杂密码,并定期备份 mysql.user 表;
  • 如部署环境建议开启 skip-name-resolve 提升性能。
相关推荐
嵩山小老虎2 小时前
Windows 10/11 安装 WSL2 并配置 VSCode 开发环境(C 语言 / Linux API 适用)
linux·windows·vscode
Fleshy数模2 小时前
CentOS7 安装配置 MySQL5.7 完整教程(本地虚拟机学习版)
linux·mysql·centos
a41324472 小时前
ubuntu 25 安装vllm
linux·服务器·ubuntu·vllm
az44yao3 小时前
mysql 创建事件 每天17点执行一个存储过程
mysql
一只自律的鸡4 小时前
【Linux驱动】bug处理 ens33找不到IP
linux·运维·bug
17(无规则自律)4 小时前
【CSAPP 读书笔记】第二章:信息的表示和处理
linux·嵌入式硬件·考研·高考
!chen4 小时前
linux服务器静默安装Oracle26ai
linux·运维·服务器
秦老师Q4 小时前
php入门教程(超详细,一篇就够了!!!)
开发语言·mysql·php·db
REDcker4 小时前
Linux 文件描述符与 Socket 选项操作详解
linux·运维·网络
蒹葭玉树5 小时前
【C++上岸】C++常见面试题目--操作系统篇(第二十八期)
linux·c++·面试