GRANT执行成功但SHOW GRANTS返回空,说明mysql.user等系统表结构损坏,字段缺失或引擎非InnoDB,需用mysqld --upgrade=FORCE强制修复并确保plugin兼容,而非手动UPDATE或仅FLUSH PRIVILEGES。
GRANT执行成功但SHOW GRANTS返回空,说明权限表结构损坏
这不是语法写错或权限没给,是mysql.user、mysql.db等系统表字段缺失或引擎非innodb。mysql 8.0要求所有系统表必须是innodb引擎、字段名与官方定义严格一致(比如password_last_changed)。一旦看到:error 1054 (42s22): unknown column 'password_last_changed' in 'field list',就说明表结构已不匹配当前版本。
常见诱因包括:从 MySQL 5.7 直接拷贝MyISAM格式的user.MYD文件、跨大版本升级未清空旧mysql/目录、或误用--skip-grant-tables后手动删改表。
- 别在
--skip-grant-tables下手动UPDATE mysql.user——漏改任意一个字段(如Account_locked、Password_reuse_history)都会导致认证失败 -
FLUSH PRIVILEGES在跳过模式下只刷新内存缓存,不修复磁盘数据 - 真正该做的是让 MySQL 自动重建结构:用
mysqld --upgrade=FORCE
ALTER USER后权限仍不生效,缺了FLUSH PRIVILEGES或Host不匹配
MySQL 8.0+多数情况自动重载权限,但在Docker容器、跨版本升级、或启用了innodb_force_recovery时,FLUSH PRIVILEGES仍是硬性要求。更常被忽略的是Host匹配问题:命令行用mysql -u user -p默认走 Unix socket(等价于'user'@'localhost'),而 Windows 下可能走 TCP(等价于'user'@'127.0.0.1')——两者在权限系统里是完全不同的用户。
- 确认用户存在:
SELECT User, Host FROM mysql.user WHERE User = 'your_user'; - 检查插件是否兼容:
SELECT User, Host, plugin FROM mysql.user WHERE User='root';,若为caching_sha2_password且 phpMyAdmin ≤ 5.0.2,则必须改回mysql_native_password - 改完后必须执行:
FLUSH PRIVILEGES;,否则修改不会落地 - 改完立即重启 MySQL 服务(phpEnv 点“重启 M”,Linux 执行
sudo systemctl restart mysql)
phpMyAdmin界面点“添加用户账户”没反应,根本不是前端bug
这是底层权限不足或表单校验失败的静默表现。phpMyAdmin 创建用户依赖CREATE USER、INSERT和UPDATE权限,若当前登录账号(比如root)被限制了这些权限,操作就会失败且无提示。
- 确保当前账号对
mysql.user表有写权限 -
Host字段不能留空,必须填localhost或具体 IP,慎用% - 密码字段不能全为空格——哪怕只输一个空格也会创建失败
- 勾选
Grant复选框允许该用户再授予权限,生产环境严禁启用 - 权限提交后 phpMyAdmin 不会自动
FLUSH PRIVILEGES,MySQL 5.7 及更早版本需手动执行
新用户命令行连不上但 phpMyAdmin 能查到,90%是Host二元组错配
MySQL 的用户是'username'@'host'二元组,phpMyAdmin 默认创建的是'user'@'localhost',而你本地命令行如果没显式指定-h 127.0.0.1,Linux/macOS 默认走 socket(即localhost),Windows 却默认走 TCP(即127.0.0.1)。这两个 host 在权限系统里互不认。
立即学习“PHP免费学习笔记(深入)”;
- 查当前用户:
SELECT User, Host FROM mysql.user WHERE User = 'your_user'; - 若只有
'user'@'localhost',想用 TCP 连,就得额外创建'user'@'127.0.0.1' - 远程访问必须显式创建
'user'@'%'或'user'@'具体IP',不能靠改localhost来“凑合” - 创建后务必执行:
FLUSH PRIVILEGES;,否则新用户不会被加载
plugin或password后不重启 MySQL 服务,或者FLUSH PRIVILEGES漏掉分号。



















