修改数据库安装的服务器 系统时间,修改Oracle DB 服务器系统时间与 SCN 关系的研究...

以往工作中曾经出现过数据库服务器系统时间向以前修改了3 个月(例如从 13 年改成 12 年),这时再启动数据库时就会报ora-600 的错误。下面对数据库服务器的修改时间与SCN的关系做实验研究。

一、首先进行一个测试

1.关闭 DB

f098ac9f671f6d0b6740bbc409bad08f.png

2.   修改系统时间

(1) 现在时间

98def2ed4b7c1cbdded6ba1321a24ad5.png

(2)修改时间

将时间往前调整一下:

[root@singledb ~]# date -s 1/1/2015

THU Jan 1 00:00:00 EST 2015

c6cf8255e9a2b5acac0c38e6a618ef3a.png

(3)重新启动数据库

adf7336649717a21858e3675b9ecafd2.png

启动的时候并没有问题。

二、修改数据库服务器系统时间与数据库 SCN 的关系

通过前面的分析,我们可以看出修改系统时间和 SCN 没有直接的关系。但是如果不是特殊情况,我们不建议修改系统时间。系统稳定是第一位的,特别是在 RAC 环境,对时间要求更加严格。

虽然修改系统时间和 SCN 没有直接影响,但在测试中,发现它们之间是有联系的。下面进一步实验。

319742f56a9f1c2835ebf465346bae0e.png

系统中由SMON进程维护一张表SMON_SCN_TIME,这张用于记录过去时间段中SCN(system change number)与具体的时间戳(timestamp)之间的映射关系,因为这种映射关系,所以SMON_SCN_TIME可以较为粗糙地(不精确地)定位某个SCN的时间信息。

查看smon_scn_time的信息

ec3ca19ddcaa07d87512f7620a39b0c6.png

查看系统SCN号

f45731abdef21d51a35c881b34345255.png

从上面的几个查询结果我们发现二个问题:

(1) smon_scn_time 表中的 SCN(1972507) 小于系统当前的 SCN 值(1976352)。

(2) smon_scn_time 表中最后更新时间(2015-03-31 17:10:38)大于系统当前时间( 2015-01-1 00:03:03)。

由此我们推出一个结论: 当 smon_scn_time 最后更新时间大于系统时间时,SMON 不会将 SCN 与 TIMESTAMP 的映射结果写入到 sys.smon_scn_time 表中。

如果SCN与timestamp的映射不能写入到 smon_scn_time 表中,就不能进行 SCN 与 TIMESTAMP 转换,就不能利用 timestamp 进行相关的操作。

为了验证上面的结论,我们把系统改成大于 smon_scn_time 最后更新时间,再查看smon_scn_time和scn

fe1488e68ca55eb3a28ec39005596cb4.png

e92e32d35262fa15cd3481a204d746e9.png

这次成功写入 smon_scn_time 表。 由此可见:

(1)系统时间往后改(如从 2015 年1月改到 2015 年5月),对数据库没有影响,但某些应用可能会受影响。

(2)系统时间往前改(如从2015 年4月改到 2015 年1月),那么SMON不会将SCN与timestamp写入smon_scn_time 表。所以对于生产系统,在系统上线之前就应该校对好服务器时间,本着稳定第一的原则,上线之后不建议再修改DB服务器的时间。