注册
csv数据迁移数据校验手记:达梦批量装载异常排查与分隔符优化
技术分享/ 文章详情 /

csv数据迁移数据校验手记:达梦批量装载异常排查与分隔符优化

孙煜程 2025/08/15 53 0 0

csv数据迁移数据校验手记:达梦批量装载异常排查与分隔符优化

本文是上一篇《银行信创迁移测试数据到达梦方案》的实践补充,聚焦脚本跑完后如何快速发现、定位并解决数据异常
https://10.9.25.21/community/post/20250812184945G0ZZVALTTUQSGJ6A2T

一、背景

批量脚本执行完 dmfldr 后,仅凭“导入成功/失败”的返回码并不能保证数据 100 % 准确。
我们在 708 张表中检出12张表存在异常,根因是 数据内容恰好与分隔符冲突,导致部分记录被截断或丢弃。


二、判定逻辑:让脚本自己说“对/错”

dmfldr 的日志会输出两组核心指标:

167 行数据加载成功
0 行由于数据错误没有成功加载
0 行由于数据格式错误被丢弃

跳过的逻辑记录总数:0
读取的逻辑记录总数:167
拒绝的逻辑记录总数:0

判定规则(Shell 伪代码)

read=$(grep "读取的逻辑记录总数" logfile | awk '{print $NF}') skip=$(grep "跳过的逻辑记录总数" logfile | awk '{print $NF}') reject=$(grep "拒绝的逻辑记录总数" logfile | awk '{print $NF}') success=$(grep "行数据加载成功" logfile | awk '{print $1}') if [[ "$read" == "$success" && "$skip" == "0" && "$reject" == "0" ]]; then echo "✅ 数据一致" else echo "❌ 存在异常" fi

三、异常定位:分隔符冲突

对 708 张异常表进行二次比对,发现字段内容里出现了默认的列分隔符 ,、包围符 " 以及换行符 \n,导致 dmfldr 无法正确解析列边界。
b5c9f19d8ff2c32260eca5d1ebe9485c_compress.jpg

解决方案:使用“绝对不会出现”的二进制不可见字符

用途 字符 十六进制 备注
列分隔符 ^A 0x01 SOH
包围符 ^D 0x04 EOT
行分隔符 ^Y 0x19 EM

四、配置文件范例

LOAD DATA INFILE '/path/to/datafile' STR X '19' -- 行分隔符 ^Y INTO TABLE your_table_name FIELDS TERMINATED BY X '01' -- 列分隔符 ^A OPTIONALLY ENCLOSE BY X '04' -- 包围符 ^D

注意

  1. STR X'xx' 必须写成十六进制,不能用 ^A 等可见符号。
  2. 若源文件已生成,可用 sed/awk 批量替换旧分隔符为新分隔符,再执行装载。

五、小结

  1. 先校验再信任:用“读取 == 成功 && 跳过 + 拒绝 == 0”做兜底。
  2. 分隔符选型:二进制不可见字符永远优于可见符号。
  3. 自动化:把校验脚本加入 CI/CD,异常表自动告警、二次校验。

至此,数据一致性问题闭环。

https://eco.dameng.com

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服