mysql无单用户模式,唯一恢复入口是--skip-grant-tables配合--skip-networking启动,跳过权限校验后手动插入root记录、赋权、指定plugin并flush privileges。

MySQL 里没有真正的“单用户模式”,所谓恢复入口只有 --skip-grant-tables(配合 --skip-networking)这一条路。它不是让你进一个隔离环境,而是让 mysqld 启动时不加载权限系统,从而获得对 mysql 系统库的读写能力——这是所有恢复操作的前提。
MySQL 8.0+ 误删 root 后不能直接 CREATE USER
因为 CREATE USER 在安全模式下仍会校验用户是否存在、认证插件是否兼容等内部约束。如果 mysql.user 表里完全没 root 记录,执行该语句大概率报错或生成无法登录的空壳用户。
- 必须手动插入基础记录:
INSERT INTO mysql.user (User, Host, authentication_string, plugin) VALUES ('root', 'localhost', '', 'mysql_native_password'); - 紧接着批量赋权:
UPDATE mysql.user SET Select_priv='Y', Insert_priv='Y', Update_priv='Y', Delete_priv='Y', Create_priv='Y', Drop_priv='Y', Grant_priv='Y', Super_priv='Y', Create_user_priv='Y' WHERE User='root' AND Host='localhost'; -
plugin字段必须显式设为mysql_native_password,否则老客户端(Navicat、DBeaver、部分脚本)连不上,报ERROR 1251 - 最后强制刷新:
FLUSH PRIVILEGES;—— 这步漏掉,内存缓存不会更新,新权限不生效
启动命令必须带 --skip-networking,且不能用 mysqld_safe
MySQL 8.0.12+ 已废弃 mysqld_safe,单独用 --skip-grant-tables 会卡住或拒绝连接。正确组合是:
- Linux/macOS:
sudo mysqld --skip-grant-tables --skip-networking --socket=/var/run/mysqld/mysqld.sock & - Windows:
mysqld --console --skip-grant-tables --shared-memory(必须带--console和--shared-memory,缺一不可) -
--skip-networking是关键:它禁用 TCP/IP 连接,只留本地 socket,防止未授权远程写库 - 启动后终端会“卡住”,这是正常现象——别关它,另开一个终端去连
host 匹配错误是恢复失败最常见原因
MySQL 用户是 'user'@'host' 二元组。root@localhost、root@127.0.0.1、root@'%' 彼此独立。你改的是哪一行,就只能用对应 host 登录。
- 先查清楚当前有哪些 root:
SELECT User, Host FROM mysql.user WHERE User = 'root'; - 如果常用
mysql -u root -h 127.0.0.1,但只修了localhost,就会报Access denied - 生产环境建议同时修复多个 host:
WHERE User='root' AND Host IN ('localhost', '127.0.0.1', '%') - 修完别忘了删配置文件里的
skip-grant-tables,再正常重启服务;否则下次启动仍是免密裸奔
真正麻烦的从来不是 SQL 怎么写,而是启动参数拼错、host 漏匹配、plugin 没指定、FLUSH PRIVILEGES 忘执行——这四点漏掉任意一个,都会让你反复折腾半小时。











