不同平台DB2
数据库之间大批量的移动数据(一)
一天接到了一项任务,具体内容是想把原来运行在
windows平台上的
DB2数据库的一部分数据转移到
IBM AIX 4.X平台上的指定数据库里面。
从资料上我得到的信息是使用
DB2控制中心里面对于表对象的调入
/调出(
Import/Export)功能菜单选项。但是在使用中总是觉得很是别扭,因为两个表因为字段顺序的不同造成调入失败、存在大对象字段的表的调入失败等等问题经常出现;于是乎我就去查阅相关的文档。
原来
DB2 中有三种数据移动实用程序可用:
EXPORT、
IMPORT和
LOAD。在本文中我将介绍前面的两种方法,
LOAD方法将会在随后的文章中介绍。
在
DB2联机文档的
Command Reference我发现了这两个命令在CLP环境下的使用方法,大致的语法如下:
l
Export用来从数据库中导出数据并存入指定格式的文件。使用
SQL查询语句来确定想要导出的数据
EXPORT TO filename OF filetype
MODIFIED BY file_type_modifiers
[LOBS TO lob-path [ {,lob-path} ... ] ]
[LOBFILE lob-file [ {,lob-file} ... ]
[MESSAGES message-file]{select-statement [WHERE ...] }
l
Import与
Export相反。它是从一个规定格式的外部文件向数据库的表中增加数据。在导入过程中导入数据的表对外允许访问,所有的限制和触发器都所以有效活动的。
IMPORT FROM filename OF filetype
[LOBS FROM lob-path [ {,lob-path} ... ] ] importmethod
INTO {table-name [( insert-column , ... )] | hierarchy-description}
【参数说明】
Filetype——能够被
DB2所支持的文件格式有
4种:
l
ASCII:纯文本格式。每个数据列之间有分隔符,但是数据行中没有分隔符。不能支持
Expor操作。
t
l
DEL ASCII:纯文本格式。数据列和数据行之间都有分隔符。
l
WSF:
Lotus 1-2-3工作表格式。
l
PC/IXF:通用格式,被多种数据库管理系统所支持。可以用于异种数据库中的数据转移。
LOBS TO/FROM lob-path——如果有
LOB类型的数据需要被导出
/导入,该参数被用于指定一个或多个目录文件用于存储
/读取
LOB数据。
LOBFILE参数指定的文件将存储在该路径下。
导入方式:
l
INSERT——目标表必须存在;新的行被插入到目标表中而不会影响表中已经存在的数据
l
INSERT_UPDATE——目标表必须存在,并且需要至少有一个主键(
PK)。现有记录如果与导入行主键相同时,现有记录将被更新。不同时则被插入至表中。
l
REPLACE——目标表必须存在。目标表的现存被熔将被删除,并用导入的数据所代替。
l
CREATE——只适合
IXF文件。目标表必须不存在。从
IXF文件中包含的表的描述信息中创建目标表和存在的索引,然后把
IXF文件中的数据插入到新表中。
l
REPLACE_CREATE——只适合
IXF文件。如果目标表存在,它的内容将被删除,而由导入的数据所代替,表的结构没有发生变化;目标表不存在时,它的功能跟
CREATE类似。
MODIFIED BY file_type_modifiers
l
Chardelx——指定
x 为新的单字符串定界符。缺省值是双引号(
")。
l
Coldelx——指定
x 为新的单字符列定界符。缺省值是逗号(
,)。
l
codepage=x ——指定
x 这个
ASCII 字符串为输出数据的新代码页。在导出操作期间,将字符数据从应用程序代码页转换成这一代码页。
l
timestampformat="x"——
x 是源表中时间戳记的格式。
EXPORT使用
SQL SELECT 语句将数据从数据库表导出到指定的文件中(你可以通过改变
SELECT语句的参数来灵活的去设置导出字段的顺序,这样就免去了由于字段顺序的原因造成的数据导入失败的麻烦了)。对于导出的数据而言,其文件格式可以是
DEL、
IXF 或
WSF。建议您在导出中包含
MESSAGES 子句,以便在导出期间捕获错误、警告和信息性消息。要成功地调用
EXPORT 命令,就必须具有
SYSADM 或
DBADM 权限,或者对
EXPORT 命令中要访问的表具有
CONTROL 或
SELECT 特权。
EXPORT TO myfile.del OF DEL
MESSAGES msg.out
SELECT name, deft
FROM org
WHERE deptnum > 104;
在这个例子中,数据被导出到一个
DEL 格式的文件中。缺省情况下,列值由逗号(
,)分隔,而字符串由双引号(
")括起来。如果要抽取的数据已经包含逗号和双引号,导入程序不可能确定:哪些符号是实际的数据,哪些是定界符。这里就需要使用上面提到的
MODIFIED BY 子句并指定想用文件类型修饰符修改什么。例如下面这个例子:
EXPORT TO myfile.del OF DEL
MODIFIED BY chardel! coldel@ codepage=1208 timestampformat="yyyy.mm.dd hh:mm tt"
MESSAGES msg.out
SELECT * FROM org
上面的命令以
DEL 格式从
org 表导出数据,并且:
l 字符串由感叹号(
!)括起来
l 列由
@ 号定界
l 字符串被转换成代码页
1208
l
Org表中用户定义的时间戳记具有
yyyy.mm.dd hh:mm tt 这种格式
另外,在导出具有大对象列的表时,只会导出头
32 KB LOB 数据。这部分对象与剩余列数据放在同一个文件中。要完全导出
LOB 数据,并将它们和其它列数据存储在不同的文件中,您必须使用
LOBSINFILE 文件修饰符。如果指定了
LOBSINFILE,那么其它一些与
LOB 有关的选项也可以使用。例如:
EXPORT TO file_name OF file_type
LOBS TO lobfile_directory_1, lobfile_directory_2, ...
LOBFILE lobfilename
MODIFIED BY LOBSINFILE
select_statement
有了
LOBSINFILE 修饰符,
EXPORT就查找
LOBS TO 子句中指定的目录,然后将
LOB 数据放在那里。如果没有找到
LOBS TO 子句,就将
LOB 数据发送到当前工作目录。注意,可以在上面的命令中指定多个路径作为
LOB 文件目标目录。每个
LOB 路径至少有一个文件,而每个文件至少会包含一个
LOB。
LOBFILE 子句可以将每个
LOB 文件都将有一个作为文件扩展名的序列号(例如,
lobfile.001、
lobfile.002 和
lobfile.003 等等)。
IMPORT基本上是一个向表中批量插入数据的实用程序。这种批量插入操作就象正常的插入语句,因为它对活动记录日志,对索引进行更新,对引用完整性进行检查,还对表约束进行检查。
IMPORT FOR inputfile.asc OF ASC
LOBS FROM /u/db2load/lob1, /u/db2load/lob2
MODIFIED BY lobinsfile
INSERT INTO tablename
这个例子就是将一个含有
LOB字段类型的表数据插入到表
tablename中去命令操作。
缺省情况下,
IMPORT 只在操作结束时提交一次。如果向表中导入或插入了大量的行,那么就需要足够的事务日志以备回滚和恢复。您可以请求进行定期提交,以防止日志变满。如果在导入操作期间发生故障,那么定期提交插入操作还能使您减少丢失的行的数目。
COMMITCOUNT 选项强制在导入一定数量的记录之后进行
COMMIT。这里有一个演示
COMMITCOUNT 选项使用方式的例子:
IMPORT FROM myfile.ixf OF IXF
COMMITCOUNT 500
MESSAGES msg.out
INSERT INTO tablename
如果上面的命令因为某些原因而执行失败,那么您可以使用消息文件确定被成功导入并提交的最后一行。然后,您可以使用
RESTARTCOUNT 选项重新启动导入。在下面的例子就是将跳过前面的
30000 条记录才开始
IMPORT 操作。
IMPORT FROM myfile.ixf OF IXF
COMMITCOUNT 500 RESTARTCOUNT 30000
MESSAGES msg.out
INSERT INTO tablename