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 通层面。冒烟测试阶段必须覆盖端口可达性、延迟阈值、吞吐量基线以及防火墙策略。以下步骤建议在迁移工具执行前完成。

  1. 基础连通性测试:从目标库所在主机向源库执行 telnet <source_ip> 3306,确认端口开放。
  2. 延迟与丢包率:使用 ping -c 100 <source_ip> 统计平均延迟与丢包率,要求延迟 < 5ms,丢包率 = 0%。
  3. TCP 吞吐量基线:使用 iperf3 -c <source_ip> -t 30 测量带宽,确保不低于迁移工具预估吞吐量的 2 倍。
  4. 防火墙与安全组:确认源库与目标库之间的 3306 端口(或自定义端口)在双向安全组中放行,且无中间代理阻断长连接。
  5. DNS 解析与 hosts:验证 nslookup <source_hostname> 返回正确 IP,避免因 DNS 缓存导致连接失败。
📌 冒烟测试关键指标:在迁移工具启动前,使用 mysql -h <target_ip> -u <user> -p -e "SELECT 1;" 从源库所在主机直连目标库。如果这条命令在 2 秒内返回结果,网络链路基本合格。
网络连通性验证流程 源库主机 目标库主机 Step 1: ping Step 2: telnet Step 3: iperf3 Step 4: mysql直连 验证结论 所有步骤通过 → 网络链路合格;任一步骤失败 → 标记为阻塞项,修复后重新验证

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 生成完整的权限重建脚本。该工具会自动处理用户、角色、全局权限与对象权限的依赖顺序,避免因权限缺失导致的迁移中断。
权限预检四层架构 权限预检四层架构 用户与认证 user / host / plugin 全局权限 SELECT, INSERT, ... 对象权限 DB / Table / Column 角色与继承 role_edges / grants 预检输出:权限差异报告 缺失用户 / 权限不足 / 角色未创建 → 生成修复脚本 预检顺序:先用户 → 再全局权限 → 再对象权限 → 最后角色继承 任何一层缺失都可能导致迁移后应用连接失败或操作被拒

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 ...
📋 冒烟测试通过标准:所有环境检查项状态为“✅ 通过”,网络连通性验证全部步骤通过,权限预检无阻塞项。只要存在一个“❌ 阻塞”项,迁移流程不得进入下一阶段。