mysqld --skip-grant-tables 启动后仍连不上,主因是与已运行的MySQL服务(如phpEnvMySQL)端口冲突或缺少--shared-memory参数;MySQL 5.7.6+需用authentication_string字段、8.0.11+须用ALTER USER配合caching_sha2_password插件;改密后还需同步更新phpEnv三处配置并清除浏览器缓存。

为什么 mysqld --skip-grant-tables 启动后还是连不上?
常见现象是命令执行后黑窗卡住、无响应,或后续 mysql -u root -p 仍报 Access denied。根本原因不是命令写错了,而是它和当前 MySQL 服务冲突——phpEnv 或 Windows 系统里通常已注册了名为 phpEnvMySQL 的服务,直接运行 mysqld 二进制会因端口占用、配置路径错乱或缺少 --shared-memory 参数而失败。
正确做法是:
- 先在 Windows 服务管理器中停止
phpEnvMySQL(或类似名称的服务) - 以管理员身份打开命令行,cd 进到
phpEnv\MySQL\bin - 执行:
mysqld --skip-grant-tables --shared-memory --console - 这个窗口保持打开,另起一个命令行窗口操作登录
UPDATE user SET password=... 为什么总报错 Unknown column 'password'?
这是 MySQL 5.7.6+ 和 8.0 的典型兼容断层:老教程里的 password 字段在 5.7 中已被移除,改用 authentication_string;到了 8.0.11+,连 PASSWORD() 函数也废弃了。你看到的错误 ERROR 1054 (42S22): Unknown column 'password' in field list 就是版本不匹配的明确信号。
按版本选对语句:
- MySQL 5.7.x(非 8.0):
UPDATE mysql.user SET authentication_string = PASSWORD('新密码') WHERE User = 'root' AND Host = 'localhost'; - MySQL 8.0.11+:
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '新密码'; - 不确定版本?先查:
SELECT VERSION();和SELECT User, Host FROM mysql.user WHERE User = 'root';
改完密码后 phpMyAdmin 还连不上,是哪里漏了?
只改 MySQL 服务端密码,不等于所有客户端都能自动同步。phpEnv 环境下至少有三处必须手动更新:
-
phpEnv\config\mysql.ini中的password=行 - phpEnv 控制面板界面里“MySQL 设置”页中的密码输入框(保存后会重写配置)
-
phpEnv\phpmyadmin\config.inc.php中的$cfg['Servers'][$i]['password']值
少改一处,对应组件就会持续报 mysqli_real_connect(): (HY000/1045): Access denied。注意:修改 config.inc.php 后需清浏览器缓存,否则可能仍走旧会话。
为什么 FLUSH PRIVILEGES 有时没用?
在 --skip-grant-tables 模式下执行 FLUSH PRIVILEGES 是无效操作——权限系统根本没加载。此时真正生效的是你对 mysql.user 表的直接修改,只要 UPDATE 或 ALTER USER 执行成功且没报错,就已完成密码变更。
但退出跳过模式、重启正常服务后,FLUSH PRIVILEGES 就必须补上,尤其当你用了 UPDATE 方式而非 ALTER USER。否则新密码可能不会立即生效,表现为首次登录成功,第二次又拒绝。
最容易被忽略的是:改完后忘了关掉 --skip-grant-tables。若通过 my.ini 添加了该配置,务必删掉再重启服务;若用命令行启动,关掉那个黑窗即可——留着它,整个 MySQL 就永远处于无权限验证状态,极其危险。


















