技术开发 频道

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 命令前滚至需要的时间点。

0
相关文章