常说的linux系统时钟有两个,一个是硬件时钟(RTC),即BIOS时间。另一个是系统时钟(LTC),即我们日常操作经常看到的各种时间,比如date命令获取的时间。
当Linux启动时,系统Kernel会去读取硬件时钟的设置,然后根据时区设置信息,计算得到系统时钟,此时系统时钟就会独立于硬件运作。有时我们会发现系统时钟和硬件时钟不一致,或系统显示LTC时间和实际当地时间不一致的情况,就需要执行时间同步设置相关工作。RTC时间和时区出现问题时,经常会导致设置好时间后,重启失效的问题。这种情况,就需要排查RTC时间和时区设置是否正确。
先来了解下时区的一些皮毛知识:
UTC(世界标准时间)
协调世界时,又称世界标准时间或世界协调时间,简称UTC(从英文“Coordinated Universal Time”/法文“Temps Universel Coordonné”而来),是最主要的世界时间标准,其以原子时秒长为基础,在时刻上尽量接近于格林尼治标准时间。
扩展:
闰秒,是指为保持协调世界时接近于世界时时刻(GMT),由国际计量局统一规定在年底或年中(也可能在季末)对协调世界时增加或减少1秒的调整。由于地球自转的不均匀性和长期变慢性(主要由潮汐摩擦引起的),会使世界时(民用时)和原子时之间相差超过到±0.9秒时,就把协调世界时向前拨1秒(负闰秒,最后一分钟为59秒)或向后拨1秒(正闰秒,最后一分钟为61秒);
GMT(格林尼治平时)
格林尼治平时(又称格林尼治平均时间或格林尼治标准时间,旧译格林威治标准时间;英语:Greenwich MeanTime,GMT)是指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。英国伦敦格林威治定为0°经线开始的地方,地球每15°经度 被分为一个时区,共分为24个时区,相邻时区相差一小时;例: 中国北京位于东八区,GMT时间比北京时间慢8小时。
理论上来说,格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时(也就是在格林尼治上空最高点时)的时间。由于地球在它的椭圆轨道里的运动速度不均匀,这个时刻可能与实际的太阳时有误差,最大误差达16分钟。
由于地球每天的自转是有些不规则的,而且正在缓慢减速,因此格林尼治时间已经不再被作为标准时间使用。现在的标准时间,是由原子钟报时的协调世界时(UTC)。
补充:
由于地球轨道并非圆形,其运行速度又随着地球与太阳的距离改变而出现变化,因此视太阳时欠缺均匀性。视太阳日的长度同时亦受到地球自转轴相对轨道面的倾斜度所影响。为着要纠正上述的不均匀性,天文学家计算地球非圆形轨迹与极轴倾斜对视太阳时的效应。平太阳时就是指经修订后的视太阳时。在格林尼治子午线上的平太阳时称为世界时(UT0),又叫格林尼治平时(GMT)。 为了确保协调世界时与世界时(UT1)相差不会超过0.9秒,有需要时便会在协调世界时内加上正或负闰秒。因此协调世界时与国际原子时(TAI)之间会出现若干整数秒的差别。位于巴黎的国际地球自转事务中央局(IERS)负责决定何时加入闰秒。
也就是说,UTC 基本上等于GMT
DST: Daylight Saving Time(日光节约时间)
所谓日光节约时间(Daylight Saving Time,简称D.S.T.)是指在夏天太阳升起的比较早时,将时钟拨快一小时,以提早日光的使用,在英国则称为夏令时间(Summer Time)。这个构想于1784年由美国班杰明·富兰克林提出来,1915年德国成为第一个正式实施夏令日光节约时间的国家,以削减灯光照明和耗电开支。自此以后,全球以欧洲和北美为主的约70个国家都引用这个做法。目前被划分成两个时区的印度也正在商讨是否全国该统一实行夏令日光节约时间。欧洲手机上也有很多GSM系统的基地台,除了会传送当地时间外也包括夏令日光节约时间,做为手机的时间标准,使用者可以自行决定要开启或关闭。值得注意的是,某些国家有实施夏日节约时间的制度,出国时别忘了跟随当地习惯在表上调整一下,这可是机械表没有的功能设计。
夏季节约时间,即夏令时;是为了利用夏天充足的光照而将时间调早一个小时,北美、欧洲的许多国家实行夏令时;
CST(也称为北京时间)
CST实际是四个不同时区的缩写,如下:
Central Standard Time (USA) UT-6:00 --美国标准时间
Central Standard Time (Australia) UT+9:30 --澳大利亚标准时间
China Standard Time UT+8:00 --中国标准时间
Cuba Standard Time UT-4:00 --古巴标准时间
北京时间,China Standard Time,中国标准时间。在时区划分上,属东八区,比协调世界时早8小时,记为UTC+8。
Linux相关时间概念:
[root@N1 ~]# timedatectl status
Local time: 三 2022-09-14 19:51:36 CST --LTC 即本地时间
Universal time: 三 2022-09-14 11:51:36 UTC --UTC 即UTC,世界标准时间
RTC time: 二 2022-09-13 19:50:15 --RTC 即硬件时间 real time clock
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: n/a
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
[root@N1 ~]#
在 Linux 系统中,RTC 的时间究竟是 LTC 还是 UTC 是由一个配置文件决定。RedHat 发行版中,该配置文件叫做/etc/sysconfig/clock 。 当该文件中有UTC=true”这一行设定时,Linux 系统会将 RTC 时间解读为 UTC 时间,否则就解读为 LTC。
/etc/sysconfig/clock
只对 hwclock 命令有效,且只在系统启动和关闭的时候才有用(修改了其中的 UTC=true 到 UTC=false 的前后,执行 hwclock (--utc,或 --localtime) 都没有变化,要重启系统后才生效);
在 etc/sysconfig/clock 中 UTC=false 时,date、hwclock、hwclcok --localtime 输出的时间应该都一致,且此时 hwclock --utc是没有意义的;
在 etc/sysconfig/clock 中 UTC=ture 时,date、hwclock 的输出是一致的,hwclock --localtime 的输出则是UTC时间;
系统关闭时会同步系统时间到硬件时钟,系统启动时会从硬件时钟读取时间更新到系统,这2个步骤都要根据 etc/sysconfig/clock 文件中UTC的参数来设置时区转换。
/etc/localtime
这个文件用来设置系统的时区,将 /usr/share/zoneinfo/ 中相应文件拷贝到/etc下并重命名为 localtime 即可修改时区设置(通常通过软连接实现),而且这种修改对 date命令是及时生效的。不论是 date 还是 hwclock 都会用到这个文件,会根据这个文件的时区设置来进行UTC和本地之间之间的换算
查看:
date 查看系统时间
date -R 查看系统时区
设置系统时间:
date -s 06/18/14
查看系统硬件时间:
hwclock --show
clock --show
设置系统硬件时间:
hwclock --set --date="06/18/14 14:55" (月/日/年时:分:秒)
clock --set --date="06/18/14 14:55" (月/日/年时:分:秒)
使用硬件时间同步系统时间
hwclock --hctosys --通过hwclock将硬件时间刷入系统时间
clock --hctosys --通过clock 将硬件时间刷入系统时间
使用系统时钟同步硬件时钟
hwclock --systohc --通过hwclock将系统时间刷入硬件时间
clock --systohc --通过clock 将系统时间刷入硬件时间
hwclock -w --通过hwclock将系统时间刷入硬件时间
centos6修改时区:
vi /etc/sysconfig/clock ZONE=Asia/Shanghai
rm /etc/localtime
ln -sf usr/share/zoneinfo/Asia/Shanghai /etc/localtime
centos7修改时区:
timedatectl set-timezone Asia/Shanghai
时间调整示例:
[root@N1 ~]# timedatectl set-timezone America/Santo_Domingo --先将时区随便调整一个,让系统时区错误
分析当前系统时间问题(当前实际本地时间为20220914 12:07):
[root@N1 ~]# timedatectl status
Local time: 二 2022-09-13 16:04:47 AST --ast大西洋标准时间,滞后UTC4小时
Universal time: 二 2022-09-13 20:04:47 UTC
RTC time: 二 2022-09-13 20:04:47
Time zone: America/Santo_Domingo (AST, -0400) --时区错误
NTP enabled: n/a
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
[root@N1 ~]#
linux 7 推荐使用UTC时间,使用UTC以后,系统时间和时区再没有任何关联。 --oracle rac来看,这是个错误设置,具体阅读后文
[root@N1 ~]# timedatectl set-timezone UTC
[root@N1 ~]# timedatectl status
Local time: 二 2022-09-13 20:12:40 UTC
Universal time: 二 2022-09-13 20:12:40 UTC
RTC time: 二 2022-09-13 20:12:40
Time zone: UTC (UTC, +0000)
NTP enabled: n/a
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
[root@N1 ~]# timedatectl set-time 2022-09-14 --调整日期
[root@N1 ~]# timedatectl set-time 12:16:30 --调整时间
[root@N1 ~]# timedatectl status
Local time: 三 2022-09-14 12:16:34 UTC
Universal time: 三 2022-09-14 12:16:34 UTC
RTC time: 三 2022-09-14 12:16:35
Time zone: UTC (UTC, +0000)
NTP enabled: n/a
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
[root@N1 ~]#
调整后oracle实例内部时间已经正常,但是集群日志时间错误
SQL> select sysdate from dual;
SYSDATE
-------------------
2022-09-14 12:21:10
SQL>
[grid@N1 trace]$ pwd
/u01/app/grid/diag/crs/n1/crs/trace
[grid@N1 trace]$ tail ocssd.trc
2022-09-14 20:22:18.424 : CSSD:2900330240: [ INFO] clssgmSendEventsToMbrs: Group CRF-, member count 1, event master 0, eventtype 6, event incarn 2, event member count 1, pids 14514-2386,
2022-09-14 20:22:18.779 : CSSD:2903484160: [ INFO] : Processing member data change type 1, size 4 for group HB+ASM, memberID 21:2:1
2022-09-14 20:22:18.779 : CSSD:2903484160: [ INFO] : Sending member data change to GMP for group HB+ASM, memberID 21:2:1
2022-09-14 20:22:18.779 : CSSD:2915841792: [ INFO] clssgmpcMemberDataUpdt: grockName HB+ASM memberID 21:2:1, datatype 1 datasize 4
2022-09-14 20:22:18.780 : CSSD:2900330240: [ INFO] clssgmcpDataUpdtCmpl: Status 0 mbr data updt memberID 21:2:1 from clientID 1:40:2
2022-09-14 20:22:19.161 : CSSD:2906380032: [ INFO] clssgmpcGMCReqWorkerThread: processing msg (0x7fc288046b90) type 2, msg size 76, payload (0x7fc288046bbc) size 32, sequence 10470, for clientID 1:12:1
2022-09-14 20:22:20.856 : CSSD:2903484160: [ INFO] : Processing member data change type 1, size 4 for group HB+ASM, memberID 21:2:1
2022-09-14 20:22:20.856 : CSSD:2903484160: [ INFO] : Sending member data change to GMP for group HB+ASM, memberID 21:2:1
2022-09-14 20:22:20.857 : CSSD:2915841792: [ INFO] clssgmpcMemberDataUpdt: grockName HB+ASM memberID 21:2:1, datatype 1 datasize 4
2022-09-14 20:22:20.857 : CSSD:2900330240: [ INFO] clssgmcpDataUpdtCmpl: Status 0 mbr data updt memberID 21:2:1 from clientID 1:40:2
[grid@N1 trace]$
查看集群日志等日志信息,发现时间比实际时间快8小时。这是由于集群也有时区配置相关信息,他是基于硬件时间偏移时区后得到的时间。 Doc ID 1209444.1
记录下如下文件: $GRID_HOME/crs/install/s_crsconfig_<nodename>_env.txt
[root@N1 ~]# su - grid
上一次登录:三 9月 14 12:22:39 UTC 2022
[grid@N1 ~]$
[grid@N1 ~]$
[grid@N1 ~]$
[grid@N1 ~]$ cd $ORACLE_HOME/crs/install/
[grid@N1 install]$ cat s_crsconfig_n1_env.txt
#########################################################################
#This file can be used to set values for the NLS_LANG and TZ environment
#variables and to set resource limits for Oracle Clusterware and
#Database processes.
#1. The NLS_LANG environment variable determines the language and
# characterset used for messages. For example, a new value can be
# configured by setting NLS_LANG=JAPANESE_JAPAN.UTF8
#2. The Time zone setting can be changed by setting the TZ entry to
# the appropriate time zone name. For example, TZ=America/New_York
#3. Resource limits for stack size, open files and number of processes
# can be specified by modifying the appropriate entries.
#
#Do not modify this file except as documented above or under the
#direction of Oracle Support Services.
#########################################################################
TZ=Asia/Shanghai
NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
CRS_LIMIT_STACK=2048
CRS_LIMIT_OPENFILE=65536
CRS_LIMIT_NPROC=65536
TNS_ADMIN=
[grid@N1 install]$
这个说明oracle本身是不建议系统全都使用UTC时间的。
我们重新调整:恢复时区:
[root@N1 ~]# timedatectl status
Local time: 三 2022-09-14 12:30:04 UTC
Universal time: 三 2022-09-14 12:30:04 UTC
RTC time: 三 2022-09-14 12:30:04
Time zone: UTC (UTC, +0000)
NTP enabled: n/a
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
[root@N1 ~]# timedatectl set-timezone Asia/Shanghai
[root@N1 ~]# timedatectl status
Local time: 三 2022-09-14 20:30:07 CST --直接修改时区后发现,LTC等于CST,这是根据RTC根据时区信息自动计算的。这个时间对我们而言明显是错误的。
Universal time: 三 2022-09-14 12:30:07 UTC
RTC time: 三 2022-09-14 12:30:07
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: n/a
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
[root@N1 ~]# timedatectl set-time 2022-09-14
[root@N1 ~]# timedatectl set-time 12:38:30
[root@N1 ~]# timedatectl status
Local time: 三 2022-09-14 12:38:32 CST --调整后,可以看到LTC,CST,UTC,RTC均正常
Universal time: 三 2022-09-14 04:38:32 UTC
RTC time: 三 2022-09-14 04:38:33
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: n/a
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
[root@N1 ~]#
集群日志时间也正常显示:
2022-09-14 00:00:20.292 : CSSD:1186428672: [ INFO] clssnmSendingThread: sent 5 status msgs to all nodes
2022-09-14 00:00:20.368 : CSSD:2903484160: [ INFO] : Processing member data change type 1, size 4 for group HB+ASM, memberID 21:2:1
2022-09-14 00:00:20.368 : CSSD:2903484160: [ INFO] : Sending member data change to GMP for group HB+ASM, memberID 21:2:1
2022-09-14 00:00:20.369 : CSSD:2915841792: [ INFO] clssgmpcMemberDataUpdt: grockName HB+ASM memberID 21:2:1, datatype 1 datasize 4
2022-09-14 00:00:20.369 : CSSD:2900330240: [ INFO] clssgmcpDataUpdtCmpl: Status 0 mbr data updt memberID 21:2:1 from clientID 1:40:2
2022-09-14 00:00:22.449 : CSSD:2903484160: [ INFO] : Processing member data change type 1, size 4 for group HB+ASM, memberID 21:2:1
2022-09-14 00:00:22.449 : CSSD:2903484160: [ INFO] : Sending member data change to GMP for group HB+ASM, memberID 21:2:1
2022-09-14 00:00:22.449 : CSSD:2915841792: [ INFO] clssgmpcMemberDataUpdt: grockName HB+ASM memberID 21:2:1, datatype 1 datasize 4
2022-09-14 00:00:22.449 : CSSD:2900330240: [ INFO] clssgmcpDataUpdtCmpl: Status 0 mbr data updt memberID 21:2:1 from clientID 1:40:2
2022-09-14 12:38:31.076 : CSSD:2903484160: [ INFO] : Processing member data change type 1, size 4 for group HB+ASM, memberID 21:2:1
2022-09-14 12:38:31.076 : CSSD:2903484160: [ INFO] : Sending member data change to GMP for group HB+ASM, memberID 21:2:1
2022-09-14 12:38:31.076 : CSSD:2915841792: [ INFO] clssgmpcMemberDataUpdt: grockName HB+ASM memberID 21:2:1, datatype 1 datasize 4
2022-09-14 12:38:31.076 : CSSD:2900330240: [ INFO] clssgmcpDataUpdtCmpl: Status 0 mbr data updt memberID 21:2:1 from clientID 1:40:2
2022-09-14 12:38:31.845 : CSSD:1186428672: [ INFO] clssnmSendingThread: sending status msg to all nodes
2022-09-14 12:38:31.845 : CSSD:1186428672: [ INFO] clssnmSendingThread: sent 5 status msgs to all nodes
2022-09-14 12:38:33.118 : CSSD:2903484160: [ INFO] : Processing member data change type 1, size 4 for group HB+ASM, memberID 21:2:1
2022-09-14 12:38:33.118 : CSSD:2903484160: [ INFO] : Sending member data change to GMP for group HB+ASM, memberID 21:2:1
如上,Centos7调整时间时区,我们仅需要执行如下代码即可:
[root@N1 ~]# timedatectl status
[root@N1 ~]# timedatectl set-timezone Asia/Shanghai
[root@N1 ~]# timedatectl set-time 2022-09-14
[root@N1 ~]# timedatectl set-time 12:38:30
[root@N1 ~]# timedatectl status
更多技术细节,欢迎关注公众号联系作者交流。
关注更多精彩