现在的位置: 首页 > 综合 > 正文

DB2中的数据移动详解

2018年04月26日 ⁄ 综合 ⁄ 共 7099字 ⁄ 字号 评论关闭

DB2中所谓的数据移动,包括: 1. 数据的导入(Import) 2. 数据的导出(Export) 3. 数据的装入(Load)。导入和装入都是利用DB2的相关命令把某种格式的文件中的数据保存到数据库中的表中;导出是指把DB2数据库的表中的数据保存到某种格式的文件当中去。

数据移动的作用:

如果要在不同的数据库管理系统之间转移数据,数据移动通常是最实用的一种方法,因为任何一种数据库管理系统都支持常用的几种文件格式,通过这个通用的接口,就很容易实现不同系统间数据的转移。

这三个命令中,Export最简单,因为从表中向文件转移数据,通常不会出现错误,也不会有非法的数据。

在讲解命令之前,首先介绍一下文件的格式,用于DB2数据移动的文件格式有四种:

1. ASC——非定界ASCII文件,是一个ASCII字符流。数据流中的行由行定界符分隔,而行中的每一列则通过起始和结束位置来定义。例如:

10 Head Office 160 Corporate New York

15 New England 50 Eastern Boston

20 Mid Atlantic 10 Eastern Washington

38 South Atlantic 30 Eastern Atlanta

42 Great Lakes 100 Midwest Chicago

51 Plains 140 Midwest Dallas

66 Pacific 270 Western San Francisco

84 Mountain 290 Western Denver

2. DEL——定界ASCII文件,也是一个ASCII字符流。数据流中的行由行定界符分隔,行中的列值由列定界符分隔。文件类型修饰符可用于修改这些定界符的默认值。例如:

10,"Head Office",160,"Corporate","New York"

15,"New England",50,"Eastern","Boston"

20,"Mid Atlantic",10,"Eastern","Washington"

38,"South Atlantic",30,"Eastern","Atlanta"

42,"Great Lakes",100,"Midwest","Chicago"

51,"Plains",140,"Midwest","Dallas"

66,"Pacific",270,"Western","San Francisco"

84,"Mountain",290,"Western","Denver"

3. WSF——(work sheet format)为工作表格式,用于与Lotus系列的软件进行数据交换。

4. PC/IXF——是集成交换格式(Integration Exchange Format,IXF)数据交换体系结构的改编版本,由一些列可变长度的记录构成,包括头记录、表记录、表中每列的列描述符记录以及表中每行的一条或多条数据记录。PC/IXF 文件记录由包含了字符数据的字段组成。

数据的导出(Export)
zv�I4b:G@0例一:把Org表中的所有数据导出到文件C:/ORG.TXT中。

Export to c:/org.txt of del select * from org

其中,of del表示导出到的文件的类型,在本例中导出到一个非定界文本文件中;后面的select * from org是一个SQL语句,该语句查询出来的结果就是要导出的数据。

例二:改变del格式文件的格式控制符

export to c:/staff.txt of del modified by coldel$ chardel'' decplusblank select * from staff

在该例中,modified子句用于控制各种符号,coldel表示字段之间的间隔符,默认情况为逗号,现在改为$号;chardel表示字符串字段用什么符号引用,默认情况下为一对双引号括起来,现在改为用一对单引号括起来;decplusblank表示对于十进制数据类型,用空格代替最前面的加号,因为默认情况下会在十进制数据前面加上正负号的。

例三:以ASC格式将数据导出到文件

Export命令是不支持ASC格式文件的,所以如果想导出ASC这样规整的格式,需要程序员自己进行转换操作,思路是将各种数据类型都转换成定长字符串,然后把各个要导出的字段合并成为一个字段。

例如创建如下结构的表n:

create table n(a int,b date,c time,d varchar(5),e char(4),f double)

然后插入两条数据:

insert into n values(15,'2004-10-21','23:12:23','abc','hh',35.2)

insert into n values(5,'2004-1-21','3:12:23','bc','hhh',35.672)

要想把这两条数据以规整的格式导出到文件中,进行如下操作:

export to c:/test.txt of del select char(a) || char(b) || char(c) || char(d,5) || e || char(f) as tmp from n

这样导出的结果与ASC格式的文件非常类似,只是每一行的前后多出了一对双引号,对此我们可以使用文本工具(如写字板、记事本等)把双引号删除掉,也可以置之不理,在以后导入的时候直接控制格式(忽略双引号)

在文件中的格式为:

"15 2004-10-2123.12.23abc hh 3.52E1 "

"5 2004-01-2103.12.23bc hhh 3.5672E1 "

例四:大数据的导出

export to d:/myfile.del of del lobs to d:/lob/ lobfile lobs modified by lobsinfile select * from emp_photo

该命令把emp_photo表的数据导出到d:/myfile.del文件中,其结果为:

<pre>

"000130","bitmap","lobs.001.0.43690/"

"000130","gif","lobs.001.43690.29540/"

"000130","xwd","lobs.001.73230.45800/"

"000140","bitmap","lobs.001.119030.71798/"

"000140","gif","lobs.001.190828.29143/"

"000140","xwd","lobs.001.219971.73908/"

"000150","bitmap","lobs.001.293879.73438/"

"000150","gif","lobs.001.367317.39795/"

"000150","xwd","lobs.001.407112.75547/"

"000190","bitmap","lobs.001.482659.63542/"

"000190","gif","lobs.001.546201.36088/"

"000190","xwd","lobs.001.582289.65650/"

</pre>

其中第三个字段是BLOB类型,在该文件中只保存了一个标志,相当于一个指针,真正的LOB数据保存在d:/lob目录下的lobs.001、 lobs.002、......等一系列文件中。命令中lobs to 后面指定大对象数据保存在什么路径下(注意,该路径必须事先已经存在,否则会报错),lobfile 后面指定大对象数据保存在什么文件中,不要指定扩展名,DB2会根据数据量自动追加.001、.002等扩展名,同时不要忘记加上modified by lobsinfile子句。

例五:把导出信息保存在消息文件中。

export to d:/awards.ixf of ixf messages d:/msgs.txt select * from staff where dept = 20

这个例子把staff表中dept=20的数据导出到d:/awards.ixf文件中,所有的导出信息都保存在d:/msgs.txt文件中(无论是成功、警告还是失败信息),这样,管理员可以通过观察信息文件找到问题所在。

例六:给导出数据列重命名。

export to d:/awards.ixf of ixf method n(c1,c2,c3,c4,c5,c6,c7) messages d:/msgs.txt select * from staff where dept=20

在默认情况下,导出的每一列数据以表中对应的字段名自动命名,我们可以通过method n子句给每一列重新命名,需要注意的是,这个子句只在ixf和wsf格式文件中有效,在文本文件中不能使用。

例十四:关于DUMP文件

格式不正确的行会被拒绝。通过指定DUMPFILE文件类型修饰符可以使这些被拒绝的记录单独放在指定的文件里。

用SAMPLE数据库中的STAFF表做实验

1. 创建一个结构与STAFF表相同的表STAFF1

CREATE TABLE STAFF1 LIKE STAFF

2. 把STAFF表中的一部分数据插入到STAFF1中

INSERT INTO STAFF1 SELECT * FROM STAFF WHERE ID<=160

3. 再创建一个结构与STAFF1相同的表STAFFEXP,作为异常表

CREATE TABLE STAFFEXP LIKE STAFF1

4. 给该异常表添加一列

ALTER TABLE STAFFEXP ADD COLUMN TIME TIMESTAMP

5. 为STAFF1表创建一个唯一索引

CREATE UNIQUE INDEX IDXSTAFF ON STAFF1(ID)

6. 先运行导出命令做出一个文本文件

EXPORT TO D:STAFF.TXT OF DEL SELECT * FROM STAFF

到D盘上打开STAFF.TXT文件,把第一列等于320的行替换为:"abcf","aaa","sdfg"

7. 然后运行装入命令把数据再装入到STAFF1表中

LOAD FROM D:STAFF.TXT OF DEL MODIFIED BY DUMPFILE=d:dump INSERT INTO STAFF1 FOR EXCEPTION STAFFEXP

装入的结果报告中会有如下一条:

SQL3118W 在行 "32" 列 "1" 中的字段值不能转换为 SMALLINT 值,但是目标列不可为空。未装入该行。

SQL3185W 当处理输入文件的第 "32" 行中的数据时发生先前的错误。

打开D盘的dump.000文件,会看到造成异常的那一行数据:"abcf","aaa","sdfg"

通过这个例子,我们可以理解,如果一行数据的格式不正确,在装入的时候会遭到拒绝,该行记录会放到DUMP文件中;而如果数据格式正确,但是不满足表的约束条件,该行记录会放到异常表中。

3/U/[:P!H| U0例十五:限制装入行数

用ROWCOUNT选项可以指定从文件开始处装入的记录数

LOAD FROM D:STAFF.TXT OF DEL ROWCOUNT 3 INSERT INTO STAFF1

例十六:出现警告信息时强令装入操作失败

在某些情况下,文件中的数据必须全部成功输入到目标表中才算成功,即使有一条记录出错也不行。在这种情况下,可以使用WARNINGCOUNT选项。

到D盘上打开STAFF.TXT文件,把第一列等于320的行替换为:"abcf","aaa","sdfg"

LOAD FROM D:STAFF.TXT OF DEL WARNINGCOUNT 1 INSERT INTO STAFF1

运行结果包含下面的警告:

SQL3118W 在行 "32" 列 "1" 中的字段值不能转换为 SMALLINT值,但是目标列不可为空。未装入该行。

SQL3185W 当处理输入文件的第 "32" 行中的数据时发生先前的错误。

SQL3502N 实用程序遇到了 "1" 个警告,它超过了允许的最大警告数。

此时无法对表STAFF1进行操作,例如

SELECT * FROM STAFF1

会返回:

ID NAME DEPT JOB YEARS SALARY COMM

------ --------- ------ ----- ------ --------- ---------

SQL0668N 由于表 "USER.STAFF1" 上的原因代码 "3",所以不允许操作。

SQLSTATE=57016

原因是:表处于“装入挂起”状态。对此表的先前的 LOAD 尝试失败。在重新启动或终止 LOAD 操作之前不允许对表进行存取。

解决方法为:通过分别发出带有 RESTART 或 TERMINATER 选项的 LOAD 来重新启动或终止先前失败的对此表的 LOAD 操作。

包含TERMINATER的LOAD命令可以终止装入进程,使目标表恢复正常可用状态:

LOAD FROM D:STAFF.TXT OF DEL TERMINATE INTO STAFF1

包含RESTART的LOAD命令可以在源文件修改正确的时候使用,使装入进程重新开始:

LOAD FROM D:STAFF.TXT OF DEL RESTART INTO STAFF1

例十七:防止产生警告信息

使用NOROWWARNINGS文件类型修饰符可以禁止产生警告信息,当装入过程可能出现大量警告信息,而用户对此又不感兴趣的时候,可以使用该选项,这样可以大大提高装入的效率

到D盘上打开STAFF.TXT文件,把第一列等于320的行替换为:"abcf","aaa","sdfg"

LOAD FROM D:STAFF.TXT OF DEL MODIFIED BY NOROWWARNINGS INSERT INTO STAFF1

运行完的结果中,第32行出错,该行无法装入,但是不产生警告信息。

/atJ``4j0例十八:生成统计数据

使用STATISTICS选项可以在装入的过程中生成统计数据,这些统计数据可以供优化器确定最有效的执行SQL语句的方式。

可以对表和索引产生不同详细程度的统计数据:

① 对表和索引产生最详细的统计数据:

LOAD FROM D:STAFF.TXT OF DEL REPLACE INTO STAFF1 STATISTICS YES WITH DISTRIBUTION AND DETAILED INDEXES ALL

② 对表和索引都产生简略的统计:

LOAD FROM D:STAFF.TXT OF DEL REPLACE INTO STAFF1 STATISTICS YES AND INDEXES ALL

其它组合可以参考DB2文档。

注意:STATISTICS选项只能和REPLACE兼容,与INSERT选项不兼容。另外,通过STATISTICS选项做完统计,我们看不到任何直接的结果,如果想查看其结果,需要到系统表中自己查询。

例十九:解除检查挂起状态

1. 连接到SAMPLE数据库上:

Connect to sample

2. 创建一个结构与staff表相同的表:

CREATE TABLE STAFF1 LIKE STAFF

3. 给该表添加一个检查约束:

alter table staff1 add constraint chk check(dept<100)

4. 到D盘上打开STAFF.TXT文件,把最后一行数据的第三列改为150,这样该条数据就不满足第3步加上的检查约

束条件了,然后用Load命令从文件中装入数据到staff1表中:

LOAD FROM D:STAFF.TXT OF DEL INSERT INTO STAFF1

5. 此时运行查询命令:

Select * from staff1

会得到错误信息:

SQL0668N 由于表 "USER.STAFF1" 上的原因代码 "1",所以不允许操作。

SQLSTATE=57016

原因是装入时有数据违反了检查约束,造成表处于检查挂起状态。

6. 解除表的检查挂起状态,使用:

set integrity for staff1 check immediate unchecked

再次运行查询命令:

Select * from staff1

发现表可以正常使用了,其中的违反检查规则的数据也存在。

例二十:性能因素

在从文件向表导入数据的时候,当数据量特别大的情况下,装入命令会明显体现出优势,原因是它不像导入命令每次插入一行,并且在每行都要检查是否满足约束条件,装入命令从输入文件读出数据构建页,把这些页直接写入数据库,并且在每一行数据装入时不判断是否满足约束,另外装入命令不写日志,所有这些因素都导致装入的效率高于导入。

另外,装入命令还有一些选项可以控制性能因素:

1. COPY YES/NO和Nonrecoverable

① Nonrecoverable(不可恢复的):指定装入操作不可恢复,并且不能由后续的前滚操作恢复。前滚操作忽略事务并且标记正在装入数据的表为“无效”。

② Copy No(默认选项):在这种情况下,如果表所在数据库的归档日志处于启用状态,则装入完成后,表所在的表空间将处于备份挂起状态,直到数据库或表空间备份完毕,该表空间才成为可写表空间。原因是装入操作造成的变化没有被记录,所以要恢复装入操作完成后发生的故障,备份数据库或表空间是必要的。

③ Copy Yes:在这种情况下,如果数据库的归档日志启用,装入操作的改变将被保存到磁带、目录或TSM服务器,并且表空间将不再处于备份挂起状态。

2. Fastparse

该文件类型修饰符用于减少数据检查次数。它只能用于在数据已知正确的情况下,尤其适用于DEL和ASC类型的文件。

3. Anyorder

如果SAVECOUNT选项没有使用,该参数允许不遵照输入文件中的数据顺序进行装入,在SMP(对称多处理机)系统上CPU_PARALLELISM选项大于1的时候,该参数会提高装入的性能。 Data Buffer
,b(hJk!T RA0该参数用于指定从堆栈分配得到的4K大小的内存页面ITPUB个人空间Jbcv~

抱歉!评论已关闭.