SHOW GRANTS不能完整导出权限,因不包含角色继承权限、撤销状态、WITH GRANT OPTION位置,且无CREATE USER语句;应使用mysqldump --users配合--roles(8.0.16+)导出,并注意导入顺序、FLUSH PRIVILEGES及host匹配规则。
导出用户权限时为什么不能只用
?
因为
默认只返回当前用户的显式授权语句,不包含角色继承的权限、全局权限被显式撤销(
)后的状态,也不体现
的精确位置。更关键的是:它不输出
语句,迁移后目标库可能连用户都不存在。
实操建议:
用
导出用户和权限——这是最接近“完整快照”的方式,会生成
+
+
组合
若只能手动拼,务必先查
表确认
、
、
等字段,否则导入后用户无法登录
注意 MySQL 5.7 和 8.0 的密码字段名不同:
(5.7) vs
(8.0),混用会导致空密码或认证失败
导入前必须清理目标库的旧用户权限
直接执行导出的
语句大概率报错:
,因为用户已存在;或者权限叠加导致意外交叉授权。
实操建议:
导入前先运行
—— 不要依赖
,MySQL 8.0+ 才支持该语法,且不解决已有权限残留问题
如果不能删用户(比如生产环境需保留历史登录记录),改用
+
清空再授
特别注意:
不会删除用户本身,也不会重置密码或锁定状态,这些必须单独处理
MySQL 8.0 的角色机制让批量迁移更复杂
在 8.0 中,权限常通过角色间接授予,
默认不展开角色权限,导出的 SQL 里只有
,但没导出
自身的权限定义。
MySQL(Linux)
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
下载
实操建议:
导出时加
参数(MySQL 8.0.16+ 支持):
,否则角色权限会丢失
若版本不支持,需手动补全:先查
找角色归属,再查
和
等表拼角色权限(不推荐,易漏)
导入顺序很重要:必须先创建角色,再把角色授予用户,最后才给角色赋权;顺序错会报
导入后验证权限是否真正生效
执行完 SQL 不等于权限就对了。常见假象是
看起来一样,但实际连接时提示
,原因可能是 host 匹配规则、SQL mode 差异,或权限缓存未刷新。
实操建议:
导入后立刻执行
—— 虽然多数情况自动刷新,但跨版本迁移时保险起见必须加
用目标用户真实连接测试:
,重点看
返回的 host 是否和授权时一致(比如
无法匹配 localhost 连接)
检查目标库的
,某些模式(如
)会让
语句静默失败
最容易被忽略的是 host 解析逻辑:MySQL 认证时先匹配最具体的 host(如
),再 fallback 到通配符(
),但
是特殊通道,走 socket 而非 TCP,不会匹配
。迁移后如果用户从本地连不上,八成是这个原因。
SHOW GRANTSSHOW GRANTS FOR 'user'@'host'REVOKEWITH GRANT OPTIONCREATE USERmysqldump --no-data --skip-triggers --skip-routines --usersCREATE USERGRANTSET PASSWORDmysql.userauthentication_stringaccount_lockedpassword_expiredpasswordauthentication_stringGRANTERROR 1396 (HY000): Operation CREATE USER failed for 'xxx'@'yyy'DROP USER IF EXISTS 'user'@'host'CREATE USER ... IF NOT EXISTSREVOKE ALL PRIVILEGES ON *.* FROM 'user'@'host'REVOKE GRANT OPTION ON *.* FROM 'user'@'host'REVOKESHOW GRANTSGRANT role_name TO 'user'@'host'role_name--rolesmysqldump --no-data --users --rolesmysql.role_edgesmysql.proxies_privmysql.tables_privERROR 3530 (HY000): Role does not existSHOW GRANTSAccess deniedFLUSH PRIVILEGESmysql -u user -p -h target_host -e "SELECT USER(), CURRENT_USER()"CURRENT_USER()'user'@'%'sql_modeNO_AUTO_CREATE_USERGRANT'user'@'192.168.1.100''user'@'%''user'@'localhost''user'@'%'