mysql迁移后出现权限丢失问题,本质是用户权限相关的数据没有被同步到新的mysql实例中。mysql的用户账号、权限规则都存储在mysql系统库的user、db、tables_priv等表中,如果迁移时只迁移了业务数据库,没有处理这些系统表数据,就会导致原有账号权限失效。

权限丢失的常见原因
迁移过程中权限丢失通常由以下几种情况导致:
- 仅使用工具迁移了业务数据库,忽略了
mysql系统库的同步 - 新实例初始化时自动生成了默认的权限表,覆盖了原有导出的权限数据
- 迁移时使用了不兼容的mysql版本,权限表结构存在差异导致数据导入失败
- 导出权限数据时没有包含完整的权限相关表,遗漏了部分权限规则
方法一:直接同步mysql系统库权限表
这种方式适合迁移前后mysql版本一致,且新实例没有重要权限需要保留的场景,操作步骤如下:
1. 在源mysql实例导出权限相关表
使用mysqldump工具导出mysql库中存储权限的核心表,避免导出整个系统库带来的冗余数据:
# 导出mysql库的user、db、tables_priv、columns_priv四个核心权限表 mysqldump -u root -p --databases mysql --tables user db tables_priv columns_priv > mysql_priv_tables.sql
2. 将导出文件传输到新实例所在服务器
可以使用scp等工具将导出的sql文件传输到目标服务器,确保文件可正常读取。
3. 在新实例中导入权限表
先停止新实例的mysql服务,备份原有的权限表,再导入导出的数据,最后重启服务:
# 停止mysql服务 systemctl stop mysqld # 备份新实例原有的权限表 cp /var/lib/mysql/mysql/user.frm /var/lib/mysql/mysql/user.frm.bak cp /var/lib/mysql/mysql/user.MYD /var/lib/mysql/mysql/user.MYD.bak cp /var/lib/mysql/mysql/user.MYI /var/lib/mysql/mysql/user.MYI.bak # 导入权限表数据,注意替换文件路径 mysql -u root -p mysql < mysql_priv_tables.sql # 重启mysql服务 systemctl start mysqld
4. 验证权限是否恢复
登录新实例的mysql,查询用户列表确认权限是否同步:
-- 查询所有用户账号 SELECT user, host FROM mysql.user; -- 查询指定用户的权限 SHOW GRANTS FOR 'test_user'@'localhost';
方法二:导出权限语句后执行导入
这种方式兼容性更强,适合跨小版本迁移,或者不想直接操作权限表文件的场景,核心是先导出所有权限的SQL语句,再在新实例执行。
1. 在源实例生成权限导出脚本
可以使用mysql内置的命令拼接出所有权限的创建语句,也可以自己编写脚本遍历权限表生成语句,以下是直接查询生成权限语句的示例:
-- 生成所有用户的创建和授权语句,结果可以直接保存为sql文件执行
SELECT
CONCAT(
"CREATE USER '",
user,
"'@'",
host,
"' IDENTIFIED BY PASSWORD '",
authentication_string,
"';"
) AS create_user_sql,
CONCAT(
"GRANT ",
Super_priv,
",",
Select_priv,
",",
Insert_priv,
",",
Update_priv,
",",
Delete_priv,
" ON *.* TO '",
user,
"'@'",
host,
"';"
) AS grant_sql
FROM mysql.user
WHERE user != 'root' AND user != '';
注意实际场景中权限类型更多,需要根据mysql.user表的所有权限字段拼接完整的GRANT语句,也可以使用工具如pt-show-grants直接生成完整的权限语句。
2. 在新实例执行导出的权限语句
将生成的权限SQL语句保存为文件,在新实例中执行:
# 执行权限语句文件 mysql -u root -p < grant_sql.sql
3. 刷新权限使配置生效
执行完语句后需要刷新权限缓存:
-- 刷新权限 FLUSH PRIVILEGES;
操作注意事项
- 操作前一定要备份新实例的
mysql系统库,避免操作失误导致新实例权限完全丢失 - 如果迁移前后mysql版本差异较大,优先选择方法二,避免权限表结构不兼容导致数据损坏
- 导入权限后需要验证业务账号是否能正常连接和操作对应数据库,确认权限符合预期
- 如果新实例已经有部分业务账号,需要提前整理权限差异,避免覆盖现有有效权限
权限同步方法对比
| 对比项 | 同步权限表方法 | 导出权限语句方法 |
|---|---|---|
| 适用场景 | 版本一致、无现有权限保留需求 | 跨版本、需保留现有权限 |
| 操作复杂度 | 较低,直接导出导入即可 | 较高,需要生成完整权限语句 |
| 兼容性 | 差,依赖权限表结构一致 | 强,仅依赖SQL语法兼容 |
| 风险程度 | 较高,直接操作表文件易出错 | 较低,语句执行可逆性更强 |