手工增量复原示例数据库DB2TEST1
假如备份映像有N个,我们一般会执行N+1次复原才能完成整个复原操作。在手工复原期间,用户必须对复原涉及的每个映像手工发出复原命令,按照以下顺序完成此操作:最后一个、第一个、第二个、第三个,依次类推,并且包括最后一个映像。
首先对时间点最靠后(是按照时间轴的方向往后,靠近现在的时间方向是后)的增量备份映像进行复原操作,此映像也被称为增量复原的目标映像,因为它还要成为要复原的最后映像。增量目标映像是使用RESTORE DATABASE命令中的TAKEN AT参数指定的。接下来复原最新的完整数据库或表空间映像以建立一个基线,以根据它来应用每个后继的增量备份映像。 按产生的顺序,在复原的基线映像的顶部,复原需要的各个完整增量备份映像或表空间增量备份映像。依次对各个映像进行复原,直到最后一个备份映像读了两次。在整个增量复原操作期间会访问两次目标映像。在第一次访问期间,只从映像读取初始数据,而不读取任何用户数据。只在第二次访问期间才读取并处理完整的映像。必须访问两次增量复原操作的目标映像,以确保数据库最初是使用正确的历史记录、数据库配置以及将在复原操作期间创建的数据库表空间定义来配置的。如果自从进行了最初的完整数据库备份映像以来已删除了表空间,将从备份映像中读取该映像的表空间数据,但在增量复原处理期间会忽略该数据。
下面我们采用手工的方式复原示例数据库DB2TEST1,所使用的备份映像有
l 联机备份映像(时间戳20070929094546),包含了日志文件S0000008.LOG。
l 联机增量备份映像(时间戳20070929094818),包含了日志文件S0000010.LOG。
l 联机差异备份映像(时间戳20070929095249),包含了日志文件S0000012.LOG。
在DB2CLP窗口中,因为最后一个增量备份映像是联机差异备份映像(时间戳为20070929095249),所以我们将首先对差异备份映像执行复原操作,通过使用RESTORE DATABASE命令的TAKEN AT timestamp选项来指定目标映像。首先进入到C:\DB2\NODE0000\SQL00002\SQLOGIDR\中,此路径是示例数据库DB2TEST1的活动日志目录。在此目录下,删除所有的日志文件。注意,生产系统不能删除活动日志,否则数据库会宕机。本示例是为了演示如何还原数据库,删除日志后随即执行还原,为了更清晰的看到如何利用备份文件中的日志进行还原,故删除了以前的活动日志。通过使用RESTORE DATABASE命令进行复原,具体如清单25所示:
- - 清单25 .手工增量复原第一步,对最后一个备份映像进行复原
C:\> db2 restore db db2test1 incremental taken at 20070929095249 logtarget C:\DB2\NODE0000\SQL00002\SQLOGDIR
SQL2539W 警告!正在复原至与备份映像数据库相同的现有数据库。数据库文件将被删除。
要继续吗?( y / n ) y
DB20000I RESTORE DATABASE命令成功完成。
如清单25所示,还原的过程中,会提示“正在复原至与备份映像数据库相同的现有数据库。数据库文件将被删除。是否要继续?”这时候选择y,也就是“是”的意思,回车。在命令中需要注意INCREMENTAL选项,此选项表示我们进行的复原是增量复原。另外,LOGTARGET选项,指定从备份映像文件(时间戳为20070929095249)导出日志文件到此路径中。如果指定了LOGTARGET选项,在执行RESTORE DATABASE命令时,DB2将把日志文件放到指定的路径中,如果目标路径中已经存在同名的日志文件,复原操作将失败并返回一个错误。如果未指定LOGTARGET选项,则不会从备份映像中还原任何日志文件。
如果指定了LOGTARGET选项,但是备份映像中没有包含任何日志文件,则在尝试复原操作时会返回一个错误。如果指定了无效或只读的路径,复原操作会报SQL2581N错误。在指定LOGTARGET选项条件下,复原数据库或表空间的过程中,如果不能抽取一个或多个日志文件,则复原操作失败并返回错误。还可以选择只复原保存在备份映像中的日志文件。要执行此操作,可使用RESTOREDATABASE命令的LOGTARGET选项指定LOGS选项。以此方式复原日志文件时,如果复原操作遇到任何问题,则复原操作失败并返回错误。
下面我们对联机全量备份映像(时间戳20070929094546)进行复原操作,在DB2CLP窗口中,发出RESTORE DB命令,具体如清单26所示:
- - 清单26 .手工增量复原第二步,对第一个备份映像进行复原
C:\> db2 restore db db2test1 incremental taken at 20070929094546 logtarget C:\DB2\NODE0000\SQL00002\SQLOGDIR
DB20000I RESTORE DATABASE命令成功完成。
命令成功完成,这样就把联机备份映像中的S0000008.LOG日志文件释放到了C:\DB2\NODE0000\SQL00002\SQLOGIDR\目录中。RESTORE语句中的INCREMENTAL作用同上,还是表示增量复原的意思。
执行完对第一个备份映像的复原后,紧接着需要对第二个备份映像进行复原,我们第二个备份映像是联机增量备份映像(时间戳为20070929094818)。在DB2CLP窗口中,继续发出RESTORE DB命令,具体如清单27所示:
- - 清单27 .手工增量复原第三步,对第二个备份映像进行复原
C:\> db2 restore db db2test1 incremental taken at 20070929094818 logtarget C:\DB2\NODE0000\SQL00002\SQLOGDIR
SQL2580W 警告!将这些日志复原至包含现有日志文件的路径。在复原期间试图覆盖现有日志文件将导致复原操作失败。
要继续吗?( y / n ) y
DB20000I RESTORE DATABASE命令成功完成。
命令成功完成,如清单27所示,在还原的过程中,会提示“SQL2580W警告!将这些日志复原至包含现有日志文件的路径。在复原期间试图覆盖现有日志文件将导致复原操作失败。是否要继续?”这时候选择Y,也就是“是”的意思,回车。
这样就把联机备份映像中的S0000010.LOG日志文件释放到了C:\DB2\NODE0000\SQL00002\SQLOGIDR\目录中。
当对第二个备份映像复原完成后,接着就需要对第三个、第四个,...最后一个备份映像进行复原,由于我们第三个备份映像就是最后一个备份映像,所以我们在DB2CLP窗口中,发出RESTORE DB命令,对差异备份映像(时间戳20070929095249)进行复原操作,具体如清单28所示:
- - 清单28 .手工增量复原第四步,对第三个备份(也是最后一个)映像进行复原
C:\> db2 restore db db2test1 incremental taken at 20070929095249 logtarget C:\DB2\NODE0000\SQL00002\SQLOGDIR
SQL2580W 警告!将这些日志复原至包含现有日志文件的路径。在复原期间试图覆盖现有日志文件将导致复原操作失败。
要继续吗?( y / n ) y
DB20000I RESTORE DATABASE命令成功完成。
命令成功完成,如清单28所示,还原的过程中,会提示“SQL2580W 警告!将这些日志复原至包含现有日志文件的路径。在复原期间试图覆盖现有日志文件将导致复原操作失败。是否要继续?”这时候选择y,也就是“是”的意思,回车。
这样就把联机备份映像中的S0000012.LOG日志文件释放到了C:\DB2\NODE0000\SQL00002\SQLOGIDR\目录中。由于归档日志情况下的利用联机备份映像还原必须进行前滚恢复,所以接下来我们对示例数据库DB2TEST1进行前滚恢复。
在DB2CLP窗口中发出ROLLFORWARD DB命令,把日志往前滚动到日志的末尾,具体如清单29所示:
- - 清单 29 .对示例数据库DB2TEST1进行前滚恢复
C:\> db2 rollforward db db2test1 to end of logs and stop
前滚状态
输入数据库别名 = db2test1
节点数已返回状态 = 1
节点号 = 0
前滚状态 = 未暂挂
下一个要读取的日志文件 =
已处理的日志文件 = S0000012.LOG - S0000013.LOG
上次落实的事务 = 2007-09-29-01.52.49.000000 UTC
DB20000I ROLLFORWARD命令成功完成。
至此,对示例数据库DB2TEST1的复原工作全部完成。一共执行了4次恢复命令,使用了3个备份映像(联机全量备份映像、联机增量备份映像、联机差异备份映像)。实际上,我们在生产环境指定策略的时候,一般会在一个比较长的时间点进行全量备份,在一个相对较长的时间点进行增量备份,在一个比较短的时间点进行差异备份。比如,我们可以每个月底的最后一天晚上进行全量备份,每个月的月中进行增量备份,每天晚上进行差异备份,这样既保证了数据库的数据安全,又保证了不会占用太多的存储空间来保存备份映像文件。
在实际的复原过程中,如果在中间的步骤碰上错误,可以发出指定了INCREMENTALABORT选项的RESTOREDATABASE命令。这将清除所有余下的资源,以便以后可以继续手工增量复原。
此时我们在DB2CLP窗口中,连接上示例数据库DB2TEST1,查看示例表TEST1,可以看到我们在差异备份之前插入的数据所有记录都已经成功恢复,具体如清单30所示:
- - 清单 30 .查看示例表TEST1
C:\> db2 connect to db2test1
数据库连接信息
SQL 授权标识 = RHETTE
本地数据库别名 = DB2TEST1
C:\> db2 select * from test1
ID NAME NOTE
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1 RHETTE the first rows
2 DANIEL the second rows
3 SCA the third rows
4 Danaus the forth rows
5 Martin the fifth rows
6 Scott the sixth rows
7 slave the seventh rows
8 New York the eighth rows
9 Houston the ninth rows
9 条记录已选择。