企业信息化系统数据迁移实战
迁移场景分析
企业信息化系统经常面临数据迁移场景:老系统升级换代会迁移历史数据、系统拆分需要数据同步、数据库升级需要数据搬迁等。数据迁移是一项风险极高的工作,需要周密的规划和充分的测试。迁移过程中任何数据丢失或错误都可能造成不可逆的损失。
迁移流程规划
- 数据调研:分析源系统数据结构、数据量、关联关系、异常数据情况
- 方案设计:制定迁移策略、映射规则、验证方法、回滚方案
- 环境准备:搭建测试环境、准备迁移工具、配置网络策略
- 数据清洗:处理脏数据、规范化数据格式、修复数据一致性
- 全量迁移:执行全量数据迁移、记录迁移日志
- 增量同步:追平迁移期间的业务增量数据
- 数据校验:对比源系统和目标系统数据一致性
- 割接上线:业务停机、最终同步、切换系统
数据清洗策略
老系统通常存在各种数据质量问题,需要在迁移前进行清洗:
| 问题类型 | 发现方法 | 处理策略 |
|---|---|---|
| 空值NULL | IS NULL查询统计 | 设置默认值或标记处理 |
| 重复数据 | GROUP BY+HAVING | 去重或合并处理 |
| 外键引用 | LEFT JOIN查找 | 补录或级联处理 |
| 格式不规范 | 正则匹配验证 | 转换或标准化 |
迁移脚本示例
-- 数据迁移SQL脚本示例
-- 1. 创建临时迁移表
CREATE TEMP TABLE migration_log (
id SERIAL PRIMARY KEY,
source_id VARCHAR(50),
target_id VARCHAR(50),
table_name VARCHAR(100),
status VARCHAR(20),
error_msg TEXT,
migrate_time TIMESTAMP DEFAULT NOW()
);
-- 2. 客户数据迁移(带清洗逻辑)
INSERT INTO new_customer (
customer_id, customer_name, customer_type,
contact_person, phone, address,
created_at, updated_at
)
SELECT
c.customer_id,
TRIM(c.customer_name), -- 去除空格
CASE c.customer_type -- 类型映射
WHEN '1' THEN 'enterprise'
WHEN '2' THEN 'personal'
ELSE 'other'
END,
c.contact,
CASE WHEN LENGTH(c.phone) = 11 THEN c.phone ELSE NULL END, -- 手机号校验
COALESCE(c.address, '未知地址'), -- 空值处理
COALESCE(c.create_time, NOW()), -- 默认时间
NOW()
FROM old_customer c
WHERE NOT EXISTS (
SELECT 1 FROM new_customer nc
WHERE nc.customer_id = c.customer_id
);
-- 3. 记录迁移日志
INSERT INTO migration_log (source_id, target_id, table_name, status)
SELECT customer_id, customer_id, 'customer', 'success'
FROM new_customer WHERE migrate_time > NOW() - INTERVAL '1 day';
增量同步方案
对于数据量较大的系统,全量迁移后需要追平增量数据:
- CDC变更数据捕获:通过数据库日志捕获数据变更,如Debezium
- 时间戳增量:根据updated_at字段增量拉取变更数据
- 消息队列同步:源系统变更时发送消息,消费后同步到目标
- 双写策略:业务写入时同时写两个数据库,切换时直接切换
数据校验方法
迁移完成后必须进行全面的数据校验:
- 数量校验:对比源系统和目标系统的记录数
- 抽样校验:随机抽取数据进行人工核对
- 汇总校验:对比关键统计指标,如客户总数、订单总额等
- 关联校验:验证外键关系完整性,如订单对应的客户是否存在
- 业务校验:根据业务规则验证数据合理性,如库存不能为负数
回滚方案
为防止迁移失败导致业务中断,需要准备回滚方案:
- 保留原系统:迁移期间保持原系统可读,不立即下线
- 数据库备份:迁移前完整备份目标数据库
- 增量日志:记录迁移后的变更,便于逆向操作
- 灰度切换:先切换部分业务,观察正常后再全面切换