根本原因是未停净旧进程、未匹配通信协议(Windows缺--shared-memory)、或未执行FLUSH PRIVILEGES;须先杀尽mysqld进程,Linux加--skip-networking,Windows必加--shared-memory,登录后立即FLUSH PRIVILEGES再ALTER USER重置密码并指定mysql_native_password插件。

mysqld --skip-grant-tables 启动后连不上 MySQL
根本不是参数写错了,而是你连的压根不是那个跳过权限的实例。常见原因有三个:mysqld 进程没杀干净、端口或 socket 被已有服务占用、Windows 下缺 --shared-memory。Linux 下务必先执行 ps aux | grep mysqld,确认所有 mysqld 进程已退出;Windows 下必须用管理员命令行,cd 进 MySQL bin 目录后运行:mysqld --skip-grant-tables --shared-memory --console——漏掉 --shared-memory,Windows 会静默失败。
执行 ALTER USER 或 UPDATE 报 ERROR 1290
错误信息 ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement 是明确提示:MySQL 当前没加载权限表,所以禁止任何账户管理语句。解决方法只有一条:FLUSH PRIVILEGES; 必须在连接成功后第一时间执行。它会强制从磁盘重新加载 mysql.user 表到内存,之后才能安全运行 ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpass';。不执行这步就直接改密码,必然报错或静默失效。
改完密码还是 Access denied
问题往往出在 host 匹配和认证插件上。MySQL 5.7 默认建了至少两条 root 记录:'root'@'localhost' 和 'root'@'127.0.0.1'(有时还有 'root'@'%')。你改的是哪一条?先查:SELECT User, Host, plugin, authentication_string FROM mysql.user WHERE User = 'root';。如果返回的 plugin 是 caching_sha2_password(常见于 8.0+ 或升级后的实例),而客户端不支持该插件,就会拒绝登录。此时需显式指定插件:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'newpass';。
UPDATE authentication_string = PASSWORD('xxx') 为什么无效
这个操作在 MySQL 5.7.6+ 已不可靠:PASSWORD() 函数行为不稳定,且生成的哈希值可能不被当前认证插件接受;更关键的是,直接更新字段绕过了 MySQL 的密码校验逻辑,容易导致 password_expired、account_locked 等状态字段未同步更新。官方自 5.7.6 起就明确要求使用 ALTER USER——它自动处理哈希生成、插件适配、状态重置和权限刷新。硬塞 authentication_string 字段,等于自己拼接密码协议,风险远大于便利。











