在DB2数据库运维与数据迁移工作中,使用import命令从del类型的定界文件加载数据是最基础也最容易出问题的操作之一。del文件本质上是以行为单位、列之间用特定分隔符隔开的纯文本,DB2通过import实用程序将其逐行解析并写入目标表。理解这一过程背后的机制,才能在处理海量数据导入时避开性能瓶颈和数据污染。

定界文件格式与DB2解析原理
del文件默认使用换行符作为行分隔,列分隔符通常是逗号、竖线或制表符,具体由import命令的modified by子句决定。DB2在读取del文件时,并不会预先加载整个文件到内存,而是以流的方式按行扫描,每读到一行就按照指定的列分隔符切分字段,再对照目标表的结构做类型转换。如果某一列在表中定义为integer,而文件对应位置出现空字符串,DB2会尝试将其转换为空值或零,这取决于是否设置了保留空值的选项。
字符集的处理是另一个核心点。del文件本身的编码必须与数据库客户端编码一致,否则中文或特殊符号会变成乱码甚至导致整行被拒绝。例如数据库使用UTF-8,但del文件是GBK,就需要在import前通过iconv等工具转换文件编码,或者在modified by中指定codepage参数。下面是一段查看并转换文件编码的示例:
file data.del iconv -f GBK -t UTF-8 data.del > data_utf8.del
除了编码,行尾换行符在不同操作系统间也有差异。Windows生成的del文件是CRLF,而AIX或Linux通常是LF。DB2的import通常能自动识别,但在某些老版本中若指定了strict格式校验,不匹配的换行会导致提前终止导入。因此跨平台传递定界文件时,建议统一使用LF并通过hexdump抽查文件尾部字节。
import命令的写入模式与事务控制
DB2的import from del支持多种写入模式,最常用的是insert和replace。insert模式将文件数据追加到表中,不会改动已有记录;replace模式则先清空表再插入,相当于一次性的全量刷新。这两种模式在事务日志上的表现完全不同:insert在大批量导入时会产生大量日志,可能撑满日志空间,此时应配合commitcount参数分批提交。
replace模式看似简单,实则暗藏风险。因为它本质是先delete所有行再insert,如果导入中途失败,表已经被清空且无法回滚到导入前状态。对于核心业务表,更安全的做法是先导入到临时表,校验通过后再用merge或load replace切换。以下示例展示了带提交频率的insert导入:
import from "data.del" of del modified by codepage=1208 coldel0x7c commitcount 10000 insert into user_tab;
在锁与并发方面,import默认会对目标表加表级锁,阻塞其他会话的读写。若业务不能停写,可考虑使用allow write access选项,不过该选项仅在特定隔离级别和表结构下生效。此外,若目标表上有外键或触发器,import不会自动禁用它们,可能导致每行写入都触发级联检查,严重拖慢速度。此时应先用set integrity for表名off暂停约束,导入完成后再开启并校验。
常见错误分析与避坑实践
实际执行import from del时,报错信息往往笼统,比如SQL3116W或SQL3185W,只提示某行被跳过。这类问题大多源于三个原因:字段数量不匹配、日期时间格式不符、以及隐藏的控制字符。字段数不符通常因为文件里某列内容本身包含了分隔符却没有用引号包裹,DB2默认不会处理引号转义,需要在modified by中加explicitly或use quotes子句。
日期格式是另一个重灾区。del文件里的日期若写成20240101,而数据库列是date类型且客户端格式为ISO,DB2能识别;但若写成01/02/2024就可能被解析成不同的月日顺序。建议在modified by中用dateformat和timestampformat显式声明,避免依赖隐式转换。下面代码演示了如何指定格式并捕获错误行:
import from "log.del" of del modified by dateformat="YYYY-MM-DD" timestampformat="YYYY-MM-DD HH:MM:SS" messages import.log insert into event_tab;
最后,隐藏字符如BOM头、不间断空格常导致首列或末列值异常。用vi或sed清理文件头部的EF BB BF字节,可解决不少诡异报错。综合来看,稳定的del导入流程应是:确认编码与分隔符、用小样本试导并查看messages日志、批量导入设提交点、导入后跑count与校验和。把这些动作写成脚本,就能在多次迁移中复用,降低人工失误。