如何诊断rac环境下sysdate 返回错误时间问题

最近处理了一些rac环境下访问sysdate返回错误时间的问题,而这种问题往往出现在数据库链接是通过Listener创建的情况下,而且,大部分情况下都是和时区设置相关的。在这篇文章中我们会针对如何诊断这种问题进行解释。这篇文章适用于版本11.2.0.2 及以上版本。

首先,对问题当中涉及到的知识进行介绍。

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才会影响返回的系统时间。

接下来,我们简单介绍一下客户端通过listener 连接到数据库时会经过那些过程。我们会通过一个具体的例子来解释。在这个例子中,我们使用sqlplus 创建数据库链接,并对listener进程搜集truss 信息

1.客户端连接数据库

sqlplus scott/[email protected]

2.listner 进程收到了对应的链接,并产生了对应的server process.

524732: psargs: /u01/app/11.2.0/grid/bin/tnslsnr LISTENER -inherit

......

524732: kfork() = 496094

496094: kfork() (returning as child ...) = 0

......

496094: kfork() = 483742

483742: kfork() (returning as child ...) = 0

3. 为server process指定环境变量。

483742: execve(0x0FFFFFFFFFFF2660, 0x0000000110773730, 0x000000011077B670) argc: 2

483742: argv: oracle<sid name> (LOCAL=NO) <<<<<<<< 服务器进程环境变量被指定

483742: envp: _=/u01/app/11.2.0/grid/bin/oraagent.bin LANG=en_US LOGIN=root

483742: __CLSAGENT_INCARNATION=2 _ORA_AGENT_ACTION=TRUE PATH=

483742: NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1 __CLSAGENT_USER_NAME=oracle

......

483742: ENV_FILE=/u01/app/11.2.0/grid/crs/install/s_crsconfig_<node name>_env.txt

......

483742: __CLSAGENT_LOGDIR_NAME=crsd PWD=/ TZ=Asia/Shanghai <<<< 时区被指定。

我们能看到环境变量TZ的值在创建服务器进程时会被绑定到server process 中。当然,如果您没有对lisetner 搜集truss 输出。您也可以通过操作系统命令获得对应进程的环境变量,例如:ps eauwww <pid from above>,您可以通过MOS note 373303.1 中的内容获得不同平台的命令。另外,以上的数据库是通过GI agent 启动的,如果数据库是手动启动的(例如:startup 命令),那么,输出会不同。当然, pmon在注册数据库服务到listener时也会将自己的环境变量注册到对应的service上。

所以,在诊断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

时间: 2024-09-28 16:13:52

如何诊断rac环境下sysdate 返回错误时间问题的相关文章

如何诊断rac环境sysdate 返回的时间错误

最近处理了若干rac环境访问sysdate错误的时间返回.而这个问题通常是一个数据库链接是由现在Listener创建的情况下.并且.大部分情况下都是和时区设置相关的.在这篇文章中我们会针对怎样诊断这样的问题进行解释.这篇文章适用于版本号11.2.0.2 及以上版本号. 首先,对问题其中涉及到的知识进行介绍. 1. 从版本号11.2.0.2 開始oracle 集群(GI)開始拥有了自己的时区和一些其它配置.这些配置保存在配置文件<gi_home>/crs/install/s_crsconfig_

Oracle RAC 环境下的连接管理(转) --- 防止原文连接失效

崔华老师的文章!!! 这篇文章详细介绍了Oracle RAC环境下的连接管理,分别介绍了什么是 Connect Time Load Balancing.Runtime Connection Load Balancing.Connect Time Connection Failover 和 Runtime Connection Failover,以及里面所涉及到的 TAF.ONS.FCF.FAN.LBA 等诸多知识点.本文主要是针对 Oracle RAC 11gR2 环境下的连接管理,但同时也会对

利用XAG在RAC环境下实现GoldenGate自动Failover

概述 在RAC环境下配置OGG,要想实现RAC节点故障时,OGG能自动的failover到正常节点,要保证两点: 1. OGG的checkpoint,trail,BR文件放置在共享的集群文件系统上,RAC各节点都能访问到 2. 需要有集群软件的来监测OGG进程,以及发生故障时,自动在正常节点重启OGG(failover) Oracle Grid Infrastructure Standalone Agents (XAG)搭配Oracle支持的集群文件系统,可以实现OGG的自动failover,本

Oracle RAC环境下配置statspack

Statspack是Oracle 9i时代的产物,对于监控与分析数据库性能有着跨里程碑的意义,是AWR的前身.在Oracle 10g后AWR取代了statspack.尽管如此,awr异常或者需要调试包license的情况下statpack依旧是不错的选择.然而在RAC环境中,statspack并不支持,需要单独的进行配置以及使用job来进行管理.本文描述的则是通过在RAC环境下创建service,以及job来达到各节点同时产生snapshot的效果. 一.演示环境 suse11a:oracle:

【OGG】RAC环境下配置OGG单向同步 (四)

[OGG]RAC环境下配置OGG单向同步 (四) 一.1  BLOG文档结构图 一.2  前言部分 一.2.1  导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① RAC环境下配置OGG单向同步 注意:本篇BLOG中代码部分需要特别关注的地方我都用黄色背景和红色字体来表示,比如下边的例子中,thread 1的最大归档日志号为33,thread 2的最大归档日志号为43是需要特别关注的地方. List of Archived Lo

【OGG】 RAC环境下管理OGG的高可用 (五)

[OGG] RAC环境下管理OGG的高可用 (五) 一.1  BLOG文档结构图 一.2  前言部分 一.2.1  导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① RAC环境下管理OGG的高可用 注意:本篇BLOG中代码部分需要特别关注的地方我都用黄色背景和红色字体来表示,比如下边的例子中,thread 1的最大归档日志号为33,thread 2的最大归档日志号为43是需要特别关注的地方. List of Archived L

【RAC】rac环境下的数据库备份与还原

[RAC]rac环境下的数据库备份与还原 一.1 BLOG文档结构图 一.2 前言部分 一.2.1 导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① rac环境下的数据库备份与还原 ② rman恢复数据库的一般步骤 ③ rac环境的简单操作 注意:本篇BLOG中代码部分需要特别关注的地方我都用***背景和红色字体来表示,比如下边的例子中,thread 1的最大归档日志号为33,thread 2的最大归档日志号为43是需要特别关注

RAC 环境下修改归档模式

RAC环境下的归档模式切换与单实例稍有不同,主要是共享存储所产生的差异.在这种情况下,我们可以将RAC数据库切换到非集群状态下,仅仅在一个实例上来实施归档模式切换即可完成RAC数据库的归档模式转换问题.本文主要描述了由非归档模式切换到归档模式,而由非归档切换的归档步骤相同,不再赘述. [sql] view plain copy print? 1.主要步骤: 备份spfile,以防止参数修改失败导致数据库无法启动 修改集群参数cluster_database为false 启动单实例到mount状态

RAC 环境下的重要参数

Oracle 数据库启动时会根据参数文件中提供的相关参数启动Oracle实例.这些参数包括数据库名字.sga,pga的分配,控制文件的位置,undo,process等等.Oracle RAC数据库同样依赖于这些参数.除了所有单实例情形下的参数值外,RAC数据库还多出了一些重要的参数.本文主要描述RAC环境下的相关参数. 一.单实例下参数文件的重要参数  db_name  db_block_size  Control Files name and location  Initialization