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 = 130******** 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 = 130******** 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 = 131******** 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 "
监控日志前滚状态
$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 = Forward
Total Work = 917504482 bytes
Completed Work = 917504482 bytes
Start Time = 02/09/2012 14:20:38.088698 Phase Number [Current] = 2
Description = Backward
Total Work = 0 bytes
Completed Work = 0 bytes
Start Time = 02/09/2012 14:30:07.439420
ID = 35
Type = ROLLFORWARD RECOVERY Database Name = SMP_DB
Partition Number = 3
Description = Database Rollforward Recovery
Start Time = 02/09/2012 14:20:38.004773
Progress Monitoring:
Estimated Percentage Complete = 100
Phase Number = 1
Description = Forward
Total Work = 884737007 bytes
Completed Work = 884737007 bytes
Start Time = 02/09/2012 14:20:38.004776
Phase Number [Current] = 2
Description = Backward
Total Work = 0 bytes
Completed Work = 0 bytes
Start Time = 02/09/2012 14:29:12.021301
至此,我们完成了对已启用恢复前滚模式的DB2 分区数据库SMP_DB,利用BACKUP 命令进行联机备份,并使用RESTORE 和ROLLFORWARD 命令恢复至备机SMP_DB 的介绍。
前滚结束后,查看日志前滚情况
$db2 rollforward db smp_db query status
Rollforward Status
Input database alias = smp_db
Number of nodes have returned status = 4
Node number Rollforward status Next log to be read Log files processed Last committed transaction
----- ----------- ------------ ------------------------- --------------------------
0 DB working S0122817.LOG S0122408.LOG-S0122816.LOG 2012-02-09-00.00.32.000000
1 DB working S0078850.LOG S0078599.LOG-S0078849.LOG 2012-02-08-00.00.50.000000
2 DB working S0082540.LOG S0082290.LOG-S0082539.LOG 2012-02-08-00.00.50.000000
3 DB working S0077874.LOG S0077623.LOG-S0077873.LOG 2012-02-08-00.00.50.000000