现象:
数据库两节点中:select sysdate from dual;
返回时间比OS date时间晚了13小时
select current_date from dual;
select current_timestamp from dual;
均无误,与OS date时间一致
OS执行date返回时间和时区均无误
date
Mon Nov 2 14:16:41 CST 2015
查看时区配置,发现1节点OS配置文件的时区是错的,2节点正常
cat /etc/sysconfig/clock
ZONE="America/New_York"
查看$GRID_HOME/crs/install/s_crsconfig_<nodename>_env.txt,发现grid读取操作系统的时区也是错的
# cat /u01/app/11.2.0/grid/crs/install/s_crsconfig_******1_env.txt
TZ=America/New_York
NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
查看当前listener的时区
ps -ef|grep tns
cat oracle 31919 1 0 14:17 /u01/app/11.2.0/grid/bin/tnslsnr LISTENER -inherit
cat /proc/31919/environ
其中LZ值为
TZ=America/New_York
原因:
文档How To Change Timezone for 11gR2Grid Infrastructure [ID 1209444.1]指出:
Once OS default timezone is changed, make sure:
- For 11.2.0.1, shell environment variable TZ is set correctly for grid user and root.
- For 11.2.0.2 and above, TZ entry in $GRID_HOME/crs/install/s_crsconfig__env.txt sets to correct time zone.
grid直接读取操作系统时区,grid的时区配置文件放在$GRID_HOME/crs/install/s_crsconfig_<nodename>_env.txt这个文件中,OS修改时区后需要调整该配置文件到正确的时区
可能情况:
最初在OS安装时时区配置错误。
后期DBA在修改时区时,只通过cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime覆盖,所以使用date命令查询时区是正确的。
安装oracleCRS的时候是在1节点,DB从操作系统时区配置文件/etc/sysconfig/clock 读取到错误的时区配置America/New_York,导致grid的时区配置文件中的时区配置也是错误的。
解决步骤:
修改集群所有节点grid的时区配置文件
$GRID_HOME/crs/install/s_crsconfig_<nodename>_env.txt
#TZ=America/New_York
TZ=Asia/Shanghai
NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
重启所有节点集群。
查询时间恢复正常。