标签:
首先,对问题当中涉及到的知识进行介绍。
1. 从版本11.2.0.2 开始oracle 集群(GI)开始拥有了自己的时区和一些其他配置,这些配置保存在配置文件<gi_home>/crs/install/s_crsconfig_<节点名>_env.txt中。
例如:
TZ=Asia/Shanghai
NLS_LANG=AMERICAN_AMERICA.AL32UTF8
TNS_ADMIN=
ORACLE_BASE=
我们能看到变量TZ 用于定义集群的时区。当然,这个集群的时区是在安装GI时从操作系统获得的。既然集群有了时区,那么我们就需要保证GI的时区和操作系统的设置是一致的,并且当操作系统的时区发生改变时,GI的时区也需要改变。而修改集群时区的基本步骤是(修改<gi_home>/crs/install/s_crsconfig_<节点名>_env.txt文件,重启节点)。
2. 当数据库或者listner 使用srvctl 命令或者随着GI启动被启动时,环境变量会继承GI的时区。您也可以通过下面的命令来手动设置数据库和listener资源的环境变量。
srvctl setenv database -d <dbname> -t ‘TZ=<时区>‘
srvctl setenv listener -l <listenername> -t ‘TZ=<时区>‘
3. sysdate返回的值并不依赖于数据库的时区设置,oracle 只是简单的从操作系统获取系统时间返回(例如:调用os 函数gettimeofday)。所以,修改数据库的时区对于这种问题并没有帮助。而对应的服务器进程所使用的环境变量TZ才会影响返回的系统时间。
所以,在诊断RAC 环境下sysdate 返回错误时间的问题时,我们需要检查以下信息。
1. 操作系统级别的时区设置,并确保操作系统命令date 能返回正确的时间。对于如何查看不同平台的时区设置,请参考note 1209444.1
2. 确认GI 配置文件<gi_home>/crs/install/s_crsconfig_<节点名>_env.txt文件中的变量TZ和操作系统的TZ 设置一致。
3. 确认是否在database或listener资源层面设置了TZ变量。如果设置了,是否和OS,GI的设置是一致的。
4. 另外,server process的环境变量LIBPATH 或 LD_LIBRARY_PATH 也会对oracle访问操作系统函数产生影响。而且GI 的agent进程(适用于版本11.2.0.3 及以上的版本)在启动资源时(例如:database资源)会自动的将进程的以下环境变量清空
LD_LIBRARY_PATH, SHLIB_PATH (HP-UX), LD_LIBPATH_PATH_64 (Solaris), LIBPATH(AIX)
所以,如果您的database是使用srvctl 命令启动的,就需要确认上面的环境变量被设置正确。
例如:srvctl setenv database -d <db_name> -t ‘LIBPATH=<gi_home/lib>‘
注意:不同的Unix平台,以上命令可能会不同。
所以,我们也去要确认database 资源的LIBPATH 或 LD_LIBRARY_PATH 变量是否被设定。
例如:srvctl getenv database -d <db_name>
另外,在诊断这种问题时,需要搜集以下信息。
1. <gi_home>/crs/install/s_crsconfig_<节点名>_env.txt文件
2. 操作系统时区设置(cat /etc/sysconfig/clock) 和环境变量TZ的设置。以及pmon进程的环境变量。
3. database和 listener资源的环境变量
例如:srvctl getenv database -d <db_name>
srvctl getenv listener -l <listener name>
4. 如果以上的信息没有问题,那么就需要搜集listener 进程的truss(或strace) 输出找到有问题的环境变量设置。
5. 如果1—4 中的信息仍然无法找到问题的原因,请搜集客户端和服务器端的sqlnet trace,以便确认是否有任何的’alter session set ...’命令修改了会话的时区或者相关的变量。
客户端sqlnet trace:设置以下参数到客户端的sqlnet.ora 文件中。
trace_level_client=16
trace_directory_client=c:\tmp ==> 确保该路径存在
trace_file_client=client
trace_unique_client=on
trace_timestamp_client=on
服务器端sqlnet trace:设置以下参数到服务器端的sqlnet.ora文件中
trace_level_server=16
trace_file_server=server
trace_directory_server=/tmp ==> 确保该路径存在
trace_timestamp_server=ON
另 11.2.0.3 在 IBM AIX on POWER Systems (64bit) 上存在一个Bug,即使正确设置也不会还是会显示成GTM/UTC 时间。
Bug 16310858 : DB STARTING WITH WRONG TIMEZONE WHEN STARTING WITH SRVCTL
标签:
原文地址:http://blog.csdn.net/ora_unix/article/details/44851649