本文将为您介绍前滚恢复模式的DB2 分区数据库的启用方法,并将正确地利用BACKUP/RESTORE/ROLLFORWARD等命令进行备份、恢复等操作,供您参考,希望对您有所帮助。
对于 DB2 的分区数据库,某些直接发出的 DB2 命令只作用于当前一个分区,备份和恢复(BACKUP/RESTORE)就属于这一类命令。但是对于分区数据库,由于同一数据库的数据分布在多个分区上,则对它的备份和恢复操作就要考虑到各分区上数据的完整及同步问题,因此可以在 DB2 命令前加上 db2_all 命令,以便 DB2 命令在数据库的各个分区上被执行,而无需分别对每个分区重复发出相同的命令。
另外在 DB2 中,启用了前滚恢复模式的数据库,使用的是归档日志方式,而非缺省的循环日志方式。这样,在进行恢复操作时,可在利用 RESTORE 命令恢复了数据库或表空间的备份后,再通过前滚命令(ROLLFORWARD)命令前滚归档日志中的事务,恢复数据库备份时间点之后提交的事务,最大程度的保护数据库的数据。与备份和恢复命令不同的是,前滚命令仅能通过在分区数据库的编目分区上运行,来实现数据库各分区的前滚操作。
下面就以一个启用了前滚恢复模式的分区数据库 SAMPLE 为例介绍其备份、恢复以及前滚操作的具体步骤。这里假设该数据库创建在一台服务器上,具有四个分区,其编目分区为0号分区。
一. 对分区数据库的备份操作:
前面已经介绍了,备份操作仅作用于分区数据库的当前分区,所以要使用“db2_all”的命令实现对所有分区进行备份(这里使用联机备份方式),即:
db2_all "db2 backup db sample online"
但是上述命令对各分区的备份是以串行方式进行的,为提高备份操作的性能,还有一种可使分区间以并行方式进行的方法。即在上述命令的 DB2 命令前加上以下选项来实现命令的并行:
<<+分区号< :表示后续命令作用于该分区。
<<-分区号< :表示后续命令作用于除该分区之外的其它分区。
||<<-分区号< 或 <<-分区号; :表示后续命令作用于除该分区之外的其它分区,并且是以并行方式进行的。#p#
但由于备份和恢复操作要求独占编目分区,因此在对其它分区进行并行方式的备份操作之前,首先必须完成该分区的备份操作。其方法为:
db2_all "<<+0< db2 backup db sample online" -- 对编目分区的备份
db2_all "||<<-0< db2 backup db sample online" -- 对其它分区的并行备份
或 db2_all "<<-0<; db2 backup db sample online"
注:分区数据库的备份结束后会为每个分区都产生一个备份映象文件。
二. 对分区数据库的恢复操作:
由于备份和恢复操作都只作用于当前数据库分区,因此也可分为串行和并行的方式。为了在前滚恢复中介绍 OVERFLOW 选项的使用,这里我们将 SAMPLE 数据库恢复到同实例的一个名为 SAMPNEW 的新数据库中,其命令应为:
·分区间串行方式:
db2_all "db2 restore db sample into sampnew without prompting"
注:由于是分区数据库,因此在完成了第一个分区的恢复操作,开始第二个分区的恢复操作时系统会出现 SQL2529W 的警告,表明数据库已存在,是否要覆盖的提示,而在某些平台下,如 Linux,这一提示会导致分区数据库恢复操作的失败,如:
$ db2_all "db2 restore db sample into sapmnew"
DB20000I The RESTORE DATABASE command completed successfully.
rhas3: db2 restore db sample into sapmnew completed ok
SQL2529W Warning! Restoring to an existing database that is different from the backup image database, and the alias name "SAPMNEW" of the existing database do es not match the alias name "SAMPLE" of the backup image, and the database name "SAPMNEW" of the existing database does not match the database name "SAMPLE" of the backup image. The target database will be overwritten by the backup version. The Roll-forward recovery logs associated with the target database will be deleted.
Do you want to continue ? (y/n) SQL2001N The utility was interrupted. The output data may be incomplete.
rhas3: db2 restore db sample into sapmnew completed rc=4
因此建议在上述命令中加入了“WITHOUT PROMPTING”的选项,以避免该提示的出现。#p#
·分区间并行方式
db2_all "<<+0< db2 restore db sample into sampnew"
db2_all "||<<-0< db2 restore db sample into sampnew without prompting"
或 db2_all "<<-0<; db2 restore db sample into sampnew without prompting"
因编目分区是第一个进行恢复的分区,所以无需加“WITHOUT PROMPTING”选项。
由于我们使用的备份映象文件是通过联机备份产生的,因此在恢复操作结束后,数据库将处于前滚暂挂状态,必须通过前滚操作前滚归档日志,以取消前滚暂挂状态,使数据库最终可用。
三. 对分区数据库的前滚操作:
由于新数据库 SAMPNEW 的日志路径下不包含源 SAMPLE 数据库日志路径下的归档日志文件,所以在前滚操作之前,需要将 SAMPLE 的归档日志文件复制到一个特定的路径下,然后在发出前滚命令时,使用 OVERFLOW 选项来指定该路径,以替代 SAMPNEW 的日志路径来提供前滚操作要使用的归档日志文件。
为查找源 SAMPLE 数据库归档日志存放的路径,可利用如下命令:
db2_all "db2 get db cfg for sample" | grep "Path"
Path to log files = /home/db2inst1/db2inst1/NODE0000/SQL00001/SQLOGDIR/
Path to log files = /home/db2inst1/db2inst1/NODE0001/SQL00001/SQLOGDIR/
Path to log files = /home/db2inst1/db2inst1/NODE0002/SQL00001/SQLOGDIR/
Path to log files = /home/db2inst1/db2inst1/NODE0003/SQL00001/SQLOGDIR/
这里假设将各分区的归档日志文件对应复制到 /sampnew 下,因前滚命令仅可在编目分区上执行,所以在编目分区上前滚到日志文件尾并结束前滚状态的命令应写为:
db2 "rollforward db sampnew to end of logs and complete overflow log path
(/sampnew/NODE0000/SQL00001/SQLOGDIR,
/sampnew/NODE0001/SQL00001/SQLOGDIR on dbpartitionnum 1,
/sampnew/NODE0002/SQL00001/SQLOGDIR on dbpartitionnum 2,
/sampnew/NODE0003/SQL00001/SQLOGDIR on dbpartitionnum 3,
)"
注:对于0号分区,在 OVERFLOW 选项中不能使用“ON DBPARTITIONNUM 0”的子句,否则会遇到:
SQL0104N An unexpected token "on" was found following "
的报错,表明命令语法不正确。
至此,我们完成了对已启用前滚恢复模式的 DB2 分区数据库 SAMPLE,利用 BACKUP 命令进行联机备份,并使用 RESTORE 和 ROLLFORWARD 命令恢复至一个新数据库 SAMPNEW 的举例介绍。