DB2 实用程序介绍之LOAD实用程序
LOAD 实用程序概述
LOAD 实用程序是用于为表填充数据的另一种方法。该实用程序将格式化的页面直接写入到数据库中。这种机制允许比 IMPORT 实用程序更有效地移动数据。然而,有些操作,例如参照约束或表约束检查和触发器的调用,是不能用 IMPORT 实用程序执行的。
下面是 LOAD 命令的核心。其他受支持的选项和修饰符将在本节中后面几屏中介绍。为了成功地执行这个命令,必须拥有 SYSADM/DBADM 或 LOAD 权限,或者拥有装载操作涉及的表上的 INSERT 和/或 DELETE 特权。为了将数据装载到包含受保护列的表中,必须拥有允许对表中所有受保护列进行写访问的 LBAC 凭证。为了将数据装载到受保护的行中,必须被授予允许写访问的安全标签,作为保护表的安全策略的一部分。
LOAD FROM input_source OF input_type
MESSAGES message_file
[ INSERT | REPLACE | TERMINATE | RESTART ]
INTO target_tablename
用于 LOAD 的源输入的格式可以是 DEL、ASC、PC/IXF 或 CURSOR。游标是一个 SELECT 语句返回的结果集。下面是使用 CURSOR 作为装载输入的一个例子:
DECLARE mycursor CURSOR FOR SELECT col1, col2, col3 FROM tab1;
LOAD FROM mycursor OF CURSOR INSERT INTO newtab;
在开始装载实用程序之前,装载目标必须已经存在。装载目标可以是一个表、一个类型化表或一个表的别名。将数据装载到包含 XML 列的表、系统表和临时表是不受支持的。
使用 MESSAGES 选项可以捕获装载期间遇到的错误、警告和包含有用信息的消息。
LOAD 可以以四种不同的模式执行:
- INSERT 模式将输入数据添加到一个表中,而不更改已有的表数据。
- REPLACE 模式删除表中所有已有的数据,然后用输入数据填充这个表。
- TERMINATE 模式终止装载操作,并回滚到它开始时所在的时间点。一个例外是,如果指定了 REPLACE 模式,那么表将被删节。
- RESTART 模式用于重新开始之前被中断的装载命令。它将自动从最近的一致点继续。要使用这个模式,可以指定与前一个 LOAD 命令相同的选项,但是这一次加上 RESTART。它使实用程序可以发现在装载处理中生成的所有需要的临时表。因此,千万不要手动删除装载命令所生成的任何临时文件,除非您确信不再需要这些临时文件。一旦装载成功完成,这些临时文件将自动被删除。默认情况下,这些临时文件是在当前的工作目录中创建的。也可以使用 TEMPFILES PATH 选项指定存放临时文件的目录。
装载过程的四个阶段
一个完整的装载过程包括四个不同的阶段。
1、装载阶段:
- 将数据装载到表中。
- 收集索引键和表统计信息。
- 记录一致点。
- 将无效的数据放在转储文件中,并在消息文件中记录消息。当数据行不符合表定义时,这些数据就被当作无效数据,并且被拒绝(不装载到表中)。可以使用 dumpfile 修饰符来指定用于记录被拒绝行的文件的文件名和位置。
2、构建阶段:
基于装载阶段收集到的键创建索引。如果指定了 STATISTICS USE PROFILE,则还要根据为目标表定义的概要文件(profile)收集统计信息。这个概要文件必须在装载执行之前创建,否则将返回一个警告,并且无法收集到统计信息。
3、删除阶段:
- 删除导致违反惟一键的行,并将它们放在异常表中。除了前面描述的不符合目标表定义的数据外,还有一些通过了装载阶段但是违反表中定义的惟一性约束的数据。注意,这里只有违反惟一键的行被当作不良数据;这一次不会检查其他约束。由于这种类型的数据已经被装载到表中,因此 LOAD 实用程序将在这个阶段删除不符合要求的行。这里可以使用一个异常表来存储被删除的行,以便装载操作完成后决定如何处理它们。如果没有指定异常表,则不符合要求的行就完全被删除,而没有被跟踪。后面将更详细地讨论异常表。
- 将消息记录在消息文件中。
4、索引复制阶段:
- 如果指定了 ALLOW READ ACCESS 和 USE TABLESPACE 选项,那么这个阶段会将索引数据从系统临时表空间中复制到这些索引应该处在的表空间中。
异常表 是一种用户定义的表,它必须具有与被装载的目标表相同的列定义。如果至少有一个列在异常表中没有出现,那么不符合要求的行将被丢弃。只有两个附加的列可以添加到表的后面:一个是用于记录一个行何时被插入的时间戳列,另一个是用于存放一个行之所以被当作坏行的原因(或消息)的 CLOB 列。
您将注意到,这一屏中给出的一些概念还没有被详细谈到。在这一节剩下的部分中,我们将使用一些例子,并将这些概念串起来讲。
一个装载的例子
看看下面这个例子,它演示了一个装载过程中涉及的步骤:
LOAD FROM emp.ixf OF IXF
MESSAGES msg.out
MODIFIED BY DUMPFILE=c:\emp.dmp
TEMPFILES PATH d:\tmp
INSERT INTO employee
FOR EXCEPTION empexp
在上面的图中,(1) 显示了输入源文件的内容。
(2) 中显示的目标表 EMPLOYEE 是用以下列定义创建的:
第一列必须是惟一的。
最后一列是一个数值列,且不能为 NULL。
(3) 中显示的异常表 EMPEXP 是使用和 EMPLOYEE 相同的列,再加上时间戳和消息列创建的。
在装载阶段,输入文件中的所有数据被装载到 EMPLOYEE 中 —— 除了标为粉色的两个行,因为它们不符合 NOT NULL 和 NUMERIC 列定义。由于指定了 DUMPFILE 修饰符,因此这两行的数据被记录在 C:\emp.dmp 文件中。
在删除阶段,标为黄色的两个行被从 EMPLOYEE 中删除,并插入到异常表 EMPEXP 中。这是因为它们违反了 EMPLOYEE 表中第一列的惟一性约束造成的。
在装载的最后,您应该检查消息文件、转储文件和异常表,然后决定如何处理被拒绝的行。如果装载成功完成,那么在 D:\tmp 中生成的临时表将被删除。