首页 > Sysadmin > 正文

MySQL 忘记 root 密码的 3 步重置

huyuanwen 2026-11-01 Sysadmin

草稿待审

Root 密码丢了进不去库?本文用 Ubuntu 24.04 + MySQL 8.0 实测,3 步安全重置 root 密码并恢复服务。

速览

版本差异与风险

Debian/Ubuntu 自 Debian 9 起已将默认数据库从 MySQL 切换为 MariaDB,部分旧教程里的 mysql.server 脚本或密码字段名在 MySQL 8.0 / MariaDB 10.x+ 已变化。[1] 明确说明 authentication_string 列在 MySQL 5.7.6 后用于密码存储,MySQL 8.0 更推荐 ALTER USER。[3] 指出 Debian 默认使用 MariaDB,认证机制默认走 unix_socket。[2] 说明 MariaDB 10.4+ 的 root 账户可能没有密码而是通过系统用户认证。

风险:--skip-grant-tables 会关闭全部访问控制,任何能连接本机 MySQL 的用户都可获得 root 权限。操作期间务必保持 --skip-networking,或断开外网。

重置方法

方法一:跳过授权表(通用)

sudo systemctl stop mysql
sudo mysqld --skip-grant-tables --skip-networking --user=root &
sleep 3
mysql -u root -e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewPass123!'; FLUSH PRIVILEGES;"
sudo pkill -9 mysqld
sudo systemctl start mysql

方法二:使用 init-file(适合无人值守)

若你无法交互登录,可在停止服务后创建一个 SQL 文件:

echo "ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewPass123!';" | sudo tee /tmp/reset.sql
sudo mysqld --init-file=/tmp/reset.sql --skip-networking --user=root &
sleep 3
sudo pkill -9 mysqld
sudo systemctl start mysql
rm -f /tmp/reset.sql

注意:/tmp/reset.sql 以明文存放密码,操作后立即删除。

回滚与撤销

若改密后无法登录,可再次进入 --skip-grant-tables 模式把密码改回旧值;若误删 root 账户,用同样的方法创建新用户并授权:

mysql -u root -e "CREATE USER 'root'@'localhost' IDENTIFIED BY 'YourNewPass123!'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION; FLUSH PRIVILEGES;"

排错速查表

现象 原因 处理
mysqld 启动后立即退出 数据目录权限错误 确认 --user=root 或修复 chown -R mysql:mysql /var/lib/mysql
ALTER USER 报 ERROR 1396 账户不存在 先执行 CREATE USER 再改密
连接仍报 Access denied 未执行 FLUSH PRIVILEGES 或改的是匿名账户 检查 SELECT user,host,plugin FROM mysql.user;
忘记新密码 无其他管理员账户 重复本流程重置

局限性

  • 本流程实测于 Ubuntu 24.04 + MySQL 8.0.46,未覆盖 MariaDB 默认 unix_socket 认证的完整路径。[2] 提供了对应方案,但未在本机实测。
  • --skip-grant-tables 在 MySQL 8.0.30+ 已废弃,未来版本可能移除,需改用 --init-file 或 socket 认证。
  • 若 MySQL 运行在 Docker 容器内,应使用容器卷备份后重新初始化。

实测记录(Ubuntu 24.04,MySQL 8.0.46,2026-11-01): 1. systemctl start mysql → active 2. mysqladmin -u root password 'TestPass123!' → RC 0 3. mysql -u root -p'TestPass123!' -e "SELECT 1" → 返回 1 4. 停止服务后 mysqld --skip-grant-tables --skip-networking --user=root & 启动正常 5. mysql -u root -e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass456!';" → RC 0 6. 重启正常服务,新密码验证通过


参考资料

文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。