DB2的数据库前滚恢复操作
二. 前滚操作中的两种不同的记时方式:
上面提到在使用两种不同的方法获取前滚最小恢复时间时,所得到的两个时间戳记竟然不相同,难道DB2出问题了吗?实际上两种方法获得的时间是完全相同的,只是由于使用的计时方式不同而已。
SNAPSHOT_TBS_CFG 表函数返回的时间戳使用的是本机所设时区的本地时间,而 GET SNAPSHOT 所返回的时间戳使用的是 UTC(Coordinated Universal Time, 也为 GMT),即标准世界时,与“格林威治标准时间”是一样的,使用此计时方式时,不用考虑不同的时区。两种计时方式都可用于DB2前滚命令中的前滚时间戳参数,缺省情况下使用的是 UTC 方式,如果要使用本地时间戳记,必须在时间戳后加上 USING LOCAL TIME 的选项。
为获得时区设置为中国的本地时间与 UTC 时间之间的时差,可通过专用寄存器 CURRENT TIMEZONE 的返回值实现:
db2 "values(CURRENT TIMEZONE)"
1
--------
80000.
这表示它们之间的时差为+8小时,即 UTC 时间加上8个小时为中国这一时区的时间。
在 ROLLFORWARD 命令中,如果使用了 USING LOCAL TIME,返回的结果中显示的时间戳也将使用本地计时方式,如上述的 ROLLFORWARD 命令在使用了该选项后返回的结果会变为:
db2 "rollforward db sample to 2000-10-28-00.09.00.000000 using local time"
前滚状态
输入数据库别名 = sample
节点数已返回状态 = 1
节点号 = 0
前滚状态 = DB 工作
下一个要读取的日志文件 = S0000003.LOG
已处理的日志文件 = S0000000.LOG - S0000001.LOG
上次落实的事务 = 2005-10-28-00.07.39.000000
两个命令输出的时间戳正好相差8个小时。
三. 前滚操作结束要求的最小恢复时间:
对于启用了前滚恢复方式的数据库,若在执行 RESTORE 恢复数据库备份映象文件时未使用 WITHOUT ROLLING FORWARD 选项,则还必须使用 ROLLFORWARD 命令完成前滚操作之后,才可令数据库可用。此外,在 RESTORE 之后,如果前滚命令没有使用 STOP 或 COMPLETE 选项结束前滚暂挂状态,则运行多次执行前滚操作,直到看到命令返回的时间戳满足了用户的前滚时间点的要求为止,然后再发出前滚结束命令结束前滚暂挂,使数据库可被连接。
DB2对结束前滚的操作有一个最小恢复时间的要求,即当 ROLLFORWARD 命令中使用了 STOP/COMPLETE 选项结束前滚暂挂状态时,当前前滚到的时间点必须大于该最小恢复时间。可利用:
db2 rollforward db sample [query status]
取得前滚已落实的事务的时间戳。由于前滚之前的 RESTORE 恢复的备份映象,前滚结束的时间晚于备份操作开始的时间。使用 LIST HISTORY 的命令,可以返回关于所恢复的备份映象当初备份的相关时间信息:
db2 list history backup all for sample
:
Op 对象 时间戳记+序列 类型 设备 最早日志 当前日志 备份标识
-- --- ------------------ ---- --- ------------ ------------ --------------
B D 20051028231749001 F D S0000000.LOG S0000000.LOG
----------------------------------------------------------------------------
包含 6 表空间:
00001 SYSCATSPACE
00002 USERSPACE1
:
----------------------------------------------------------------------------
注释:DB2 BACKUP SAMPLE OFFLINE
开始时间:20051028231749
结束时间:20051028231835
状态:A
----------------------------------------------------------------------------
EID:8 位置:D:\SAMPLE.0\DB2\NODE0000\CATN0000\20051028
因此,当试图使用早于最小恢复时间点的时间戳结束前滚操作时,会遇到如下 SQL1275N 的报错:
db2 "rollforward db sample to 2005-10-28-00.09.00.000000 using local time and stop"
SQL1275N 前滚的停止时间必须大于或等于 "2005-10-28-23.18.25.000000",因为节点 "0" 上的数据库 "SAMPLE" 中包含比指定时间更新的信息。
注意错误提示中,由于命令使用了 USING LOCAL TIME,返回的时间戳“2005-10-28-23.18.25.000000”即为本地计时方式的,该时间晚于备份开始的时间戳 2005-10-28-23.17.49,保险起见应指定晚于备份结束的时间。要获得精确的前滚操作结束要求的最小恢复时间,可在当前前滚到的时间点未满足该最小恢复时间的情况下,利用 ROLLFORWARD 命令加 STOP/COMPLET 选项,从 SQL1275N 的提示中获取,以成功结束前滚暂挂状态。
需要一提的是,虽然在使用 STOP/COMPLETE 结束前滚暂挂操作前可多次执行 ROLLFORWARD 命令,但每个前滚命令中指定的时间戳记不能早于前一个前
滚命令中使用的时间戳记,也就是说,多次前滚操作的时间是不可逆的,只能越来越晚,否则同样会遇到报错:
db2 "rollforward db sample to 2005-10-28-00.09.00.000000"
SQL1266N 数据库 "SAMPLE" 已前滚至 "2005-10-29-00.09.00.000000",它超过了指定的时间点。
这表明当上一次前滚命令已前滚至 2005-10-29-00.09.00.000000 后,再试图前滚到比这个时间点更早的时间点 2005-10-28-00.09.00.000000 的尝试将会遇到 SQL1266N 的报错,只有在 2005-10-29-00.09.00.000000 之后的时间点才是后续 ROLLFORWARD 命令的有效前滚时间点。如果的确有前滚到更早时间点的需要,则必须在重新发出 RESTORE 命令后,再次利用 ROLLFORWARD 命令前滚至需要的时间点。