加入收藏 | 设为首页 | 在线留言 | RSS
您当前的位置:首页 > 数据库设计 > DB2教程

DB2 实用程序介绍之LOAD实用程序

时间:2010-07-21 21:26:07  来源:  作者:

  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 中生成的临时表将被删除。

  装载选项和文档类型修饰符

  前一屏中已介绍了一些装载选项和文档类型修饰符。这里再讨论一些。

  装载选项:

  ROWCOUNT n: 允许用户指定只装载输入文档中的前 n 个记录。

  SAVECOUNT n: 每装载 n 行后建立一致点。消息文档中将生成和记录一些消息,用于表明在保存点所在时间上有多少输入行被成功地装载。当输入文档类型是 CURSOR 时,不会出现这种情况。

  WARNINGCOUNT n: 在发生 n 次警告后停止装载。

  INDEXING MODE [ REBUILD | INCREMENTAL | AUTOSELECT | DEFERRED ]: 在构建阶段构建索引。这个选项指定 LOAD 实用程式是重新构建索引,还是以增量的方式扩展索引。这里支持四中不同的模式:

  •   REBUILD 模式强制重新构建任何索引。
  •   INCREMENTAL 模式只向索引中添加新的数据。
  •   AUTOSELECT 模式允许实用程式在 REBUILD 和 INCREMENTAL 之间作出选择。
  •   DEFERRED 模式意味着在装载期间不会创建索引。涉及的索引上会作出标记,但是需要刷新。当重新启动数据库或第一次访问那些索引时,才会重新构建那些索引。

  STATISTICS USE PROFILE: 执行装载后,之前的目标表统计信息很可能已无效了,因为表中添加了更多的数据。您能够选择在构建阶段根据为目标表定义的概要文档来收集统计信息。

  文档类型修饰符。 文档类型修饰符是用 MODIFIED BY 子句指定的。下面是一些可能对您有用的文档类型修饰符:

  •   fastparse: 减少对被装载数据的语法检查,以提高性能。
  •   identityignore、identitymissing 和 identityoverride: 分别用于忽略列数据、表明缺少列数据或覆盖相同的列数据。
  •   indexfreespace n、pagefreespace n 和 totalfreespace n: 保留索引中指定数量的空闲页和数据页。
  •   norowwarnings: 禁止发出行警告。
  •   lobsinfile: 表明要装载 LOB 文档。看看用于 LOB 路径的 LOBS FROM 选项。

  装载期间的表访问

  当一个表被装载时,LOAD 实用程式用一个排他锁将他锁定。在装载完成之前,对表的其他访问是不允许的。这是 ALLOW NO ACCESS 选项的默认行为。在那样的装载期间,表处于 LOAD IN PROGRESS 状态。有一个很方便的命令能够检查装载操作的状态和返回表状态:

  LOAD QUERY TABLE table_name

  您也许会猜想有一个选项会允许表访问。ALLOW READ ACCESS 选项导致被装载的表以共享的方式锁定。读者能够访问表中已有的数据,但是不能访问新装载的那部分数据。在装载完成之前,不能访问正在装载的数据。这个选项使正在装载数据的表处于 LOAD IN PROGRESS 状态和 READ ACCESS ONLY 状态。

  如前一屏中提到的那样,在构建阶段,能够重新构建一个完整的索引,也能够用新的数据扩展索引。对于 ALLOW READ ACCESS 选项,假如重新构建完整的索引,那么将创建索引的一个影子副本。当 LOAD 实用程式进入索引复制阶段(见 装载过程的四个阶段)时,目标表将离线,新的索引被复制到目标表空间。

  无论指定哪种表访问选项,装载操作都需要得到各种不同的锁才能继续。假如某个应用程式已锁住了目标表,那么 LOAD 实用程式就必须等到这些锁被释放。为了不必等到一个锁释放出来,能够使用 LOAD 命令中的 LOCK WITH FORCE 选项,使持有有冲突的锁的其他应用程式离开。

  配置 Integrity Pending 表状态

  到现在为止,我们知道不符合目标表定义的输入数据不会被装载到表中。在装载阶段,那样的数据会被拒绝,并记录在消息文档中。在删除阶段,LOAD 实用程式删除违反惟一性约束的行。假如指定了相关选项,则不符合需要的行将被插入到一个异常表中。那么,对于表上可能定义的其他约束,例如参照完整性约束和检查约束,又是怎样处理的呢?LOAD 实用程式不会检查这些约束。表将处于 SET INTEGRITY PENDING 状态,因此,在能够访问表之前,必须手动地检查数据完整性。能够使用前一屏中讨论的 LOAD QUERY 命令来查询表的状态。系统编目表 SYSCAT.TABLES 中的 CONST_CHECKED 列也表明了表中定义的每种约束的状态。

  check Pending

  要手动关闭一个或多个表的完整性检查,能够使用 SET INTEGRITY 命令。这里给出一些例子来演示这个命令的一些选项。为了立即为 EMPLOYEE 和 STAFF 表的附加选项检查完整性,能够使用命令:

  SET INTEGRITY FOR employee, staff IMMEDIATE CHECKED INCREMENTAL

  为了避免对 EMPLOYEE 表进行外键检查,能够使用 IMMEDIATE UNCHECKED 选项:

  SET INTEGRITY FOR employee FOREIGN KEY IMMEDIATE UNCHECKED

  在某些情况下,您可能想在装载完成后使目标表和和之有外键关系的子表处于 SET INTEGRITY PENDING 状态。这样能够确保对任何这些表的访问都受到控制,直到执行了手动的完整性检查。装载选项是 SET INTEGRITY PENDING CASCADE IMMEDIATE,这表明外键约束的 check pending 状态被立即扩展到有外键关系的任何子表中。默认情况下,只有被装载的表处于 check pending 状态。这是装载选项 SET INTEGRITY PENDING CASCADE DEFERRED 的行为。

  表空间状态

  由于 LOAD 实用程式直接将格式化的页写到数据库中,因此不会执行数据库日志记录来记录被装载的新数据。对于可恢复数据库(即打开了 LOGREATIN 和/或 USEREXIT 选项),DB2 需要确保那个数据库在装载完成后仍然是可恢复的。为了保¯可恢复性,用于存放表的表空间将被置于 BACKUP PENDING 模式。这意味着表空间在被访问之前必须先作备份。

  这是使表空间在装载操作完成之后能够被访问的默认方法。另一种方法是在装载运行时,使用 COPY YES 选项备份被装载的数据。在装载结束时,将创建一个备份文档。

  假如想避免在装载完成后立即备份表空间,那么能够考虑另外一种选择。装载选项 NONRECOVERABLE 将被装载的表标记为不可恢复。在装载完成后,相关的表空间能够完全访问。DB2 不会阻止您查询和修改表数据。但是,假如以后需要恢复表空间并且回滚到 NONRECOVERABLE 装载选项之后的某个时间点,这个被装载的表是不可恢复的。恢复过程忽略任何和表相关的日志。您只能删除并重新创建表。因此,建议在方便的时候为表作备份,使已有的数据和被装载的数据都保存在备份中。

  使用 Control Center 执行装载

  Control Center 为执行装载操作提供了易于使用的图像化界面。如下图所示,高级选项都用提示作了描述。使用 Control Center 很容易配置这些选项。

  使用 Control Center 执行装载

  IMPORT 和 LOAD

  下面是 IMPORT 和 LOAD 实用程式之间的比较:

  Import 和 Load


来顶一下
返回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
推荐资讯
使用ADO.NET访问Oracle 9i存储过程(上)
使用ADO.NET访问Oracl
霍夫曼树编码的实现
霍夫曼树编码的实现
C++ Builder 在应用程序中处理多个绘图对象
C++ Builder 在应用程
使用 C++ Builder 对象仓库
使用 C++ Builder 对
相关文章
    无相关信息
栏目更新
栏目热门