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字段)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;,确认输出与预期一致INSERT INTO db1.t1),而非仅依赖SELECT测试SYSTEM_USER等保留权限,避免误授或冲突若大量用户权限异常,可导出旧权限(升级前备份的mysql库SQL)并重载,但需注意字段映射和密码哈希格式差异。
mysqldump --skip-triggers --compact mysql user db tables_priv columns_priv procs_priv获取干净权限语句PASSWORD('xxx')为authentication_string值(可用SELECT authentication_string FRO
M mysql.user参考格式)sql_mode=NO_AUTO_CREATE_USER(8.0已移除该模式,需清理相关语法)权限问题本质是元数据不一致或行为逻辑变更,不是单纯重启或刷新就能解决。核心动作就三步:升级权限表、核对认证方式、实操验证权限。不复杂但容易忽略细节。