草稿待审
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. 重启正常服务,新密码验证通过
参考资料
- [1] B.3.3.2 How to Reset the Root Password(mysql-docs)
- [2] UNIX_Socket Authentication Plugin(mariadb-docs)
- [3] MySql – Debian Wiki(debian-wiki)
文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。