免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6636 | 回复: 5
打印 上一主题 下一主题

DB2中的数据移动(三) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-12-24 14:13 |只看该作者 |倒序浏览
大家好!我们单位的紧急任务终于告一段落了,前一段时间无论身体还是心理都疲惫到了极点,现在总算可以稍微轻松一些了。

“DB2中的数据移动”第三部分拖了很长时间,不少朋友都在关心,向大家表示感谢了!!!

闲话少叙,赶紧进入正题吧:


  1. 装入(Load)

  2. 装入命令格式与导入类似,命令关键字是Load,但是后面的参数比导入命令多的多,详细用法可以自行参考DB2文档。

  3. 装入与导入类似,都是将输入文件中的数据移入到目标表中,二者的不同点将在实例中逐步解释。

  4. 在装入之前,目标表必须已经存在。

  5. 装入的性能比导入高,原因在后面结合实例详细解释。

  6. 装入操作不记录到日志中,所以不能使用日志文件进行前滚操作。

  7. 装入分为4个阶段:
  8. 1. 装入阶段
  9. 在这个阶段发生两件事:数据存储在表中,收集索引键并排序。在装入时,DBA可以指定多长时间生成一致点。

  10. 它是装入工具的检查点。如果装入在执行期间被打断,它可以从最后一个一致点处开始继续重新执行。

  11. 2. 构建阶段
  12. 在构建阶段,基于在装入阶段收集的索引键信息创建索引。如果在构建阶段发生错误,装入工具就重启,它将从构建阶段开始处重新开始构建。

  13. 3. 在删除阶段,所有违反唯一或主键约束的行都被删除并拷贝到一个异常表(如果在语句中指定相应选项)中。当输入行被拒绝,消息文件中就生成消息。

  14. 4. 索引拷贝阶段
  15. 如果在装入操作期间为索引创建指定了系统临时表空间,并且选择了 READ ACCESS 选项,该索引数据将从系统临时表空间拷贝到原来的表空间。

  16. 装入过程的所有四个阶段都是操作的一部分,只有在所有的四个阶段都完成之后,该装入操作才算完成。在每个阶段都将生成消息,一旦其中的某个阶段发生错误,这些消息可以帮助DBA分析并解决问题。

  17. 导入操作每次插入一行数据时都要检查是否满足约束条件,并且记入日志文件中。


  18. 下面我们看一些LOAD命令特有的功能,IMPORT命令也能做的就不再详细说了。

  19. 例十二:从光标类型文件中进行装入
  20. 定义一个cursor
  21. declare mycur cursor for select * from org
  22. 创建一个新表,结构与cursor相容
  23. create table org2 like org
  24. 从cursor中装入
  25. load from mycur of cursor insert into org2

  26. 除了可以从cursor中装入,还可以从文件、管道、设备中进行装入。而导入命令只能从文件中导入。



  27. 例十三:关于异常表
  28. 由用户定义的异常表可以用于存储不遵循唯一约束和主码约束的行。如果装入的时候没有指定异常表,则违反唯一约束的行将被丢弃并且将不再有机会恢复或修改。
  29. 用SAMPLE数据库中的STAFF表做实验
  30. 1. 创建一个结构与STAFF表相同的表STAFF1
  31. CREATE TABLE STAFF1 LIKE STAFF

  32. 2. 把STAFF表中的一部分数据插入到STAFF1中
  33. INSERT INTO STAFF1 SELECT * FROM STAFF WHERE ID<=160

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

  36. 4. 给该异常表添加一列,因为异常表和普通表相比,前面的结构都相同,就是最后多出一列或两列(列名任意),第一列是时间戳类型,记录异常记录插入的时间,第二列是大文本类型(至少为32K大小),保存导致该条记录被拒绝的特定约束信息。本例中只添加一个时间戳列。
  37. ALTER TABLE STAFFEXP ADD COLUMN TIME TIMESTAMP

  38. 5. 为STAFF1表创建一个唯一索引
  39. CREATE UNIQUE INDEX IDXSTAFF ON STAFF1(ID)

  40. 6. 先运行导出命令做出一个文本文件
  41. EXPORT TO D:\STAFF.TXT OF DEL SELECT * FROM STAFF

  42. 7. 然后运行装入命令把数据再装入到STAFF1表中
  43. LOAD FROM D:\STAFF.TXT OF DEL INSERT INTO STAFF1 FOR EXCEPTION STAFFEXP

  44. 由于表STAFF1中有唯一索引,所以会有一部分数据因为违反这个约束条件而不能插入到STAFF1表中,这些记录就会插入到异常表STAFFEXP中。

  45. 注意一点,异常表必须自己先定义好,装入命令不能够自动生成异常表,如果找不到指定的异常表,就会报错。



  46. 例十四:关于DUMP文件
  47. 格式不正确的行会被拒绝。通过指定DUMPFILE文件类型修饰符可以使这些被拒绝的记录单独放在指定的文件里。
  48. 用SAMPLE数据库中的STAFF表做实验
  49. 1. 创建一个结构与STAFF表相同的表STAFF1
  50. CREATE TABLE STAFF1 LIKE STAFF

  51. 2. 把STAFF表中的一部分数据插入到STAFF1中
  52. INSERT INTO STAFF1 SELECT * FROM STAFF WHERE ID<=160

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

  55. 4. 给该异常表添加一列
  56. ALTER TABLE STAFFEXP ADD COLUMN TIME TIMESTAMP

  57. 5. 为STAFF1表创建一个唯一索引
  58. CREATE UNIQUE INDEX IDXSTAFF ON STAFF1(ID)

  59. 6. 先运行导出命令做出一个文本文件
  60. EXPORT TO D:\STAFF.TXT OF DEL SELECT * FROM STAFF
  61. 到D盘上打开STAFF.TXT文件,把第一列等于320的行替换为:"abcf","aaa","sdfg"

  62. 7. 然后运行装入命令把数据再装入到STAFF1表中
  63. LOAD FROM D:\STAFF.TXT OF DEL MODIFIED BY DUMPFILE=d:\dump INSERT INTO STAFF1 FOR EXCEPTION STAFFEXP

  64. 装入的结果报告中会有如下一条:
  65. SQL3118W  在行 "32" 列 "1" 中的字段值不能转换为 SMALLINT 值,但是目标列不可为空。未装入该行。
  66. SQL3185W  当处理输入文件的第 "32" 行中的数据时发生先前的错误。

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

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



  69. 例十五:限制装入行数
  70. 用ROWCOUNT选项可以指定从文件开始处装入的记录数
  71. LOAD FROM D:\STAFF.TXT OF DEL ROWCOUNT 3 INSERT INTO STAFF1



  72. 例十六:出现警告信息时强令装入操作失败
  73. 在某些情况下,文件中的数据必须全部成功输入到目标表中才算成功,即使有一条记录出错也不行。在这种情况下,可以使用WARNINGCOUNT选项。

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

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

  76. 运行结果包含下面的警告:
  77. SQL3118W  在行 "32" 列 "1" 中的字段值不能转换为 SMALLINT值,但是目标列不可为空。未装入该行。
  78. SQL3185W  当处理输入文件的第 "32" 行中的数据时发生先前的错误。
  79. SQL3502N  实用程序遇到了 "1" 个警告,它超过了允许的最大警告数。

  80. 此时无法对表STAFF1进行操作,例如
  81. SELECT * FROM STAFF1
  82. 会返回:
  83. ID     NAME      DEPT   JOB   YEARS  SALARY    COMM
  84. ------ --------- ------ ----- ------ --------- ---------
  85. SQL0668N  由于表 "USER.STAFF1" 上的原因代码 "3",所以不允许操作。
  86. SQLSTATE=57016

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

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

  89. 包含TERMINATER的LOAD命令可以终止装入进程,使目标表恢复正常可用状态:
  90. LOAD FROM D:\STAFF.TXT OF DEL TERMINATE INTO STAFF1

  91. 包含RESTART的LOAD命令可以在源文件修改正确的时候使用,使装入进程重新开始:
  92. LOAD FROM D:\STAFF.TXT OF DEL RESTART INTO STAFF1



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

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

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

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



  98. 例十八:生成统计数据
  99. 使用STATISTICS选项可以在装入的过程中生成统计数据,这些统计数据可以供优化器确定最有效的执行SQL语句的方式。
  100. 可以对表和索引产生不同详细程度的统计数据:

  101. ① 对表和索引产生最详细的统计数据:
  102. LOAD FROM D:\STAFF.TXT OF DEL REPLACE INTO STAFF1 STATISTICS YES WITH DISTRIBUTION AND DETAILED INDEXES ALL

  103. ② 对表和索引都产生简略的统计:
  104. LOAD FROM D:\STAFF.TXT OF DEL REPLACE INTO STAFF1 STATISTICS YES AND INDEXES ALL

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

  106. 注意:STATISTICS选项只能和REPLACE兼容,与INSERT选项不兼容。

  107. 另外,通过STATISTICS选项做完统计,我们看不到任何直接的结果,如果想查看其结果,需要到系统表中自己查询。



  108. 例十九:解除检查挂起状态
  109. 1. 连接到SAMPLE数据库上:
  110. Connect to sample

  111. 2. 创建一个结构与staff表相同的表:
  112. CREATE TABLE STAFF1 LIKE STAFF

  113. 3. 给该表添加一个检查约束:
  114. alter table staff1 add constraint chk check(dept<100)

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

  116. 束条件了,然后用Load命令从文件中装入数据到staff1表中:
  117. LOAD FROM D:\STAFF.TXT OF DEL INSERT INTO STAFF1

  118. 5. 此时运行查询命令:
  119. Select * from staff1
  120. 会得到错误信息:
  121. SQL0668N  由于表 "USER.STAFF1" 上的原因代码 "1",所以不允许操作。
  122. SQLSTATE=57016
  123. 原因是装入时有数据违反了检查约束,造成表处于检查挂起状态。

  124. 6. 解除表的检查挂起状态,使用:
  125. set integrity for staff1 check immediate unchecked
  126. 再次运行查询命令:
  127. Select * from staff1
  128. 发现表可以正常使用了,其中的违反检查规则的数据也存在。



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

  131. 另外,装入命令还有一些选项可以控制性能因素:
  132. 1. COPY YES/NO和Nonrecoverable
  133. ① Nonrecoverable(不可恢复的):指定装入操作不可恢复,并且不能由后续的前滚操作恢复。前滚操作忽略事务并且标记正在装入数据的表为“无效”。

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

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

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

  138. 3. Anyorder
  139. 如果SAVECOUNT选项没有使用,该参数允许不遵照输入文件中的数据顺序进行装入,在SMP(对称多处理机)系统上CPU_PARALLELISM选项大于1的时候,该参数会提高装入的性能。

  140. 4. Data Buffer
  141. 该参数用于指定从堆栈分配得到的4K大小的内存页面的数目,作为装入的内部缓冲区,指定一个大缓冲区有助于提高装入的性能。

  142. 5. CPU_PARALLELISM
  143. 该选项只能用于SMP系统上,可以指示使用多少进程或线程解析、转换、格式化数据。

  144. 6. Disk_Parallelism
  145. 该选项指定写数据到磁盘的进程或线程的数目。
复制代码


大家多多补充。

以后我会继续写其它的专题。希望大家继续支持!

论坛徽章:
0
2 [报告]
发表于 2004-12-24 17:23 |只看该作者

DB2中的数据移动(三)

辛苦辛苦,工作这么忙,还不忘这里
原创帖一定要支持!

论坛徽章:
0
3 [报告]
发表于 2004-12-27 09:32 |只看该作者

DB2中的数据移动(三)

我觉得学习的时候看官方文档,实际操作的时候往往要看这种原创文章。

论坛徽章:
0
4 [报告]
发表于 2004-12-27 13:18 |只看该作者

DB2中的数据移动(三)

支持一下.不错

论坛徽章:
0
5 [报告]
发表于 2005-11-29 19:52 |只看该作者
打这里学到了好多东西,再不支持一下,太对不起楼主了

论坛徽章:
0
6 [报告]
发表于 2005-11-30 09:20 |只看该作者
好东东当然要顶
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP