3. 源端环境评估:数据库版本、字符集、存储引擎、表结构复杂度、数据量统计与增长趋势分析
源端环境评估是数据库迁移的起点,也是决定迁移策略、工具选型与风险控制的核心依据。评估不充分,后续所有环节都可能出现不可预见的阻塞。本节从五个关键维度展开:数据库版本、字符集、存储引擎、表结构复杂度以及数据量统计与增长趋势。
3.1 数据库版本与兼容性评估
版本差异直接影响迁移工具的支持能力、SQL 语法兼容性以及二进制日志(Binlog)格式。评估时需明确以下信息:
| 评估项 | 检查内容 | 常见风险 |
|---|---|---|
| 主版本号 | 5.6 / 5.7 / 8.0 / 5.1 | 8.0 默认 caching_sha2_password 认证插件,旧客户端无法连接 |
| 小版本号 | 如 5.7.35 | 部分 Bug 在特定小版本修复,影响迁移稳定性 |
| Binlog 格式 | ROW / STATEMENT / MIXED | STATEMENT 格式可能导致数据不一致,推荐 ROW |
| GTID 开启状态 | ON / OFF | GTID 未开启时,主从切换与断点续传更复杂 |
| SQL_MODE | 如 ONLY_FULL_GROUP_BY | 目标端 SQL_MODE 不一致可能导致写入失败 |
实践建议:使用
SELECT VERSION() 获取版本号;通过 SHOW VARIABLES LIKE 'binlog_format' 确认 Binlog 格式;检查 @@GLOBAL.GTID_MODE 确认 GTID 状态。建议在迁移前将源端小版本升级至同主版本的最新补丁版。
3.2 字符集与排序规则评估
字符集不匹配是迁移后数据乱码、索引长度超限、排序异常的主要诱因。评估重点包括:
- 实例级字符集:
character_set_server、collation_server - 库级字符集:
DEFAULT CHARACTER SET - 表级字符集:
SHOW CREATE TABLE中的 CHARSET 声明 - 列级字符集:字段的
CHARACTER SET与COLLATE - 连接字符集:
character_set_client、character_set_connection
常见陷阱:源端使用 utf8mb3(别名 utf8),目标端使用 utf8mb4。虽然 utf8mb4 是 utf8mb3 的超集,但索引长度限制不同——utf8mb4 下 VARCHAR(255) 索引占用 1020 字节,可能超出 InnoDB 最大 767 字节限制,导致建表失败。迁移前必须检查所有索引列的长度。
3.3 存储引擎分布与兼容性
不同存储引擎在事务支持、锁机制、外键约束、全文索引等方面存在差异。迁移前需统计各引擎的表数量与数据量占比。
| 存储引擎 | 迁移关注点 | 目标端兼容性 |
|---|---|---|
| InnoDB | 事务、外键、MVCC | 完全兼容,推荐 |
| MyISAM | 不支持事务,表级锁,全文索引 | 需转换为 InnoDB,注意全文索引语法差异 |
| TokuDB / RocksDB | 压缩、写优化、分区 | 目标端可能不支持,需评估替代方案 |
| Memory | 数据易失,重启后清空 | 建议改为 InnoDB 并评估缓存策略 |
统计脚本示例:
SELECT ENGINE, COUNT(*) AS table_count,
ROUND(SUM(DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2) AS total_size_mb
FROM information_schema.TABLES
WHERE TABLE_SCHEMA NOT IN ('mysql','performance_schema','sys','information_schema')
GROUP BY ENGINE
ORDER BY total_size_mb DESC;
3.4 表结构复杂度评估
表结构复杂度直接影响 DDL 转换、数据校验与增量同步的难度。重点评估以下要素:
- 大字段与 BLOB:TEXT、MEDIUMTEXT、LONGTEXT、BLOB 等字段在迁移时占用大量网络带宽与内存,且无法在 WHERE 条件中直接使用。
- 外键约束:迁移顺序必须遵循外键依赖关系,否则导致写入失败。
- 自增列与序列:自增列在迁移后可能出现主键冲突,需提前设置偏移量或使用 UUID。
- 分区表:分区键、分区类型(RANGE/LIST/HASH)在目标端必须一致,否则数据无法正确路由。
- 触发器与存储过程:迁移后需重新编译,且目标端可能不支持源端特有的语法扩展。
复杂度量化方法:建议对每张表计算“复杂度评分”,评分因子包括:字段数(>50 加 1 分)、索引数(>10 加 1 分)、外键数(>5 加 2 分)、分区数(>100 加 2 分)、大字段数(>3 加 1 分)。评分 ≥5 的表应列为迁移重点监控对象。
3.5 数据量统计与增长趋势分析
数据量决定迁移窗口、网络带宽需求与存储规划。增长趋势则影响迁移后的容量规划与分库分表策略。
3.5.1 数据量统计维度
| 统计维度 | SQL / 方法 | 用途 |
|---|---|---|
| 总数据量 | SELECT SUM(DATA_LENGTH + INDEX_LENGTH) FROM information_schema.TABLES |
评估全量迁移耗时与存储需求 |
| Top N 大表 | ORDER BY DATA_LENGTH DESC LIMIT 20 |
识别迁移瓶颈表,考虑并行迁移或分批处理 |
| 行数统计 | SELECT TABLE_NAME, TABLE_ROWS FROM information_schema.TABLES |
评估索引重建与数据校验的耗时 |
| 碎片率 | DATA_FREE / (DATA_LENGTH + INDEX_LENGTH) |
高碎片表迁移前建议先 OPTIMIZE TABLE |
3.5.2 增长趋势分析方法
增长趋势分析需要至少 3 个月的历史监控数据,推荐使用以下方法:
- 日增量统计:通过 Binlog 解析或定时采集
information_schema快照,计算每日新增数据量。 - 周/月环比:对比相邻周期数据量变化率,识别是否存在突发增长(如大促、日志归档)。
- 线性回归预测:基于历史数据拟合增长曲线,预测未来 6~12 个月的数据总量。
增长趋势采集脚本(每日快照):
-- 创建历史表
CREATE TABLE db_size_history (
snapshot_date DATE,
table_schema VARCHAR(64),
table_name VARCHAR(64),
data_length BIGINT,
index_length BIGINT,
table_rows BIGINT,
PRIMARY KEY (snapshot_date, table_schema, table_name)
);
-- 每日采集
INSERT INTO db_size_history
SELECT CURDATE(), TABLE_SCHEMA, TABLE_NAME,
DATA_LENGTH, INDEX_LENGTH, TABLE_ROWS
FROM information_schema.TABLES
WHERE TABLE_SCHEMA NOT IN ('mysql','performance_schema','sys','information_schema');
3.6 源端评估全景图
以下 SVG 图展示了源端环境评估的五个核心维度及其关联关系,帮助团队在迁移前建立完整的评估视图。
3.7 评估报告输出清单
完成上述五个维度的评估后,应输出以下标准化文档,作为迁移方案设计的输入:
| 文档名称 | 核心内容 | 责任人 |
|---|---|---|
| 源端版本兼容矩阵 | 源端版本、目标端版本、已知不兼容特性列表 | DBA |
| 字符集映射表 | 每个库/表的字符集与排序规则,目标端转换方案 | DBA + 开发 |
| 存储引擎转换清单 | 非 InnoDB 表列表、转换风险与回退方案 | DBA |
| 大表与复杂结构清单 | Top 20 大表、高复杂度表、分区表详情 | DBA + 架构师 |
| 数据量统计与增长预测 | 当前总量、日增量、月环比、未来 6 个月预测 | DBA + 运维 |
关键提醒:源端评估不是一次性工作。在迁移执行期间,源端数据仍在持续写入,评估报告中的“数据量统计”与“增长趋势”必须在迁移启动前 24 小时内重新确认,避免因突发流量导致迁移窗口不足或存储溢出。