1. 概述

闰秒是一个一秒的调整,具体涉及到地球公转速度等天文计算。简单来讲呢,就是地球越转越慢,而世界时钟的速度恒定不变。那样会发生什么问题呢,世界时钟一天已经过完,而地球自转一周还没完成呢。所以就要把世界时钟拨慢点,等等地球自转。当然地球自转这个慢是很细微的,不会是等几十年以后就不转了。为什么标题要用“又”字呢,因为闰秒已经来过很多次了,闰秒从1972年实施,到现在已经插入了26个闰秒,最近的在2015年6月30日的23:59:60 UTC,下一个闰秒将插入2016年12月31日23:59:60 UTC。

闰秒一般在所选择的UTC日期(一个月的最后一天,通常是6月30日或12月31日)的23:59:59和下一天的00:00:00之间插入正的闰秒,此闰秒在UTC时钟显示为23:59:60。负闰秒会在所选月份的最后一天插入第二个23:59:59,负闰秒就很难见到啦,除非让地球转快点。

2. 闰秒对计算机行业的影响

闰秒主要对计算机系统有影响,闰秒的23:59:60秒,没法用计算机系统的POSIX时间表示。如果对闰秒不做防护,这时侯计算机系统表现的情况就是CPU使用率超高,严重时造成宕机,进而影响业务系统的正常对外服务,然后就是买不了票啦,网站打不开啦,等等问题。闰秒不会对我们身心造成直接的影响,但是通过对计算机行业的影响,进而影响了我们生活的方方面面,现在我们还能离开计算机吗?

为什么闰秒可以大范围地影响计算机系统,这就要说时间服务器啦。大家都知道,如果一台没有联网的计算机,可能刚买的时侯时间走得还算准,过了几年后,那就是一塌糊涂,我也见过x86服务器,也是这种情况,小机可能稍好。所以为了保证世界上联网的计算机时间走得大致一样,就通过时间同步协议(NTP协议)来同步时间。我们一般配置一个或多个时间服务器通过NTP来同步时间,如:

# ntpq -p

     remote           refid      st t when poll reach   delay   offset  jitter

==============================================================================

 LOCAL(0)        .LOCL.          10 l   23   64  377    0.000    0.000   0.001

*xxx.xxx.x.3     10.93.1.98       2 u  833 1024  377    6.618    0.161   1.825

 xxx.xxx.xx.59   .INIT.          16 u    - 1024    0    0.000    0.000   0.000

 

如果没有配置NTP时间同步,那就不要着急了,闰秒对你们的系统没影响,但是你们的系统时间走得不准确,这种情况比较普遍,很多部门,自建了内网,业务系统都是放在内网里,从来没有对外进行时间同步。

3. 闰秒对Oracle数据库的影响

有些集群系统,比如Oracle RAC,因为没有对外时间服务器,所以就在RAC两个节点之间配置了NTP时间同步,保证两个节点的时间一致,这种系统也没有影响。在Oracle 11g RAC中,对于这种没有对外同步时间的机器,Oracle推出了CTSSD服务,不需要配置两个节点的NTP同步,直接使用Oracle CTSSD服务就可以达到目的(前提是把操作系统默认的/etc/ntp.conf文件给改名或删了)。

那对于有时间同步的Oracle数据库具体会有哪些影响呢:

  • 在RDBMS层面对于闰秒没有影响,所以也不需要补丁。但是RDBMS运行在操作系统上,如果操作系统内核受影响了,RDBMS间接受害。

  • 在Oracle RAC 环境下,crs可能会受到影响而重启,受影响比较严重版本是:10.2.0.4,11.1.0.7之前的版本,具体的触发条件及处理方法见《Note 759143.1 》。

  • 在linux系统环境,如果装有OEM ,Oracle Enterprise Manager Management Agent (OMA) or Oracle Management Service (OMS),可能导致 cpu 100%的情况发生,具体的workaround 见《Doc ID 1472651.1》。

  • 应用层面,列类型具有timestamp 的列,当在闰秒那一刻 取到数据入库时会报一个错误,其它时刻再取则不在发生此类错误。

4. 如何避免闰秒对Oracle数据库的影响

1)使用ntp –x打开 ntpd进程的 “slewing”特性,避免其快速调整,以免操作系统内核造成影响,间接影响Oracle数据库。在各个系统上如何配置NTP的“slewing”特性,参考:How to Configure NTP or Windows Time for Oracle Clusterware (文档 ID 1056693.1)。

2)如果是比较低的Oracle版本,如10.2.0.4,11.1.0.7之前的版本,尽量升级到较高的版本。

3)通过网络上进行封堵NTP服务,这样就避免网内的系统对外进行NTP同步。但是有些官方站点如:google、redhat等是将NTP服务器将通过“降速”增加闰秒,所以如果采用这个方法,需要提前一段时间就封堵。

5. 已经发生问题的系统如何恢复

在闰秒发生的时侯,有些没有配置ntp -x或者没被封堵住的系统,可能系统就会出现问题了。如果宕机了,那也没什么办法了,如果主机的CPU使用率100%,但还能登录系统的话,可以尝试以下办法:

# /etc/init.d/ntpd stop

#  date -s "`date`"

# /etc/init.d/ntpd start