MySQL升级后权限异常需三步解决:先运行mysql_upgrade或mysqld --upgrade确保权限表结构匹配;再检查用户认证插件是否兼容(如caching_sha2_password与mysql_native_password);最后用目标用户实操验证权限而非仅看SHOW GRANTS。

MySQL升级后出现权限异常,通常是因为新版本对权限表结构、默认权限或认证插件做了调整,旧的权限数据未被正确迁移或兼容。重点检查mysql系统库中的权限表(如user、db、tables_priv等)是否完成升级,以及用户认证方式是否适配。
确认权限表是否已升级
MySQL major版本升级(如5.7→8.0)后,必须运行mysql_upgrade工具(8.0.16之后由mysqld --upgrade自动触发),否则权限表结构可能不匹配,导致授权失效或报错“Access denied”。
- 登录后执行
SELECT VERSION();确认当前版本 - 检查
mysql.user表字段是否包含plugin、authentication_string等新版字段(5.7+已弃用Password字段) - 若字段缺失或报错“Unknown column”,说明
mysql_upgrade未执行或失败,需手动补做
检查用户认证插件是否兼容
MySQL 8.0 默认使用caching_sha2_password插件,而老版本客户端或应用可能只支持mysql_native_password,造成连接成功但权限不生效(尤其在代理或中间件场景下)。
- 查用户当前插件:
SELECT User, Host, plugin FROM mysql.user WHERE User = 'xxx'; - 临时降级兼容(测试用):
ALTER USER 'xxx'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd'; - 生产环境建议升级客户端驱动,而非长期回退认证方式
验证权限是否实际生效
升级后部分权限(如动态权限、角色权限、列级权限)行为有变化,且SHOW GRANTS结果可能未实时反映变更,需结合实际操作验证。
- 用目标用户登录,执行
SHOW GRANTS;,确认输出与预期一致 - 尝试执行原业务SQL(如
INSERT INTO db1.t1),而非仅依赖SELECT测试 - 注意8.0新增的
SYSTEM_USER等保留权限,避免误授或冲突
批量修复历史用户权限
若大量用户权限异常,可导出旧权限(升级前备份的mysql库SQL)并重载,但需注意字段映射和密码哈希格式差异。
- 优先从
mysqldump --skip-triggers --compact mysql user db tables_priv columns_priv procs_priv获取干净权限语句 - 替换
PASSWORD('xxx')为authentication_string值(可用SELECT authentication_string FROM mysql.user参考格式) - 导入前停用
sql_mode=NO_AUTO_CREATE_USER(8.0已移除该模式,需清理相关语法)
权限问题本质是元数据不一致或行为逻辑变更,不是单纯重启或刷新就能解决。核心动作就三步:升级权限表、核对认证方式、实操验证权限。不复杂但容易忽略细节。










