mysql 8.0在windows下使用--skip-grant-tables启动必须显式指定--shared-memory(或--named-pipe),否则因未启用任何通信协议而报错;linux则应通过systemctl edit临时覆盖execstart参数,禁用mysqld_safe;重置密码需先清空authentication_string再alter user,并指定mysql_native_password插件以确保客户端兼容。

MySQL 8.0启动时加--skip-grant-tables报错“TCP/IP, --shared-memory or --named-pipe should be configured”
这是 Windows 环境下最常见的卡点:MySQL 8.0 在 NT 系统上强制要求启用至少一种通信协议,而 --skip-grant-tables 单独使用时默认不启用任何协议,直接崩溃。
必须显式加上 --shared-memory(Windows 下最稳妥)或 --named-pipe。Linux 不需要这个,但 Windows 下漏掉就会启动失败。
- 先确保所有
mysqld.exe进程已结束(任务管理器 → 详细信息 → 结束全部) - 以管理员身份打开命令行,
cd到 MySQL 的bin目录(如phpEnv\Extensions\MySQL80\bin或C:\Program Files\MySQL\MySQL Server 8.0\bin) - 执行:
mysqld --shared-memory --skip-grant-tables --console(--console便于看到错误日志) - 该窗口会阻塞,别关 —— 这是正常现象,表示 mysqld 已运行在无权限校验模式
登录后执行ALTER USER 'root'@'localhost' IDENTIFIED BY 'xxx'报错“ERROR 1396 (HY000): Operation ALTER USER failed”
MySQL 8.0+ 要求先清空 authentication_string 字段,再设新密码。直接 ALTER USER 会因旧认证数据冲突失败。
必须分两步操作(顺序不能颠倒):
USE mysql;-
UPDATE user SET authentication_string = '' WHERE user = 'root';(注意是单引号、空字符串,不是NULL) ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码';-
FLUSH PRIVILEGES;(虽然 8.0+ 多数情况自动刷新,但此处显式执行更保险)
如果还报错,检查是否漏了 @'localhost' —— MySQL 8.0 默认只创建 'root'@'localhost',不是 'root'@'%'。
重置后用mysql -u root -p仍连不上,提示“Access denied for user 'root'@'localhost'”
大概率是认证插件不匹配。MySQL 8.0 默认用 caching_sha2_password,但某些客户端(尤其是老版本 phpMyAdmin、Navicat 或命令行工具)可能不支持,或者连接时没指定插件。
解决方法是在重置密码的同时明确指定插件:
- 登录无权限模式后,执行:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的新密码'; - 再执行:
FLUSH PRIVILEGES; - 这样后续连接就兼容绝大多数客户端,无需额外配置
如果坚持用 caching_sha2_password,客户端连接时需加参数:mysql -u root -p --default-auth=caching_sha2_password
Linux 下用systemctl管理服务时,mysqld_safe --skip-grant-tables &启动失败或无法生效
mysqld_safe 是旧版脚本,MySQL 8.0 官方已弃用,且与 systemd 冲突严重。它可能读取不到你改的 /etc/my.cnf,或被 systemd 的服务单元覆盖。
正确做法是临时修改 systemd 服务配置:
- 执行:
sudo systemctl edit mysql(或mariadb,依实际服务名而定) - 输入以下内容(覆盖启动参数):
[Service] ExecStart= ExecStart=/usr/sbin/mysqld --defaults-file=/etc/mysql/my.cnf --skip-grant-tables --user=mysql
- 保存退出后:
sudo systemctl daemon-reload && sudo systemctl restart mysql - 验证:
sudo systemctl status mysql看是否运行中且无报错
操作完务必还原:sudo systemctl revert mysql,否则下次重启仍跳过权限校验 —— 这是高危状态,绝不能留着。
整个流程中最容易被忽略的是:Windows 下必须用 --shared-memory 配合 --skip-grant-tables,Linux 下不能依赖 mysqld_safe,以及 MySQL 8.0 密码字段和插件的强耦合性 —— 少一个环节,就卡在 Access denied 里出不来。











