db2分区数据库的备份和恢复

在工作中,对数据库经常要进行备份和恢复,在项目,2012年1月,由于某种原因,其中一台DB2 数据库备机上每天定时前滚日志的任务执行没达到预期目的,经过分析,发现原因在于编目节点(0节点的日志不连续。丢失的日志并不容易找回来,所以我们就需要利用原有备份文件进行恢复。
        根据项目的实际情况,主要介绍的是实现DB2 分区数据库备份与恢复的实际操作操作,其中主要包括对分区数据库的备份操作,对分区数据库的恢复操作以及对分区数据库的前滚操作等内容的详细描述  。
  利用此次恢复分区数据库,说明如何对启用了前滚恢复模式的 DB2 分区数据库,正确地利用 BACKUP/RESTORE/ROLLFORWARD 等命令进行备份,恢复以及带 OVERFLOW 项的前滚操作  。
  对于 DB2 的分区数据库,某些直接发出的 DB2 命令只作用于当前一个分区,备份和恢复(BACKUP/RESTORE就属于这一类命令  。但是对于硬盘数据恢复分区数据库,由于同一数据库的数据分布在多个分区上,则对它的备份和恢复操作就要考虑到各分区上数据的完整及同步问题,因此可以在 DB2 命令前加上 db2_all 命令,以便 DB2 命令在数据库的各个分区上被执行,而无需分别对每个分区重复发出相同的命令  。例如:db2_all "db2 backup db sample online" 。
  另外在 DB2 中,启用了前滚数据恢复模式的数据库,使用的是归档日志方式,而非缺省的循环日志方式  。这样,在进行恢复操作时,可在利用 RESTORE 命令恢复了数据库或表空间的备份后,再通过前滚命令(ROLLFORWARD命令前滚归档日志中的事务,恢复数据库备份时间点之后提交的事务,最大程度的保护数据库的数据  。
该数据库创建在一台服务器上,4个分区都在同一台服务器上,其编目分区为0号分区  。
对分区数据库的备份操作
  前面已经介绍了,备份操作仅作用于DB2 分区数据库的当前分区,所以要使用“db2_all”的命令实现对所分区进行备份(这里使用联机备份方式,即:
db2_all "|| db2 backup db smp_db online to /dbbackup/online/smp  compress";    
对分区硬盘数据并行压缩备份,分区数据库的备份结束后会为每个分区都产生一个备份映象文件  :
SMP_DB.0.SMPadmin.NODE0000.CATN0000.20120129170009.001
SMP_DB.0.SMPadmin.NODE0002.CATN0000.20120129170009.001
SMP_DB.0.SMPadmin.NODE0001.CATN0000.20120129170009.001
SMP_DB.0.SMPadmin.NODE0003.CATN0000.20120129170009.001
  分区间以并行方式进行的方法:
  <<+分区号< :表示后续命令作用于该分区  。
  <<-分区号< :表示后续命令作用于除该分区之外的其它分区  。
  ||<<-分区号< 或 <<-分区号; :表示后续命令作用数据恢复于除该分区之外的其它分区,并且是以并行方式进行的  。
 对分区数据库的恢复操作
  由于备份和恢复操作都只作用于当前数据库分区,因此也可分为串行和并行的方式  。
    这里我们先在恢复编目分区的数据库,然后并行恢复其他个分区的数据库,由于数据库比较大,磁盘性能低,所以一共耗时30个小时左右。
$db2_all "<<+0< db2 restore db smp_db from /dbbackup/online/smp  replace existing without prompting";
$db2_all "||<<-0< db2 restore db smp_db from /dbbackup/online/smp replace existing without prompting";
$db2 list utilities show detail  在恢复数据库的时候,可以使用命令监控数据库的恢复情况,输出如下:
   db2inst1:[/home/db2inst1]$db2 list utilities show detail
ID                               = 33
Type                             = RESTORE
Database Name                    = SMP_DB
Partition Number                 = 1
Description                      = db
Start Time                       = 02/08/2012 09:16:37.176322
Progress Monitoring:
      Completed Work             = 13094539264 bytes
      Start Time                 = 02/08/2012 09:16:37.176325

ID                               = 33
Type                             = RESTORE
Database Name                    = SMP_DB
Partition Number                 = 2
Description                      = db
Start Time                       = 02/08/2012 09:16:37.221974
Progress Monitoring:
      Completed Work             = 13038579712 bytes
      Start Time                 = 02/08/2012 09:16:37.221977

ID                               = 33
Type                             = RESTORE
Database Name                    = SMP_DB
Partition Number                 = 3
Description                      = db
Start Time                       = 02/08/2012 09:16:37.249874
Progress Monitoring:
      Completed Work             = 13102170112 bytes
      Start Time                 = 02/08/2012 09:16:37.249876
经过监控发现恢复进度很慢,通过topas监控一下发现磁盘非常忙
  
  由于我们使用的备份映象文件是通过联机备份产生的,因此在恢复操作结束后,数据库将处于前滚暂挂状态,必须通过前滚操作前滚归档日志,以取消前滚暂挂状态,使数据库最终可用  。此次,我们需要前滚数据库,但是不取消前滚暂挂状态。
对分区数据库的前滚操作
  由于备机上数据库 SMP_DB 的日志路径下不包含源 生产机SMP_DB 数据库日志路径下的归档日志文件,所以在前滚操作之前,需要将 生产机SMP_DB 的归档日志文件复制到一个特定的路径下,然后在发出前滚命令时,使用 OVERFLOW 项来指定该路径,以替代 SMP_DB 的数据恢复日志路径来提供前滚操作要使用的归档日志文件  。
  这里假设将各分区的归档日志文件对应复制到 /dbbackup/log_smp/archive/smp_db 下,因前滚命令仅可在编目分区上执行,所以在编目分区上前滚到日硬盘数据恢复志文件尾并结束前滚状态的命令应写为:
db2 "rollforward db smp_db  to end of logs on all dbpartitionnums overflow log path
(/dbbackup/log_smp/archive/smp_db/NODE0000,
/dbbackup/log_smp/archive/smp_db/NODE0001 on dbpartitionnum 1,
/dbbackup/log_smp/archive/smp_db/NODE0002 on dbpartitionnum 2,
/dbbackup/log_smp/archive/smp_db/NODE0003 on dbpartitionnum 3)"
  注:对于0号分区,在 OVERFLOW 项中不能使用“on dbpartitionnum 0”的子句,否则会遇到:SQL0104N An unexpected token "on" was found following "<identifier>". Expected tokens may include: ")". SQLSTATE=42601 的报错,表明命令语法不正确  。
监控日志前滚状态
$db2 list utilities show detail
ID                               = 35
Type                             = ROLLFORWARD RECOVERY
Database Name                    = SMP_DB
Partition Number                 = 0
Description                      = Database Rollforward Recovery
Start Time                       = 02/09/2012 14:20:37.599683
Progress Monitoring:
   Phase Number                  = 1
      Description                = Forward
      Total Work                 = 0 bytes
      Completed Work             = 0 bytes
      Start Time                 = 02/09/2012 14:20:37.599686
   Phase Number [Current]        = 2
      Description                = Backward
      Total Work                 = 0 bytes
      Completed Work             = 0 bytes
      Start Time                 = 02/09/2012 14:20:37.851088

ID                               = 35
Type                             = ROLLFORWARD RECOVERY
Database Name                    = SMP_DB
Partition Number                 = 1
Description                      = Database Rollforward Recovery
Start Time                       = 02/09/2012 14:20:37.974493
Progress Monitoring:
   Estimated Percentage Complete = 100
   Phase Number                  = 1
      Description                = Forward
      Total Work                 = 917504901 bytes
      Completed Work             = 917504901 bytes
      Start Time                 = 02/09/2012 14:20:37.974496
   Phase Number [Current]        = 2
      Description                = Backward
      Total Work                 = 0 bytes
      Completed Work             = 0 bytes
      Start Time                 = 02/09/2012 14:29:35.164973

ID                               = 35
Type                             = ROLLFORWARD RECOVERY
Database Name                    = SMP_DB
Partition Number                 = 2
Description                      = Database Rollforward Recovery
Start Time                       = 02/09/2012 14:20:38.088695
Progress Monitoring:
   Estimated Percentage Complete = 100
   Phase Number                  = 1
      Description     

猜你喜欢

转载自tianyihuyidao9.iteye.com/blog/1613134