不能用“单用户模式”,必须用--skip-grant-tables;mysql无传统单用户模式,仅支持该参数跳过权限校验,且须匹配版本字段(5.7用authentication_string+password(),8.0+用alter user)、显式设置event_priv等三权限位、精确host匹配,并务必清除配置重启服务。

直接结论:不能用“单用户模式”,必须用 --skip-grant-tables
MySQL 没有 Linux 那种传统意义上的「单用户模式」。所谓“单用户模式恢复 root”其实是误传,真实可行的只有 --skip-grant-tables 启动方式——它让 mysqld 完全跳过 mysql.user 表校验,所有连接免密、免权限检查。这是官方支持的紧急恢复入口,但仅限本地管理员操作。
INSERT INTO user 语句在不同版本里字段差异极大
MySQL 5.7 和 8.0+ 的 user 表结构已不兼容,硬套老教程的 INSERT INTO user(host,user,password) VALUES(...) 会失败或创建无效账户。
- MySQL 5.7:仍保留
password字段(但已废弃),可用PASSWORD('xxx')函数赋值 - MySQL 8.0+:
password字段彻底移除,必须写入authentication_string,且PASSWORD()函数在 8.0.11+ 已废弃,推荐用ALTER USER替代 - 无论哪个版本,
ssl_cipher、x509_issuer、x509_subject这些空字段都得显式设为空字符串(''),否则INSERT会因 NOT NULL 约束报错
示例(MySQL 8.0+ 安全写法):
INSERT INTO mysql.user (
host, user, authentication_string, ssl_cipher, x509_issuer, x509_subject,
plugin, account_locked
) VALUES (
'localhost', 'root',
SHA2('your_new_password', 256),
'', '', '', 'caching_sha2_password', 'N'
);
权限字段漏掉 Event_priv、Trigger_priv、Create_tablespace_priv 会导致后续授权失败
即使 INSERT 成功、FLUSH PRIVILEGES 也执行了,如果没把这三个字段设为 'y',后续执行 GRANT ALL PRIVILEGES ON *.* TO 'xxx'@'%' WITH GRANT OPTION 会静默失败——你根本看不到错误,但新用户就是拿不到全部权限。
- 必须在
UPDATE mysql.user时显式设置:Event_priv='y'、Trigger_priv='y'、Create_tablespace_priv='y' - 只设
Super_priv='y'不够;Grant_priv='y'也不足以支撑GRANT ALL - host 匹配必须精确:
'root'@'localhost'和'root'@'127.0.0.1'是两个独立账户,改错一个,mysql -u root -h 127.0.0.1 -p就连不上
改完必须删掉 skip-grant-tables 并重启服务
这是最容易被跳过的一步,也是最危险的疏忽。只要配置文件里还留着 skip-grant-tables 或进程是以该参数启动的,mysqld 就永远处于裸奔状态——任何能连上本地端口的人,都能无密码、无权限限制地读写全部数据库。
- Linux:删掉
/etc/my.cnf或/etc/mysql/my.cnf中[mysqld]下的skip-grant-tables行,再systemctl restart mysqld - Windows:关掉之前运行
mysqld --skip-grant-tables的命令行窗口,再用net start mysql正常启服务 - 验证是否生效:
mysql -u root -p输入密码应能登录;若直接进去了没提示输密码,说明还没清理干净
整个过程没有“一劳永逸”的 SQL 脚本,每一步都依赖你确认当前 MySQL 版本、实际表结构和 host 匹配方式。漏掉任意一个细节,都会卡在下一步——尤其是 authentication_string 字段名和那三个关键权限位。











