MySQL 5.7+ 初始化模式不重建root用户,需跳过权限验证启动mysqld:添加skip-grant-tables和skip-networking→重启→无密码登录→插入root@localhost记录(注意auth_plugin与account_locked)→FLUSH PRIVILEGES→清理配置并重启验证。

MySQL 5.7+ 初始化模式下无法直接创建 root 用户?
初始化模式(--initialize 或 --initialize-insecure)本身不启动 mysqld,只生成数据目录和默认 root 密码(或空密码),它不提供交互式用户管理能力。误删 root@localhost 后,不能靠重跑初始化来“恢复”该用户——初始化不会重建系统表中的用户记录,只会覆盖 mysql.user 表(如果存在且未被锁定),但风险极高,极易导致权限表损坏。
跳过权限验证启动 mysqld 是唯一安全入口
必须让 mysqld 启动时不读取权限表,才能连上并手动插入 root 用户。关键点不是“怎么初始化”,而是“怎么绕过认证”。操作前确认服务已停止:
- 编辑配置文件(如
/etc/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf),在[mysqld]段下添加:skip-grant-tables skip-networking
(skip-networking防止远程未授权访问) - 重启 mysqld:
sudo systemctl restart mysql(或mysqld_safe --skip-grant-tables &) - 此时可无密码登录:
mysql -u root
手动插入 root 用户必须匹配 auth_plugin 和 host
MySQL 5.7+ 默认使用 caching_sha2_password 插件(8.0+ 更常见),但老版本可能用 mysql_native_password;host 必须是 'localhost'(Unix socket)或 '127.0.0.1'(TCP),二者权限记录不互通。执行前先查当前插件:
SELECT plugin FROM mysql.user WHERE User='root' AND Host='localhost';
若结果为空,按实际版本补全(示例为 5.7 兼容写法):
INSERT INTO mysql.user (Host,User,authentication_string,plugin,ssl_cipher,x509_issuer,x509_subject,account_locked) VALUES ('localhost','root',PASSWORD('your_new_pass'),'mysql_native_password','','','','N');
注意:
-
PASSWORD()函数在 8.0+ 已移除,改用SHA2('your_new_pass',256)+UNHEX()组合,或直接用ALTER USER(需先有连接) - 必须执行
FLUSH PRIVILEGES;才生效 - 别漏掉
account_locked='N',否则用户被锁
退出后务必清理 skip-grant-tables 并验证权限
改完配置后不重启、不删配置项,mysqld 会持续裸奔。正确流程是:
- 退出 MySQL 客户端
- 注释或删除配置文件里的
skip-grant-tables和skip-networking - 重启服务:
sudo systemctl restart mysql - 用新密码测试:
mysql -u root -p→ 输入刚设的密码 - 验证是否拥有全部权限:
SHOW GRANTS FOR 'root'@'localhost';应含GRANT ALL PRIVILEGES ON *.*
最容易被忽略的是:忘记删 skip-networking 导致本地能连但远程应用连不上;或者插入时用了 '%' 作为 Host,结果因 bind-address 或防火墙限制根本连不进,白白以为修复失败。


















