不会自动重置权限,但升级(如5.7→8.0)因认证插件变更(mysql_native_password→caching_sha2_password)及系统表结构调整,常致“能解析但连不上”或“连上无权限”。

MySQL升级会重置或破坏用户权限吗
不会自动重置,但极大概率导致权限失效——不是数据丢了,而是“读得懂但连不上”或“连上了却没权限”。核心问题出在认证插件和系统表结构变更上。比如从5.7升到8.0,默认认证插件从mysql_native_password变成caching_sha2_password,老版本PHP、Java JDBC驱动(如Connector/J Authentication plugin 'caching_sha2_password' cannot be loaded。
- 升级前务必检查所有应用连接字符串中是否硬编码了
useSSL=false或未指定serverTimezone,这些在8.0+下可能触发隐式拒绝 -
mysql.user表字段有新增(如account_locked)、类型调整(plugin字段长度扩大),就地升级时mysql_upgrade(MySQL 8.0.16+已废弃)或自动升级流程若中断,会导致权限表元数据损坏 - MySQL 8.0开始强制
root@localhost使用caching_sha2_password,但你手动创建的普通用户若没显式指定IDENTIFIED WITH mysql_native_password,也会被套用新插件
迁移时权限表能直接用mysqldump导出导入吗
可以导,但不能直接导mysql库全量恢复——尤其跨大版本时,mysqldump mysql user db procs_priv生成的SQL在目标实例执行会失败。因为5.7的user表有45列,8.0是49列,缺的字段(如password_last_changed、account_locked)会导致INSERT报错Column count doesn't match value count。
- 安全做法是只用
SHOW GRANTS FOR 'user'@'host'逐个导出授权语句,再在新实例重放:它不依赖表结构,只生成标准SQL - 批量生成脚本可用:
SELECT CONCAT('SHOW GRANTS FOR ''', user, '''@''', host, ''';') FROM mysql.user WHERE user NOT IN ('mysql.infoschema', 'mysql.session', 'mysql.sys'); - 若必须导系统表,请确保源和目标版本完全一致(如都是8.0.33),且目标实例已初始化完成、服务启动后再导入,否则
mysql库的innodb引擎元数据可能冲突
升级后哪些权限相关行为会静默变化
最危险的是“看起来正常,实际权限变窄”。比如MySQL 8.0收紧了CREATE VIEW权限校验逻辑:以前只要对视图定义中的表有SELECT权即可,现在还要求对视图本身有CREATE VIEW和SHOW VIEW权;又比如PROCESS权限不再允许普通用户看到其他用户的完整SQL(仅显示前100字符),监控类应用可能突然查不到慢查询详情。
-
SELECT权限不再隐式授予SHOW CREATE TABLE,需单独授权 - 角色(Role)功能默认启用,但旧应用若没适配
SET ROLE语法,切换上下文时会报错Access denied; you need (at least one of) the SYSTEM_USER privilege(s) - 复制账号(如
repl用户)必须显式授予BACKUP_ADMIN权限才能在8.0+启停GTID复制,否则START SLAVE直接失败
验证权限是否真正生效的实操方法
别只测SELECT 1,要模拟真实业务路径。比如电商系统下单接口依赖INSERT订单表+UPDATE库存表+调用存储过程sp_deduct_stock,就得分别验证这三者在新环境是否可执行。
- 用应用账户登录后,执行
SELECT CURRENT_ROLE(), USER(), CURRENT_USER();确认实际生效身份(注意CURRENT_USER反映授权主体,USER是连接凭据) - 检查关键对象权限:
SHOW GRANTS FOR CURRENT_USER;+SELECT * FROM information_schema.role_table_grants WHERE grantee = "'app_user'@'%'; - 对存储过程/函数,必须额外验证
EXECUTE权限:CALL sp_deduct_stock(123, 1);,不能只看SHOW CREATE PROCEDURE
最容易被忽略的是:升级后root用户可能被限制为仅localhost访问,而应用配置里写的是%或IP,此时连都连不上——别急着修权限,先看SELECT host,user FROM mysql.user WHERE user='root';,再决定是改host还是建新用户。










