ITPub博客

首页 > Linux操作系统 > Linux操作系统 > db2 前滚操作中几个时间戳的问题

db2 前滚操作中几个时间戳的问题

原创 Linux操作系统 作者:jinlonglv 时间:2011-05-31 12:56:14 0 删除 编辑
介绍与DB2的数据库前滚恢复操作相关的两个时间点:前滚的最小恢复时间,和前滚操作结束要求的最小恢复时间,以及如何在前滚命令中使用 UTC 或本地时间,如何获取 UTC 等,以帮助用户了解DB2前滚操作中时间戳指定上应该注意的一些事项。

对于DB2数据库,若启用了 LOGRETAIN 或 USEREXIT 使数据库使用归档日志模式,则数据库的恢复操作将会涉及到前滚恢复的操作,也就是说,需要在前滚时指定数据库要恢复到的时间点的时间戳记,以便DB2前滚该时间戳之前归档日志中的所有事务,满足用户对数据库恢复操作的要求。为帮助用户在使用前滚命令(ROLLFORWARD)时指定准确的时间戳参数,这里介绍几个值得注意的事项。(为简化过程的说明,这里仅以前滚数据库的命令进行举例说明,而没有例举前滚表空间的命令)。

一. 前滚的最小恢复时间:

该时间为系统目录表对表空间或其中表的最后一次更新操作的时间戳记,也就是任何 ROLLFORWARD 命令要成功执行(不一定是前滚结束或完成)必须恢复到的(最早落实的事务的)时间戳。这一时间戳记可通过 LIST TABLESPACES SHOW DETAIL 取得,例如要获取 SAMPLE 数据库的 USERSPACE1 表空间的前滚最小恢复时间,可执行:

db2 list tablespaces show detail

:
表空间标识 = 2
名称 = USERSPACE1
:
最小恢复时间 = 2005-10-27 16:07:39.000000

也就是说该数据库的前滚恢复操作所要恢复的最小恢复时间点为 2005-10-27-16.07.39.000000。

另外,还可通过对表空间进行快照,从输出结果中同样可以得到该信息:

db2 get snapshot for tablespaces on sample

表空间名 = USERSPACE1
:
最小恢复时间 = 2005-10-27 16:07:39.000000

此外,SNAPSHOT_TBS_CFG 表函数所返回的表的 MIN_RECOVERY_TIME 字段中的值也为该最小恢复时间。DB2 所提供的 SNAPSHOT_TBS_CFG 表函数可通过对表空间的快照获取表空间的配置信息,例如:

db2 "select substr(tablespace_name,1,15) as tablespace_name, min_recovery_time from table (snapshot_tbs_cfg('SAMPLE',-1) ) as a"

TABLESPACE_NAME MIN_RECOVERY_TIME
--------------- --------------------------
:
USERSPACE1 2005-10-28-00.07.39.000000
:

此时我们会发现,虽然同样是“最小恢复时间”,但两种方法取得的时间戳记却不相同,之间相差了8个小时,这里暂且放下这个疑问,我们将在下面对这个问题加以说明。

对于该最小恢复时间为 2005-10-27-16.07.39.000000 的 SAMPLE 的数据库,前面已提到,任何 ROLLFORWARD 命令要成功完成都至少前滚过到或前滚过这个时间点,因此无论用户发出前滚到任何早于该时间点的 ROLLFORWARD 命令,返回的“上次落实的事务”中的时间戳都会是该时间戳。如前滚到 2000 年某时间点的提示信息如下:

db2 "rollforward db sample to 2000-10-28-00.09.00.000000"

前滚状态

输入数据库别名 = sample
节点数已返回状态 = 1

节点号 = 0
前滚状态 = DB 工作
下一个要读取的日志文件 = S0000003.LOG
已处理的日志文件 = S0000000.LOG - S0000001.LOG
上次落实的事务 = 2005-10-27-16.07.39.000000

从输出结果中再次验证了,任何早已该时间点的前滚命令都将恢复到该时间点。

二. 前滚操作中的两种不同的记时方式:

上面提到在使用两种不同的方法获取前滚最小恢复时间时,所得到的两个时间戳记竟然不相同,难道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 命令前滚至需要的时间点。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24177460/viewspace-696757/,如需转载,请注明出处,否则将追究法律责任。

下一篇: linux变量的使用
请登录后发表评论 登录
全部评论

注册时间:2010-07-01

  • 博文量
    14
  • 访问量
    28336