关于DB2数据库的恢复(Rebuild)
当我们的 DB2 数据库由于一些严重错误 ( 如存储损坏等 ) 而导致数据库库损坏时,我们通常需要在修复相关错误后,通过 Restore 命令来进行数据库的恢复 (DB2 目前也支持通过 HADR 等多机容错机制实现系统高可用,本文仅对单机数据库损坏,需要进行数据库恢复的情况进行探讨 )。一般的做法是通过以前的数据库全备份来进行整库恢复,然后通过日志对数据库进行前滚 (RollForward),从而使数据库恢复到接近灾难点的时间。但当我们数据库的数据量较大时,数据库的全备份和整库恢复都会很是非常消耗时间的。
在 DB2 V9 版本中,提供了一个重要的新特性,即利用 DB2 表空间的备份来快速恢复数据库,甚至可以根据数据的重要性选择恢复一部分重要数据,达到快速恢复的目的。本文结合实例对 DB2 V9 的该重要技术特性做了详细介绍,希望对用户规划系统备份 / 恢复策略有所帮助。
场景1:利用表空间备份来重建整个 DB2 数据库
在进行数据库重建时,DB2 V9 现在能够支持通过表空间一级的备份来重建整个数据库,而不需要整个数据库的全备份。DB2 的此项能力使得我们对核心系统的重要数据进行快速备份和恢复成为可能。让我们首先看以下的一个例子:
假设我们有一个数据库 TEST,该数据库采用归档日志。某天,系统突然掉电,导致数据库存放的磁盘损坏了。这时,数据库将处于不可用的状态,作为 DBA,我们需要迅速对数据库进行恢复。假如该数据库有以下的表空间:
◆SYSCATSPACE ( 系统表空间 )
◆USERSPACE1 ( 用户数据表空间 1)
◆USERSPACE2 ( 用户数据表空间 2)
◆USERSPACE3 ( 用户数据表空间 3)
你手头可用于进行数据库恢复的数据包括 :
所有数据库日志文件由于日志被存放在另外的磁盘上 ( 而且很多时,我们还会对日志进行镜像,因为它们实在太重要了 ),因此它们没有损坏。
你没有数据库的全备份,但是你有以下的表空间备份:
◆TEST.3.DB2.NODE0000.CATN0000.20060515135047.001 - SYSCATSPACE 和 USERSPACE 1 表空间在 2006051513504 7 时间点的备份;
◆TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 - USERSPACE 2 和 USERSPACE 3 表空间在 2006051613513 6 时间点的备份;
◆TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 - USERSPACE 3 表空间在 2006051713520 8 时间点的备份。
对于传统的 Restore 和 Rollforward 的 DB2 恢复策略,我们需要一个数据库的全备份影像来进行数据库恢复然后利用日志来进行数据库的前滚 (Rollforward) 操作,但不幸的是,在本例中,我们并没有数据库的全备份,而只有不同时间做的表空间备份。
错误的数据库恢复方法
如果我们试图直接用表空间备份来恢复整个数据库,我们会得到以下的错误提示:
清单1 :直接用表空间备份来恢复整个数据库的错误提示
db2 restore db test taken at 20060517135208
SQL2560N The target database is not identical to the source database
for a restore from a table space level backup.
上述命令支持完整数据库备份的数据库恢复,不支持表空间级别的数据库恢复。
利用表空间备份恢复数据库
在 DB2 V9 中,提供了一个新的功能,就是通过表空间备份和日志来快速重建整个 DB2 数据库,这个功能是通过在 RESTORE DATABASE 命令中加入 REBUILD 选项来实现的。
以下的步骤帮助我们通过 REBUILD 选项来利用表空间备份恢复 TEST 数据库:
第一步,我们利用表空间备份执行带 REBUILD 选项的 RESTORE DATABASE 命令恢复数据库。
清单2:通过 REBUILD 选项来利用表空间备份恢复 TEST 数据库
db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
这一步我们是从已有的几个表空间备份影像中选取一个备份来进行数据库恢复。一般,我们会选取最近备份的表空间影像,这个备份影像我们称之为“目标影像”(Target Image),因为它包含了我们用于恢复 TEST 数据库所需的最新的表空间备份、数据库配置参数、日志序列等重要信息。实际上,这个“目标影像”可以是任何一种备份 ( 全备份、表空间备份、增量备份、在线或离线的备份 )。在本例中,最近的一个备份影像是 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001,因此我们就选取它作为我们进行数据库恢复的“目标影像”。
当我们执行完上述 RESTORE 命令之后,TEST 数据库的结构将被重建和恢复。我们可以得到数据库的参数和其备份历史之类的信息。如果我们发出 LIST HISTORY 命令 ( 如:LIST HISTORY ALL FOR TEST),我们将得到以下的输出(参照清单 3) 。
清单3 :使用 LIST HISTORY查询数据库备份历史信息
Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log Backup ID
-- --- ------------------ ---- --- ------------ ------------ --------------
R D 20060519121107001 F 20060517135208
---------------------------------------------------------------------------
Contains 1 tablespace(s):
00001 USERSPACE3
---------------------------------------------------------------------------
Comment: RESTORE TEST WITH RF
Start Time: 20060519121107
End Time: 20060519121108
Status: A
---------------------------------------------------------------------------
EID: 7 Location:
Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log Backup ID
-- --- ------------------ ---- --- ------------ ------------ --------------
R P 20060519121108001 F 20060515135047
---------------------------------------------------------------------------
Contains 2 tablespace(s):
00001 USERSPACE1
00002 SYSCATSPACE
---------------------------------------------------------------------------
Comment: RESTORE TEST WITH RF
Start Time: 20060519121108
End Time: 20060519121113
Status: A
---------------------------------------------------------------------------
EID: 8 Location:
Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log Backup ID
-- --- ------------------ ---- --- ------------ ------------ --------------
R P 20060519121113001 F 20060516135136
---------------------------------------------------------------------------
Contains 1 tablespace(s):
00001 USERSPACE2
---------------------------------------------------------------------------
Comment: RESTORE TEST WITH RF
Start Time: 20060519121113
End Time: 20060519121114
Status: A
---------------------------------------------------------------------------
EID: 9 Location:
Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log Backup ID
-- --- ------------------ ---- --- ------------ ------------ --------------
R D 20060519121107 R S0000001.LOG S0000003.LOG 20060518135208
---------------------------------------------------------------------------
Contains 4 tablespace(s):
00001 USERSPACE3
00002 USERSPACE2
00003 USERSPACE1
00004 SYSCATSPACE
---------------------------------------------------------------------------
Comment: REBUILD TEST WITH RF
Start Time: 20060519121107
End Time: 20060519121115
Status: A
---------------------------------------------------------------------------
EID: 10 Location:
如上,LIST HISTORY 命令产生了 4 条输出条目 (EID 7 – EID 10),它们都和我们数据库的恢复有关。第一个条目,EID 7,包含了在 20060517135208 时间点做的备份影像,该备份影像中我们只对 USERSPACE3 做了备份。然而,回顾我们进行数据库恢复时发出的命令,参照清单 4。
清单4:使用 ALL TABLESPACES 参数恢复数据库
db2 restore db test rebuild with all tablespaces in database taken at 20060517135208
我们使用了 ALL TABLESPACES 参数要求恢复所有的表空间,所以 DB2 会利用 LIST HISTORY 中所看到的其它备份影像来恢复数据库其它的表空间 ( 注意,在使用 TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 备份影像进行恢复时 EID=9,虽然该影像包括 USERSPACE2 和 USERSPACE3 的备份,但 DB2 只恢复了 USERSPACE2,因为 USERSPACE3 已经通过更新的备份影像 TEST.3.DB2.NODE0000.CATN0000.20060517135208.001 完成恢复了 )。在完成上述恢复后,表空间将处于 ROLL-FORWARD 状态。通过 LIST HISTORY 命令,我们可以看到表空间都被置成了 WITH RF 标志,表明这些表空间处于 ROLL-FORWARD 状态。另外,为了使该恢复顺利完成,所有备份影像都需要放在 HISTORY FILE 所表明的备份路径下,否则 DB2 将会给出一个无法找到备份影像的错误提示。
第二步,通过 ROLLFORWARD DATABASE 命令及 TO END OF LOGS 选项来前滚数据库 TEST,使其恢复到最近的一个同步时间点 (Point in Time)。
清单5 :前滚数据库到最近的一个同步时间点
db2 rollforward db test to end of logs
当所有表空间恢复完毕,它们将处于 rollforward pending 的状态,我们需要通过数据库日志和 rollforward 命令来对数据库进行前滚操作,从而将数据库置为正常 (Normal) 状态。
为了顺利完成前滚操作,从上述备份影像最早一个时间点到最近一个时间点之间的数据库日志必须存在,以用于将上述通过不同时间点备份影像进行恢复的表空间前滚到同一时间点上。本例中,从 20060515135047 到 20060517135208 时间点的日志必须存在,我们才可以将表空间同步到同一个时间点。如果我们还想继续前滚数据库,则我们还需要从 20060517135208 时间点往后的日志文件。
在本例中,我们假设这些日志文件都能够在 LOGPATH 数据库配置参数所指定的目录中找到,如果它们被移动了位置,则我们还需要在 ROLLFORWARD 命令中通过 OVERFLOW LOG PATH 选项来指定这些日志文件的新位置。
第三步,通过执行 ROLLFORWARD DATABASE 命令来结束数据库前滚的状态。
清单6:结束数据库前滚的命令
db2 rollforward db test stop
该命令执行完毕后,TEST 数据库就恢复到 NORMAL 状态,这样您就可以正常使用它了。
场景2:通过表空间备份快速重建数据库,恢复重要数据
通过上面的例子,我们知道 DB2 V9 现在支持通过不同时间做的不同表空间的备份来重建和恢复整个数据库,这个强大的新特性无疑给我们考虑备份 / 恢复策略时带来了很多新的启发。
下面我们将进一步对这个特性进行探讨。让再我们回到上一个例子,我们假设 TEST 数据库是一个重要的记录在线交易的数据库,其中,USERSPACE1 和 USERSPACE2 表空间存放了在线交易所需要的全部重要数据,而 USERSPACE3 表空间存放的则是部分历史数据,主要用于历史查询,数据量较大,而其重要性相对较低。
恢复表空间 USERSPACE1 和 USERSPACE2 的数据
一旦我们的数据库系统发生故障,如果我们需要恢复全部 3 个表空间,则由于 USERSPACE3 数据量较大,导致恢复速度缓慢。我们所希望的是,首先能够快速恢复 USERSPACE1 和 USERSPACE2 表空间的数据,快速恢复在线交易;然后我们再在合适的时机,恢复 USERSPACE3 表空间的历史数据。下面,让我们看看如何实现我们的想法。
第一步,通过发出 RESTORE DATABASE 命令和 REBUILD 选项,告诉 DB2 首先恢复 USERSPACE1 和 USERSPACE2 表空间。
清单7 :恢复表空间 USERSPACE1 和 USERSPACE2 方法一
db2 restore db test rebuild with tablespace (SYSCATSPACE,USERSPACE1,USERSPACE2)
taken at 20060516135136
尽管我们希望只恢复 USERSPACE1 和 USERSPACE2 表空间,但 SYSCATSPACE 系统表空间是必须的,否则 DB2 无法正常工作。上述命令中指定的“目标影像”TEST.3.DB2.NODE0000.CATN0000.20060516135136.001 包含了 USERSPACE2 和 USERSPACE3 表空间的备份。这是我们所有备份影像中最近的包含 USERSPACE2 和 USERSPACE3 表空间备份的影像。需要注意的是,尽管 20060517135208 才是时间最近的一个备份影像,但它不包括 USERSPACE1, USERSPACE2, 或 SYSCATSPACE 表空间备份,因此我们不会用它来进行恢复。
以下的命令可以达到同样的效果。
清单8: 恢复表空间 USERSPACE1 和 USERSPACE2方法二
第二步,执行 ROLLFORWARD DATABASE 命令和 TO END OF LOGS 选项来前滚数据库到最近的一个同步时间点。
清单9:前滚数据库
db2 rollforward db test to end of logs
第三步,发出 ROLLFORWARD DATABASE 命令和 STOP 选项来停止前滚 。
清单10:停止数据库前滚
db2 rollforward db test stop
当然,你也可以选择将数据库前滚到某个时间点,而不是日志的末尾,但该时间点必须是你备份影像时间点之后的某个时间点。上述命令执行完毕后,数据库就可以正常使用,而且 USERSPACE1 和 USERSPACE2 也可以正常访问了。USERSPACE3 仍然处于 RESTORE PENDING 状态,你可以选择迟一点的某个时间来恢复它。
恢复表空间 USERSPACE3的数据
第一步,执行 RESTORE DATABASE 命令来恢复表空间 USERSPACE3 的数据。
清单11 :恢复表空间USERSPACE3
db2 restore db test tablespace (USERSPACE3) taken at 20060517135208
第二部,执行 ROLLFORWARD DATABASE 和 TO END OF LOGS 选项来前滚 USERSPACE3 表空间。
清单12 :前滚表空间 USERSPACE3
db2 rollforward db test to end of logs tablespace (USERSPACE3)
第三步, 发出 ROLLFORWARD DATABASE 命令和 STOP 选项结束 USERSPACE3 的前滚。
清单13:结束表空间 USERSPACE3 的前滚
db2 rollforward db test stop
现在,TEST 数据库的所有 4 个表空间都可以正常使用了。
通过上面的两个例子,我们学习了如何通过部分或全部表空间级的备份来重建和恢复整个数据库,或根据数据的重要性和优先级来分步重建和恢复数据库。
这个特性可以有效的减小我们数据备份的时间,我们可以按照不同频率来有选择的备份不同重要性的表空间,而不是整个数据库。这个特性同样可以缩短我们进行系统恢复的时间,我们可以根据数据的重要性,分步来恢复数据库,而不需要一次恢复整个数据库。最后,值得提醒的是,为了使用这个很好的特性,数据库的日志和 SYSCATSPACE 系统表空间的备份仍然是至关重要不可缺少的。