2. 迁移前准备:源库与目标库环境检查清单、网络连通性验证、权限与角色预检
数据库迁移的成败,往往在第一条 SQL 执行之前就已注定。迁移前准备阶段的核心目标,是系统性地消除环境层面的不确定性。本章围绕三大支柱展开:环境配置基线对齐、网络链路可用性验证、权限与角色的完整性预检。以下内容可直接作为冒烟测试的检查清单使用。
2.1 源库与目标库环境检查清单
环境检查应覆盖操作系统、数据库版本、字符集、存储参数与关键配置项。建议使用下表进行逐项比对,任何一项不匹配都应标记为阻塞项(Blocking Issue)。
| 检查维度 | 检查项 | 源库要求 | 目标库要求 | 验证方法 |
|---|---|---|---|---|
| 操作系统 | 内核版本 / 架构 | Linux 5.x x86_64 | Linux 5.x x86_64 | uname -r && uname -m |
| 数据库版本 | 大版本与小版本 | MySQL 8.0.32 | MySQL 8.0.32 或 8.4.x | SELECT VERSION(); |
| 字符集 | 默认字符集与排序规则 | utf8mb4 / utf8mb4_0900_ai_ci | utf8mb4 / utf8mb4_0900_ai_ci | SHOW VARIABLES LIKE 'character_set_server'; |
| 存储引擎 | 默认引擎 | InnoDB | InnoDB | SHOW ENGINES; |
| 时区 | 系统时区与数据库时区 | UTC / Asia/Shanghai | 与源库一致 | SHOW VARIABLES LIKE 'time_zone'; |
| 最大连接数 | max_connections | ≥ 500 | ≥ 源库当前峰值 × 1.5 | SHOW VARIABLES LIKE 'max_connections'; |
| 磁盘空间 | 数据目录可用空间 | ≥ 当前数据量 × 1.2 | ≥ 源库数据量 × 2.0 | df -h /data/mysql |
⚠️ 常见陷阱:字符集不一致是迁移后乱码的首要原因。即使源库与目标库都声明为 utf8mb4,排序规则(collation)不同也可能导致索引失效或查询结果异常。务必在迁移前执行
SELECT @@collation_server; 确认两侧一致。
2.2 网络连通性验证
网络验证不能只停留在 ping 通层面。冒烟测试阶段必须覆盖端口可达性、延迟阈值、吞吐量基线以及防火墙策略。以下步骤建议在迁移工具执行前完成。
- 基础连通性测试:从目标库所在主机向源库执行
telnet <source_ip> 3306,确认端口开放。 - 延迟与丢包率:使用
ping -c 100 <source_ip>统计平均延迟与丢包率,要求延迟 < 5ms,丢包率 = 0%。 - TCP 吞吐量基线:使用
iperf3 -c <source_ip> -t 30测量带宽,确保不低于迁移工具预估吞吐量的 2 倍。 - 防火墙与安全组:确认源库与目标库之间的 3306 端口(或自定义端口)在双向安全组中放行,且无中间代理阻断长连接。
- DNS 解析与 hosts:验证
nslookup <source_hostname>返回正确 IP,避免因 DNS 缓存导致连接失败。
📌 冒烟测试关键指标:在迁移工具启动前,使用
mysql -h <target_ip> -u <user> -p -e "SELECT 1;" 从源库所在主机直连目标库。如果这条命令在 2 秒内返回结果,网络链路基本合格。
2.3 权限与角色预检
权限问题是迁移过程中最隐蔽的故障源。源库中存在的用户、角色、对象权限,在目标库中必须完整重建,否则迁移后的应用将出现连接拒绝或操作被拒。预检应覆盖以下四个层面。
2.3.1 用户与认证方式
- 使用
SELECT user, host, plugin FROM mysql.user;导出源库所有用户清单。 - 检查
plugin列:如果源库使用caching_sha2_password,目标库必须支持该插件;如果使用mysql_native_password,需确认目标库未禁用旧认证协议。 - 逐行比对目标库用户清单,确保无遗漏。
2.3.2 全局权限与对象权限
- 全局权限:
SHOW GRANTS FOR 'user'@'host';逐一导出。 - 数据库级权限:
SELECT * FROM mysql.db WHERE Db = 'target_db'; - 表级与列级权限:使用
mysqlpump --include-events --include-routines --users或pt-show-grants工具批量导出。
2.3.3 角色与角色权限
- MySQL 8.0+ 支持角色。使用
SELECT * FROM mysql.role_edges;查看角色继承关系。 - 使用
SHOW GRANTS FOR 'role_name';导出每个角色的权限。 - 在目标库中按相同顺序创建角色,再为用户授予角色。
2.3.4 权限预检脚本示例
-- 导出源库所有用户及其权限(适用于 MySQL 8.0)
SELECT CONCAT('SHOW GRANTS FOR ''', user, '''@''', host, ''';') AS grant_cmd
FROM mysql.user
WHERE user NOT IN ('mysql.session', 'mysql.sys', 'root');
-- 导出所有角色定义
SELECT CONCAT('CREATE ROLE IF NOT EXISTS ', role_name, ';') AS role_cmd
FROM information_schema.applicable_roles
GROUP BY role_name;
-- 检查目标库缺失的用户
SELECT u.user, u.host
FROM mysql.user u
WHERE u.user NOT IN ('mysql.session', 'mysql.sys', 'root')
AND (u.user, u.host) NOT IN (
SELECT user, host FROM target_mysql.user
);
💡 最佳实践:在迁移前,使用
pt-show-grants --separate --revoke 生成完整的权限重建脚本。该工具会自动处理用户、角色、全局权限与对象权限的依赖顺序,避免因权限缺失导致的迁移中断。
2.4 预检结果记录与阻塞项处理
所有检查项的结果应记录在统一的冒烟测试报告中。建议使用以下格式进行标记:
| 检查项 | 源库值 | 目标库值 | 状态 | 处理动作 |
|---|---|---|---|---|
| 数据库版本 | 8.0.32 | 8.0.32 | ✅ 通过 | — |
| 字符集 | utf8mb4 | utf8mb4 | ✅ 通过 | — |
| 网络延迟 | — | 2.3 ms | ✅ 通过 | — |
| 用户 'app_user'@'%' | 存在 | 缺失 | ❌ 阻塞 | 执行 CREATE USER ... IDENTIFIED BY ... |
| 角色 'read_only_role' | 存在 | 缺失 | ❌ 阻塞 | 执行 CREATE ROLE ...; GRANT SELECT ... |
📋 冒烟测试通过标准:所有环境检查项状态为“✅ 通过”,网络连通性验证全部步骤通过,权限预检无阻塞项。只要存在一个“❌ 阻塞”项,迁移流程不得进入下一阶段。