現象:
數據庫兩節點中: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
重啟所有節點集群。
查詢時間恢復正常。