正文 当 DB2的数据库启用了前滚恢复模式,即将日志由循环日志方式改为归档日志,以便用户在进行恢复操作时,可在恢复了数据库或表空间的备份后,再通过前滚归档日志中的事务,恢复数据库备份时间点之后提交的事务,最大程度的保护数据库的数据。 

   而 DB2 的 LOAD实用程序为实现快速导入数据的功能,除采用了通过直接向数据库中写入格式化的数据页装载数据,导入过程中不激活触发器,不会检查参考完整性和表检查约束当等方式外,还最小化了记录事务日志的操作。在LOAD 的 LOAD、BUILD、DELETE 和 INDEX COPY 四个处理阶段中,仅在 DELETE阶段记录对每个删除事件记日志,即只对每个违反唯一约束的行的删除操作记日志,因此整个 LOAD操作仅记录了极少的日志。 

   由于 LOAD最小化了日志的记录,有因启用了前滚恢复的数据库在恢复在线备份时需要归档日志的特性,对于这种数据库的 LOAD 操作,为避免执行LOAD 操作后,表在使用 ROLLFORWARD 命令前滚归档日志的过程中因缺少日志而被置为非正常状态,DB2 为 LOAD命令提供了如下选项: 

   ·COPYNO(缺省) 
   ·COPYYES 
  ·NONREVERABLE 

  为更清楚地说明这些选项的作用,这里将以举例的方式进行说明。而在开始操作之前,首先了解一下 DB2备份操作所产生的映象文件的形式和命名特点: 

   在 UNIX环境下是文件的形式: 
  Databasealias.Type.Instancename.Nodename.Catnodename.Timestamp.number 

   在 Windows环境下是子目录及文件的形式: 
  Databasealias.Type\Instancename\Node0000\Catn0000\yyyymmdd\hhmmss.number 

   而其中的 Type则因备份类型的不同而不同: 

   0 --数据库全备份 
   3 --表空间备份 
   4 -- 由 LOAD操作产生的备份 


  1. 进行一次数据库的全备份:

  首先对已启用前滚恢复模式的 SAMPLE 数据库进行一次全备份: 

  E:\TEST>db2 backup dbsample 
  备份成功。此备份映像的时间戳记是:20051230174105 

  这时看到在当前目录下产生了一个 SAMPLE.0的子目录,表明产生的是一个数据库全备份。下面将对这些现象逐个予以举例说明: 

  2. 关于 COPY NO: 

   在 LOAD操作结束时,将表所在的表空间置于“备份暂挂”状态,此时虽然其中的表可以进行 SELECT 操作,但不能进行 UPDATE 和DELETE 操作。为使该表状态恢复正常,除去备份暂挂状态,必须手动对其表空间执行一个 BACKUP 命令。由于该选项为缺省选项,如果LOAD 命令中未指明,则默认为使用该选项,如: 

  E:\TEST>db2 connect tosample 

  E:\TEST>db2 load from staff.del of del insert intostaff 

  E:\TEST>db2 listtablespaces 

  : 
   表空间标识 =2 
   名称 =USERSPACE1 
   类型 =系统管理空间 
   内容 =任何数据 
   状态 =0x0020 
  详细解释: 
  备份暂挂 
  : 

  E:\TEST>db2 select count(*) fromstaff 
  1 
  ----------- 
  70 
   1条记录已选择。 

  E:\TEST>db2 update staff set id=335 whereid=340 
   DB21034E该命令被当作 SQL 语句来处理,因为它不是有效的“命令行处理器”命令。在 SQL处理期间,它返回: 
   SQL0290N不允许存取表空间。 SQLSTATE=55039 

   在手动对USERSPACE1表空间进行一次备份操作后,表空间状态将正常,再次尝试更新操作就会成功: 

  E:\TEST>db2 backup db sample tablespace(userspace1) 
  备份成功。此备份映像的时间戳记是:20051230184841 

  命令完成后可以在当前目录下看到产生了一个 SAMPLE.3的子目录,表明产生的是一个表空间级的备份。 

  E:\TEST>db2 connect tosample 

  E:\TEST>db2 listtablespaces 

   表空间标识 =2 
   名称 =USERSPACE1 
   类型 =系统管理空间 
   内容 =任何数据 
   状态 =0x0000 
  详细解释: 
  正常



而所产生这份关于表空间的备份可在数据库因前滚操作将表空间置为“复原暂挂”状态时用于将表空间状态恢复为正常,并恢复 LOAD操作对该表的修改。如当前滚数据库超过 LOAD时间点后,表空间将被置为复原暂挂状态: 

  E:\TEST>db2 restore db sample taken at20051230174105 
   DB20000IRESTORE DATABASE 命令成功完成。 

  E:\TEST>db2 rollforward db sample to end of logs andstop 
   SQL1271W已恢复数据库 "SAMPLE",但在节点"0"上有一个或多个表空间脱机 

  E:\TEST>db2 connect tosample 

  E:\TEST>db2 listtablespaces 
   表空间标识 =2 
   名称 =USERSPACE1 
   类型 =系统管理空间 
   内容 =任何数据 
   状态 =0x0100 
  详细解释: 
  复原暂挂 

  此时可利用这一表空间级的备份进行恢复操作: 

  E:\TEST>db2 restore db sample tablespace(userspace1) taken at20051230184841 
   DB20000IRESTORE DATABASE 命令成功完成。 

  E:\TEST>db2 connect tosample 

  E:\TEST>db2 listtablespaces 
  : 
   表空间标识 =2 
   名称 =USERSPACE1 
   类型 =系统管理空间 
   内容 =任何数据 
   状态 =0x0080 
  详细解释: 
  前滚暂挂 
  : 

  E:\TEST>db2 rollforward db sample to end of logs andstop tablespace (userspace1) 

  前滚状态 

   输入数据库别名 =sample 
   节点数已返回状态 =1 

   节点号 =0 
   前滚状态 =未暂挂 
   下一个要读取的日志文件= 
   已处理的日志文件 =- 
   上次落实的事务 =2005-12-30-10.47.10.000000 

   DB20000IROLLFORWARD 命令成功完成。 

  E:\TEST>db2 connect tosample 

  E:\TEST>db2 listtablespaces 
  : 
   表空间标识 =2 
   名称 =USERSPACE1 
   类型 =系统管理空间 
   内容 =任何数据 
   状态 =0x0000 
  详细解释: 
  正常 
  : 

  E:\TEST>db2 update staff set id=335 whereid=340 
   DB20000I SQL命令成功完成。 

  可见表空间状态已正常,表也可执行更新操作了。




  3. 关于 COPY YES: 

   在 LOAD操作结束时,DB2 自动对表所在的表空间进行一次备份操作,因而 LOAD结束后,表所在的表空间不会再处于“备份暂挂”状态,而为“正常”状态。但由于要进行备份操作,所以这种 LOAD操作的时间会较没有备份的长。如: 

  E:\TEST>db2 connect tosample 

  E:\TEST>db2 load from staff.del of del insert intostaff copy yes to . 

  E:\TEST>db2 listtablespaces 
  : 
   表空间标识 =2 
   名称 =USERSPACE1 
   类型 =系统管理空间 
   内容 =任何数据 
   状态 =0x0000 
  详细解释: 
  正常 
  : 

  E:\TEST>db2 select count(*) fromstaff 
  1 
  ----------- 
  105 
   1条记录已选择。 

  此时可在当前目录下看到一个 SAMPLE.4 的子目录,表明产生的是一个由 LOAD操作生成的备份,而这份备份将在数据库进行前滚恢复操作时用于重新创建 LOAD操作对数据库的修改。如: 

  E:\TEST>db2 restore db sample taken at20051230174105 
   DB20000IRESTORE DATABASE 命令成功完成。 

  E:\TEST>db2 rollforward db sample to end of logs andstop 

  前滚状态 

   输入数据库别名 =sample 
   节点数已返回状态 =1 

   节点号 =0 
   前滚状态 =未暂挂 
   下一个要读取的日志文件= 
   已处理的日志文件 =S0000002.LOG - S0000003.LOG 
   上次落实的事务 =2005-12-30-11.48.26.000000 

   DB20000IROLLFORWARD 命令成功完成。 

  E:\TEST>db2 connect tosample 

  E:\TEST>db2 listtablespaces 
  : 
   表空间标识 =2 
   名称 =USERSPACE1 
   类型 =系统管理空间 
   内容 =任何数据 
   状态 =0x0000 
  详细解释: 
  正常 
  : 

  E:\TEST>db2 select count(*) fromstaff 
  1 
  ----------- 
  105 
   1条记录已选择。 

   这表明在SAMPLE.4 下的备份被用于了前滚恢复操作,而重新创建了 LOAD操作对数据库插入的记录。 

  4. 关于 NONRECOVERABLE:

   该选项会将 LOAD操作标志为不可恢复,即数据库不能通过后续的前滚操作而被恢复。LOAD操作结束后,数据库既不会处于“备份暂挂”状态,也不会产生任何的备份。 

  E:\TEST>db2 connect tosample 

  E:\TEST>db2 load from staff.del of del insert intostaff nonrecoverable 

  E:\TEST>db2 listtablespaces 
  : 
   表空间标识 =2 
   名称 =USERSPACE1 
   类型 =系统管理空间 
   内容 =任何数据 
   状态 =0x0000 
  详细解释: 
  正常 
  : 

   虽然 LOAD之后表空间和表的状态都正常,但如果今后需要执行前滚命令恢复数据库时,前滚操作将跳过 LOAD事务的处    理,而将LOAD 的表标记为无效,是对表的任何操作都不能进行。如: 

  E:\TEST>db2 restore db sample taken at20051230174105 
   DB20000IRESTORE DATABASE 命令成功完成。 

  E:\TEST>db2 rollforward db sample to end of logs andstop 

  前滚状态 

   输入数据库别名 =sample 
   节点数已返回状态 =1 

   节点号 =0 
   前滚状态 =未暂挂 
   下一个要读取的日志文件= 
   已处理的日志文件 =S0000002.LOG - S0000003.LOG 
   上次落实的事务 =2005-12-30-12.19.55.000000 

   DB20000IROLLFORWARD 命令成功完成。 

  E:\>db2 connect tosample 

  E:\TEST>db2 listtablespaces 
  : 
   表空间标识 =2 
   名称 =USERSPACE1 
   类型 =系统管理空间 
   内容 =任何数据 
   状态 =0x0000 
  详细解释: 
  正常 
  : 

  E:\>db2 select * fromstaff 

   ID NAME DEPTJOB YEARS SALARY COMM 
   --------------- ------ ----- ------ ------------------ 
   SQL1477N不能存取表 "LIWENLI.STAFF"。SQLSTATE=55019 

  这表明该表已不可操作,此时只有将表删除,重新构建,或使用 LOAD操作时间点之后所做的数据库全备份或表空间备份来恢复该表。




  5. 关于注册表变量 DB2_LOAD_COPY_NO_OVERRIDE 的介绍:

   另外 DB2还提供了一个注册表变量:DB2_LOAD_COPY_NO_OVERRIDE,可将 LOAD 的缺省选项 COPY NO 设置为NONRECOVERABLE 或 COPYYES。具体使用方法举例为: 

   设置为 COPY YES的方法: 

  E:\TEST>db2set DB2_LOAD_COPY_NO_OVERRIDE="COPY YESTO E:\TEST" 
  E:\TEST>db2terminate 
  E:\TEST>db2set 
  DB2_LOAD_COPY_NO_OVERRIDE=COPY YES TOE:\TEST 
  : 

  E:\TEST>db2 load from staff.del of del insert intostaff 
   SQL27966WDB2_LOAD_COPY_NO_OVERRIDE 注册表变量值 "COPY YES TO E:\TEST" 将覆盖在 Load中指定的COPY    NO 参数。 
  : 
  : 

   设置为NONRECOVERABLE 的方法: 

  E:\TEST>db2setDB2_LOAD_COPY_NO_OVERRIDE=NONRECOVERABLE 
  E:\TEST>db2terminate 
  E:\TEST>db2set 
  DB2_LOAD_COPY_NO_OVERRIDE=NONRECOVERABLE 
  : 

  E:\TEST>db2 load from staff.del of del insert intostaff 
   SQL27966WDB2_LOAD_COPY_NO_OVERRIDE 注册表变量值 "NONRECOVERABLE" 将覆盖在Load 中指定的COPY NO 参数。 
  : 
  : 

   通过上述对 LOAD 的COPY NO,COPY YES 和 NONRECOVERABLE 参数,以及 DB2 注册表变量 DB2_LOAD_COPY_NO_OVERRIDE 的详细和举例说明,到此我们已经掌握了它们的功能和使用方法。由于 LOAD操作几乎不记日志的特性,在对启用了前滚恢复的数据库实现 LOAD 操作时应注意从中选择适当的选项,以保证执行了 LOAD操作的表的可用性。