RAC环境select sysdate时间有误debug

现象:

数据库两节点中: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:

  1. For 11.2.0.1, shell environment variable TZ is set correctly for grid user and root.
  2. 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

重启所有节点集群。
查询时间恢复正常。

    原文作者:DBA
    原文地址: https://www.jianshu.com/p/f3afad544071
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞