LabHub
学习 学习路径 课程

SI 的数据库运维

遗留数据的迁移与一致性校验

在 LabHub 中继续学习

目标

把杂乱的旧 CSV 加载到 staging,完成 profiling → 清洗 → 去重 → 代码映射 → 一致性验证 → 排除项管理 → 签署确认的完整迁移周期。

为什么重要

口头说“迁移成功”不能证明任何事。必须记录数量比较和样本验证;只看数量和总和会漏掉一条缺失、另一条翻倍的情况。若不保留排除项清单,上线后便无法快速回答数据为何缺失。保留后则可立即说明具体排除原因与重迁计划。

步骤

  1. 源文件:/opt/lab/fixtures/dbo/legacy/CUST_LEGACY.csv(1,200 行) 代码映射表:/opt/lab/fixtures/dbo/legacy/grade_map.csv
  2. 创建 /root/db/etl.db,把源 CSV 不经处理加载到 STG_CUST。所有列为 TEXT,必须有 1200 行。
  3. 创建 /root/db/profile.csv,首行为 column,nulls,spaces,distinct。针对 STG_CUST 的每列,依次记录 nulls(空值或 trim 后为 NULL/null)、spaces(首尾空格)、distinct(原始字符串不同值数),并保持表列顺序。
  4. 创建 TGT_CUST 并清洗:去首尾空格;NULL/null 转真 NULL;把 REG_DATE 统一为 8 位 YYYYMMDD(输入含 YYYYMMDDYYYY-MM-DDYY/MM/DD,其中 YY 解释为 20YY);去掉 TOT_AMT 逗号后转整数。完成后 TGT_CUSTREG_DATE 非 8 位的行数为 0。
  5. 同一 CUST_ID 多行时,只保留 UPD_DT 最大的一行UPD_DT 相同时保留源顺序靠后的行。把删除数保存到 /root/db/dedup.txt,格式为 removed=<건수>
  6. 使用 grade_map.csvGRADE 转换为 GRADE_CD。未映射时把 GRADE_CD 设为 99,并将该行 CUST_ID 与原值保存到 /root/db/unmapped.csv。首行为 cust_id,legacy_grade,按 cust_id 升序。
  7. 创建 /root/db/recon.csv,首行为 item,source,target,diff,result。记录 countamount(源 TOT_AMT 去逗号转整数后与目标比较);distinct_id(源中不同 CUST_ID 数与目标行数比较)。result 相同为 OK,否则为 NG
  8. 把未迁移行的 CUST_ID 保存到 /root/db/excluded.csv。首行为 cust_id,reasonreasonduplicate
  9. 编写 /root/db/etl-signoff.md,包含 ## 이관 대상## 제외 사유## 검증 결과## 재이관 대상## 확인 五个 h2 标题,并准确包含:
    source_rows=<원천 행 수>
    target_rows=<대상 행 수>
    excluded=<제외 건수>
    unmapped=<코드 미매핑 건수>
    

参考

加载源数据

创建 /root/db/etl.db,把源 CSV 不经处理加载到 STG_CUST 表。 所有列为 TEXT,行数必须为 1200

源数据应原样进入 staging。此时清洗会导致以后无法与原始数据核对。

数据 profiling

创建 /root/db/profile.csv。首行为 column,nulls,spaces,distinct。 针对 STG_CUST 的所有列:

清洗规则应来自 profiling 结果。先查看每列有多少 NULL、多少种不同值。

应用清洗规则

创建 TGT_CUST 并应用清洗规则:

日期格式混杂。先决定如何识别和转换每种格式,再编写代码。

去重

同一 CUST_ID 有多行时,只保留 UPD_DT 最大的一行UPD_DT 相同时,保留源顺序靠后的行。 把删除数量保存到 /root/db/dedup.txt,格式为 removed=<건수>

保留哪条属于业务判断,而不是技术判断。规则确定后应准确实现。

代码映射

使用 grade_map.csvGRADE 转换为新代码并写入 GRADE_CD。 映射表中不存在的值将 GRADE_CD 设为 99, 并把该行 CUST_ID 和原值保存到 /root/db/unmapped.csv。 首行为 cust_id,legacy_grade,按 cust_id 升序。

必须定义遇到未映射值时如何处理,并把这些对象保留为清单。

一致性验证

创建 /root/db/recon.csv。首行为 item,source,target,diff,result。 填写三行:

只看数量和总和,可能让一条缺失与一条重复相互抵消。请使用多个指标。

排除项清单

把未迁移行(因去重被排除)的 CUST_ID 保存到 /root/db/excluded.csv。 首行为 cust_id,reasonreasonduplicate

结果不仅是“1,200 条中迁移了 1,187 条”,还必须能回答剩余 13 条具体是什么。

迁移结果签署书

编写 /root/db/etl-signoff.md。 必须有 ## 이관 대상## 제외 사유## 검증 결과## 재이관 대상## 확인 五个 h2 标题,并原样包含以下四行:

source_rows=<원천 행 수>
target_rows=<대상 행 수>
excluded=<제외 건수>
unmapped=<코드 미매핑 건수>

这是为了上线后有人询问“数据怎么没有”时能立即回答。必须同时包含数字和原因。