DB2 Load数据装入学习笔记

时间:2024-05-18 19:50:31

1. 引言
      这段时间一直在忙一个基于DB2的项目,其中一部分工作涉及到DB2数据的导入。我们知道oracle提供了sqlloader程序完成大数据量的快速导入,DB2是和oracle最相似的数据库,所以DB2也提供了数据导入的实用程序,而且还是两个,分别是import和load,因为import的实质还是要执行sql语句完成数据的导入,所以速度相对较慢。Load是直接将格式化的页写入数据库,对于大数据量的导入,load程序更快。但是load实用程序不会触发触发器。并且load时除了验证索引唯一性约束之外,不执行其他的约束检查,这样会对数据库的数据完整性造成一些影响。如果能保证数据来源可靠的话,load是个不错的选择。接下来就简单说一下load实用程序的使用。


2. 概述
        Load 的过程分为四个阶段:装入,构建,删除,索引复制。如下图:

DB2 Load数据装入学习笔记

Load有四种装入方式,分别是:
REPLACE:这种方式下会删除目标表数据,用并用输入数据填充该表。
INSERT:目标表原有数据不做修改,将输入数据追加到目标表之后。
TERMINATE:装载失败后,可以通过该方式回滚失败的装入操作。
RESTART:已终端的装入操作将继续(我没有试过这种方式)。

Load可以装入的数据格式包括IXF——也就是DB2 export程序推荐的那种数据格式,是二进制的。这种数据导入也最方便;DEL——就是分界符的ASCILL文件,DB2默认的是用逗号(,)作为字段列的分隔符,用双引号(“)作为记录行的分隔符;ASC——非定界符的ASCII文件,load时需要指定列的起止位置;CURSOR——游标,我没用过。


3. 语法及参数介绍
        Load程序的语法参数还是相当复杂的,现在虽然在用这个程序了,但是有些参数还是没搞明白。在这里我拣着主要的&&我明白的参数介绍一下。基本上能够满足一般的装入操作要求。
 因为语法实在是很繁琐,我不得不贴一张官方的大图出来了。

DB2 Load数据装入学习笔记

部分参数介绍:
FROM
设定装入数据的来源,如果是数据源来自于多个文件,则文件之间可以用逗号分开。如:
Db2  Load  from “E:\tmp\test_file_001.dat”,”E:\tmp\test_file_002.dat” ……
OF filetype
指定数据文件的类型,也就是前面提到过的四种类型,IXF,DEL,ASC,CURSOR.
Modify by file-type-mode
指定文件类型修饰符。支持的文件类型修饰符相当多,这里只列举一部分我测试过的。
修饰符 说明 适用的文件类型
Codepage=x 指定装入数据文件的codepage(码页),load程序会将数据文件从指定的codepage转换到数据库的codepage,例如codepage=1252,这个1252是US的codepage,1386是简体中文GBK的codepage. 所有
Dateformat=”x” 这个参数对于ASC和DEL文件相当有用,因为这两种文件存储的都是ascill文件,没有数据结构信息,如果对应目标表中的列是date类型时,就需要指定数据文件中的日期的格式了。常用的有dateformat=”YYYYMMDD”或者dateformat=”YYYY-MM-DD”等.此处注意一点:在命令行中执行时需要对双引号进行转义,否则会提示指定的dateformat无效. 所有
Dumpfile=”x” 在装入数据库过程中,如果装入失败的记录,例如记录字段长度超长,这时会将这条失败记录写到dumpfile指定的文件中,文件是追加式的。本人在适用时发现这个指定的文件指的是服务器的路径,也就是说当我们从客户端A执行load命令装入数据到服务器B时,指定的dumpfile其实是B主机上的路径。 所有
Timestampformat=”x” 这个也很实用,是用来指定时间戳类型的数据列的格式,例如timestampformat=”YYYYMMDDHHMMSS”,看着很奇怪,因为月份MM和分钟的MM是一样的,分钟并不是像oracle中的MI。我理解不了DB2为啥弄成这样,不过事实证明像我那样设置是没有问题的。 所有
Striptblanks 将数据装入到一个变长列时,会截断尾部空格,若未指定则将保留空格。 ASC
Chardelx 设定记录行分隔符,例如chardel; 表示以分号作为换行标识.另外一些无法输入的字符可以通过十六进制码来表示,如chardel0x0D0A表示以回车换行作为行分隔符. DEL
coldelx 设定数据文件中的列分隔符,可以直接输入分隔符,也可以用十六进制表示。如coldel, coldel0x09 DEL
Keepblanks 保留char,varchar,long varchar,clob类型的每个字段的首尾空格。如不设置,则会出去定界符之间的首尾空格,如果为空白,则会在对应列中插入NULL DEL

METHOD
 L 指定要装入文件的列的起止位置,用于非定界的ASC文件。从1开始计数,起止位置的数字间通过空格分隔,字段间通过逗号分隔。例如
  METHOD L (1 3,4 9,10 15)
 N  这个参数好像是只应用于IXF或者CURSOR类型的数据文件,我没有试过。
 P 指定装入文件的列的编号,可以通过这个调整转入数据文件的对应关系。例如
  METHOD P (1,3,4,2)
ROWCOUNT n
 指定要装入的数据文件的物理记录行数。允许用户只装入前面n行。
WARNINGCOUNT n
 指定装入操作过程中允许的警告次数,超过该次数后装入操作失败。如果不设置或者设置为0那么无论有多少条记录告警,装入操作都将继续。
TEMPFILES PATH temp-filespath
 指定装入过程中用到的临时路径,指的是服务器端的路径。
装入方式
 INSERT\REPLACE\TERMINATE\RESTART
INTO tabname
 指定要装入到的数据库表。
Insert_column
指定数据要插入到的列名,列名之间用逗号分隔。
FOR EXCEPTION table-name
指定要讲加载错误行复制到异常表名,该异常表是指加载目标数据库中的表。
ALLOW NO ACCESS
Load程序在装载过程中锁定目标表,是目标表处于“正在装载”状态,ALLOW NO ACCESS 是默认行为,对于REPLACE加载的load命令,allow no access是唯一有效的选项。
ALLOW READ ACCESS
目标表在装载过程中仍然被置为“正在装载”状态,不过装载之前的数据仍然可以访问,进行read操作。

 

4. 命令举例
    接下来就列举几个例子。
4.1 加载定界的ascill文件,也就是分隔符的数据文件

db2 LOAD FROM "E:\ data\src_001.dat","E:\data\src_002.dat" OF DEL MODIFIED BY dateformat=\"YYYY-MM-DD\" timestampformat=\"YYYYMMDDHHMMSS\" CHARDEL0x0D0A coldel# dumpfile="E:\error\data.bad" METHOD P (1, 2, 3,4,5) ROWCOUNT 400 MESSAGES "E:\message\message.log" TEMPFILES PATH "E:\tmp" REPLACE INTO TEST_TAB (ID, NAME, ADDRESS,BIRTHDAY,createtime) NONRECOVERABLE INDEXING MODE AUTOSELECT  SET INTEGRITY PENDING CASCADE IMMEDIATE

 4.2 加载非定界的ascill文件

db2 LOAD FROM "E:\data\src_001.dat" OF ASC MODIFIED BY dateformat=\"YYYY-MM-DD\" timestampformat=\"YYYYMMDDHHMMSS\"  striptblanks dumpfile="E:\data\data.bad" METHOD L (1 5,6 10,11 20,21 35,36 50) ROWCOUNT 400 MESSAGES "E:\message\message.log" TEMPFILES PATH "E:\tmp" REPLACE INTO TEST_TAB (ID, NAME, ADDRESS,BIRTHDAY,createtime) NONRECOVERABLE INDEXING MODE AUTOSELECT

 

 

注:定长的文件加载时需要指定每个列的起止位置,之间用空格分隔,列之间用逗号分隔。

因为load程序的参数很多,不能一一描述,不过以上这些对于常用的操作有这些基本也就够用了。