不同平台DB2数据库之间大批量的移动数据(一

来源:互联网 发布:c语言算法描述 编辑:程序博客网 时间:2024/05/18 16:18
不同平台DB2数据库之间大批量的移动数据(一)
2006-11-06 13:56:25 / 个人分类:我用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-descrīption}
【参数说明】
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
 
原创粉丝点击