背景场景
在 Ubuntu 系统中使用 apt
或 deb
包方式安装 MySQL 8 时:
- 初次安装后会自动初始化数据库;
- 但 没有提示 root 初始密码;
- 导致
mysql -u root -p
无法登录。
为了解决该问题,通常我们使用 --skip-grant-tables
方式跳过权限认证进入 MySQL,然后手动修改 root 密码,但这可能导致 权限表异常残留,重启后仍可免密登录。
解决方案总览
我们将通过三步彻底修复这个问题:
- 启动 MySQL,跳过权限校验,进入无密码模式;
- 清空 root 用户,重新创建 root 账户并配置密码;
- 恢复配置文件,重启验证密码登录生效。
步骤一:跳过密码验证启动 MySQL
1. 停止 MySQL 服务
sudo systemctl stop mysql
2. 启动 MySQL 并跳过授权验
sudo mysqld_safe --skip-grant-tables --skip-networking &
解释:
--skip-grant-tables
: 跳过用户认证;--skip-networking
: 禁止远程连接(增强安全);&
: 后台运行。
3. 无密码登录 MySQL
mysql -u root
进入后会看到 mysql>
提示符。
步骤二:清除旧 root 用户并重新配置密码
1. 刷新权限(激活权限表)
FLUSH PRIVILEGES;
2. 删除所有旧 root 用户
DELETE FROM mysql.user WHERE User = 'root';
3. 创建新的 root 用户(本地登录)
CREATE USER 'root'@'localhost' IDENTIFIED BY 'YourStrongPassword';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
4. (可选)允许远程登录
CREATE USER 'root'@'%' IDENTIFIED BY 'YourStrongPassword';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
5. 强制刷新权限
FLUSH PRIVILEGES;
6. 退出 MySQL
exit;
步骤三:恢复安全配置并验证
1. 停止无密码运行的 mysqld_safe
sudo pkill mysqld
2. 检查并删除 my.cnf
中跳过权限的配置项(如有)
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
确保 [mysqld]
部分中 没有 skip-grant-tables
。
3. 重启 MySQL
sudo systemctl restart mysql
4. 使用密码登录验证
mysql -u root -p
# 输入上面新设置的密码
常见问题解答
为什么删除了配置后还是免密?
mysql.user
表中旧的 root 用户没有密码,权限系统仍然允许直接登录。
为什么 CREATE USER 失败?
--skip-grant-tables
模式下权限未激活,部分语句需要先执行 FLUSH PRIVILEGES
。
ALTER USER
或 UPDATE user
不生效?
可能是因为权限表没刷新、字段错误(MySQL 8 使用 authentication_string
字段),或因为之前的 root 用户已经损坏。
总结
步骤 | 关键操作 |
---|---|
跳过验证 | --skip-grant-tables 模式启动 |
修复 root | 删除 + 重新创建 + 设置密码 |
权限生效 | FLUSH PRIVILEGES 是关键命令 |
安全恢复 | 移除配置、重启服务、验证密码 |
该方案适用于无法找到初始密码、root 用户权限损坏等问题,是 MySQL 密码修复最稳妥的方式。
附加建议
- 修改密码后建议立即执行:
ALTER USER 'root'@'localhost' PASSWORD EXPIRE NEVER;
- 建议设置复杂密码,并定期备份
mysql.user
表; - 如部署环境建议开启
skip-name-resolve
提升性能。