mysql 8.0误删root后无法直接create user,因无任何grant权限凭据且权限系统自保护;须用mysqld --console --skip-grant-tables --shared-memory(win)或sudo mysqld --skip-grant-tables --skip-networking &(linux/macos)进入安全模式,再手动insert用户记录、update权限字段、flush privileges,并务必执行alter user ... identified with mysql_native_password修复认证插件,最后移除skip-grant-tables并重启服务。

mysql8.0 误删 root 后,为什么不能直接 CREATE USER?
因为 root 被删后,你大概率已失去任何具有 GRANT OPTION 权限的登录凭据。此时连 mysql -u root -p 都会报 Access denied,更别说执行 CREATE USER 或 GRANT。MySQL 8.0 的权限模型严格依赖 mysql.user 表,而该表本身受权限系统保护——没权限就改不了它。所以必须先绕过权限验证,进入“能读写系统表”的状态。
怎么进安全模式:mysqld --skip-grant-tables 已失效,该用什么命令?
MySQL 8.0.12+ 彻底弃用了纯 --skip-grant-tables 启动方式,单独运行会报错或无法响应客户端连接。正确组合是:
-
mysqld --console --skip-grant-tables --shared-memory(Windows) -
sudo mysqld --skip-grant-tables --skip-networking &(Linux/macOS,--skip-networking是关键,防止未授权远程访问)
注意:--console 和 --shared-memory 不是可选装饰,缺一不可;启动后终端会卡住,这是正常现象——别关它,另开一个终端操作。
进库后不能直接 CREATE USER 'root'@'localhost',为什么?
因为安全模式下虽然跳过了权限检查,但 MySQL 8.0 的 CREATE USER 仍会校验用户是否存在、密码插件是否兼容等内部逻辑。若 mysql.user 表里完全没 root 记录,CREATE USER 可能失败或创建出无法认证的空壳用户。稳妥做法是手动插入 + 显式赋权:
- 先
USE mysql; - 插入基础记录:
INSERT INTO user (Host, User, authentication_string, account_locked) VALUES ('localhost', 'root', '', 'N'); - 再批量开权限:
UPDATE 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'; - 最后
FLUSH PRIVILEGES;——这步不能省,否则内存权限缓存不更新
恢复后登录报 ERROR 1251 或 Navicat 连不上?加密插件不匹配
MySQL 8.0 默认用 caching_sha2_password,但老客户端(包括很多 GUI 工具)只认 mysql_native_password。即使你成功插入了 root 用户,没显式指定认证插件,它默认是空字符串或不兼容值。必须立刻修正:
- 用新起的无密码连接进库:
mysql -u root - 执行:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 再
FLUSH PRIVILEGES;
这一步常被跳过,结果就是“能进命令行但连不上工具”,本质是认证协议层面断开了。
整个过程最脆弱的环节不是 SQL 语句写错,而是忘记在改完配置或执行完修复后,把 --skip-grant-tables 从启动参数或配置文件中彻底移除,并重启服务。残留该参数等于长期开着后门。











