`
itspace
  • 浏览: 978666 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

谈谈主机修改时区对Oracle的影响

阅读更多
Oracle在启动实例时,由pmon进程将读取操作系统相关环境(如系统时区)进内存区域,并在该实例的生命周期内一直保存。
监听启动时,首先会读取操作系统系统时区,但如果数据库监听采用动态注册,那pmon进程会将数据库系统时区信息动态注册至监听。
所以,当操作系统时区发生更改,如果通过监听连接的业务,会读取监听中的时区,所以仍将采用更改前的时区,这将导致数据库时间和操作系统时间不一致,此时进行数据插入,数据将采用监听的时区进行数据插入。
所以为了使得数据库时间和操作系统时间一致性,Oracle官方推荐当操作系统更改时区之后,将数据库进行重启,由pmon进程将修改后的新时区,重新注册至监听。但是如果数据库是7*24小时环境,重启数据库需要付出相当大的代价。那能不能不重启数据库就能达到数据库时间和操作系统时间一致的状态呢?
通过以上的讨论,我们可以得出以下结论:
1、如果业务程序不通过监听连接至数据库,那么数据库和主机时间应当一致。
2、如果监听是静态注册,Pmon进程不动态注册相关信息至监听器里,那么将监听瞬间重启之后,监听将读取修改后的时区,这样通过监听连接的业务程序,也将读取修改后的时区。
但是问题又来了,如果数据库监听端口处于非默认端口(即1521端口),那么只要不设置local_listener,那将不会进行动态注册。那如果是默认监听端口呢?
这里有个小技巧只要将local_listener设为其他端口即可
alter system set local_listener="(address=(protocol=tcp)(host=172.16.4.163)(port=1531))";
如果操作系统时区不修改,我们可以通过修改监听的时区,达到修改时区的目的,即只要修改listsner.ora,增加ENVS='TZ=CST6CDT。
SID_LIST_LISTENER =
  (SID_LIST =
      (SID_DESC =
      (GLOBAL_DBNAME = mcstar)
      (ORACLE_HOME = /ora10g/oracle/product/10.2.0/db_1)
      (SID_NAME = mcstar)
      #(ENVS='TZ=CST6CDT')
    )
  )
    
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.4.163)(PORT = 1521))
    )
    )
以下为一个客户修改了操作系统时区,导致数据库时间和操作系统时间不一致的解决过程:
可以看到在主机上连接数据库,即不通过监听连接数据库时,系统时间和数据库时间处于一致状态
SQL> conn agent/***
Connected.
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'YY
-------------------
2011-05-20 15:23:50
但通过监听连接,再显示数据库时间,发现相差14个小时
$ sqlplus "agent/***@zjdw"

SQL*Plus: Release 9.2.0.8.0 - Production on Fri May 20 15:25:34 2011

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.


Connected to:
Oracle9i Enterprise Edition Release 9.2.0.8.0 - 64bit Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.8.0 - Production

SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'YY
-------------------
2011-05-20 01:25:39
查看监听状态,可以发现监听已经运行178天,且默认监听端口号为1521,但并未出现动态注册
$ lsnrctl status

LSNRCTL for HPUX: Version 9.2.0.8.0 - Production on 20-MAY-2011 15:26:00

Copyright (c) 1991, 2006, Oracle Corporation.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.202.3.8)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for HPUX: Version 9.2.0.8.0 - Production
Start Date                22-NOV-2010 12:42:41
Uptime                    178 days 11 hr. 43 min. 18 sec
Trace Level               off
Security                  OFF
SNMP                      OFF
Listener Parameter File   /oradata/ora9208/product/db_1/network/admin/listener.ora
Listener Log File         /oradata/ora9208/product/db_1/network/log/listener.log
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=***.***.***.***)(PORT=1521)))
Services Summary...
Service "zjdw" has 1 instance(s).
  Instance "zjdw", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully

进一步查看Oracle参数,local_listener参数并未见异常,于是再次检查alert日志,可以看到listener.ora地址配置错误,导致pmon注册监听出错,于是也就好理解了为什么监听长期处于静态注册
Mon Nov 22 12:40:57 2010
Starting ORACLE instance (normal)
LICENSE_MAX_SESSION = 0
LICENSE_SESSIONS_WARNING = 0
SCN scheme 3
Using log_archive_dest parameter default value
LICENSE_MAX_USERS = 0
SYS auditing is disabled
Starting up ORACLE RDBMS Version: 9.2.0.8.0.
System parameters with non-default values:
  processes                = 1000
  timed_statistics         = TRUE
  shared_pool_size         = 1056964608
  sga_max_size             = 8398007384
。。。。。。
PMON started with pid=2, OS id=14867
Mon Nov 22 12:41:01 2010
ORA-00130: invalid listener address '(ADDRESS=(PROTOCOL=TCP)(HOST=geosoft-)(PORT=1521))'

既然监听处于静态注册状态,pmon不会将保留在内存区域里的老时区动态注册至监听中,所以只要将监听重启,让监听重新获取新主机时区即可。
可以看到重启监听之后,再次通过监听连接数据库,数据时间已经恢复正常。
$ sqlplus "agent/***@zjdw"

SQL*Plus: Release 9.2.0.8.0 - Production on Fri May 20 15:27:26 2011

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.


Connected to:
Oracle9i Enterprise Edition Release 9.2.0.8.0 - 64bit Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.8.0 - Production

SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'YY
-------------------
2011-05-20 15:27:32

这时又引申出另外一个问题,操作系统时区修改之后,应不应该修改Oracle时区?
显而易见,如果数据库列存储方式并没有采用timezone存储(最常用的有TIMESTAMP,TIMESTAMP WITH TIME ZONE,IMESTAMP WITH LOCAL TIME ZONE),操作系统时区修改显然不用修改数据库时区。
数据库的时区,可以用查看database_properties视图获得,可以看到目前数据库时区为+0:00,即默认和主机时区一致。
SQL>  select * from database_properties where property_name='DBTIMEZONE';

PROPERTY_NAME                  PROPERTY_VALUE       DESCRIPTION
------------------------------ -------------------- ------------------------------
DBTIMEZONE                     +0:00                DB time zone
可以用以下命令修改数据库时区,重启数据库才能生效
ALTER DATABASE SET TIME_ZONE = '+10:00';
需要注意的是,修改数据库时区仅适用于数据库没有TIMESTAMP WITH LOCAL TIME ZONE字段时才生效。且不会修改已存储在数据库中的时区列,仅对未来数据生效。

Oracle除了数据库时区,还提供了会话级时区,查看会话级时区时将忽略数据库级时区,默认保持和操作时区一致。
SQL> SELECT SESSIONTIMEZONE FROM dual;

SESSIONTIMEZONE
---------------------------------------------------------------------------
+08:00
可以采用如下命令,修改之后会话级别实时生效,
SQL> alter session set time_zone='+10:00';

Session altered.

SQL>  SELECT SESSIONTIMEZONE FROM dual;

SESSIONTIMEZONE
---------------------------------------------------------------------------
+10:00

如前所述Timestamp With local Time Zone 在客户端取数据的时候,会自动转为客户端的时区时间,所以修改会话级时区将影响Timestamp With local Time Zone的取值。
SQL> alter session set time_zone='+10:00';

Session altered.

SQL> select TIMESTP_LTZ  from zhoul.TIMESTAMP_TEST;

TIMESTP_LTZ
---------------------------------------------------------------------------
23-MAY-11 04.47.18.000 PM

SQL>  alter session set time_zone='+8:00';

Session altered.

SQL> select TIMESTP_LTZ  from zhoul.TIMESTAMP_TEST;

TIMESTP_LTZ
---------------------------------------------------------------------------
23-MAY-11 02.47.18.000 PM

当数据库已有TIMESTAMP WITH LOCAL TIME ZONE字段时,将出现以下错误。
SQL> ALTER DATABASE SET TIME_ZONE = '+10:00';
ALTER DATABASE SET TIME_ZONE = '+10:00'
*
ERROR at line 1:
ORA-30079: cannot alter database timezone when database has TIMESTAMP WITH LOCAL TIME ZONE columns
当出现这种错误时,可以通过以下脚本查看哪些列是TIMESTAMP WITH LOCAL TIME ZONE
SQL> select u.name || '.' || o.name || '.' || c.name TSLTZcolumn
  2    from sys.obj$ o, sys.col$ c, sys.user$ u
  3   where c.type# = 231
  4     and o.obj# = c.obj#
  5     and u.user# = o.owner#;
TSLTZCOLUMN
--------------------------------------------------------------------------------
ZHOUL.BIN$o+3YOK3rqpLgQBCsowRAmg==$0.TS_LTZ

那么TIMESTAMP WITH LOCAL TIME ZONE是什么玩意呢?
Timestamp With local Time Zone类型和Timestamp with time zone类似。内部代码是231。和TimpStamp With Time Zone不同的是,这种数据类型会自动把时间转换成服务器的时区时间进行存储。在客户端取数据的时候,会自动转为客户端的时区时间。
TIMESTAMP WITH TIME ZONE类型数据会存储客户端的时区信息,如果指定时区信息(如timestamp '2010-02-01 09:00:00 +09:00'),则按指定时区存储,如果不指定时区(如timestamp '2010-02-01 09:00:00')默认采用会话时区存储。
TIMESTAMP WITH LOCAL TIME ZONE类型数据不会存储客户单的时区信息,它根据数据库时区对客户端发来的时间进行转换,基于统一的数据库时区存储时间信息,如果用户没有指定时区信息同TIMESTAMP WITH TIME ZONE一样默认采用会话时区。当用户查看该类型数据时,服务器根据会话所属时区对存储的时间数据进行转换,不同时区的会话将返回不同的时间数据。
分享到:
评论

相关推荐

    oracle19c,19.0.0时区版本35补丁p31335037_190000_Linux-x86-64.zip

    oracle19.0时区版本35补丁p31335037_190000_Linux-x86-64.zip 注意:此补丁只适用于oracle19.3版本用来添加35版本时区,其他版本使用会报错 我会再上传一个适用于19c所有oracle版本的35版本时区补丁 补丁用于解决ORA...

    oracle19c升级时区版本 32->42,解决数据泵导数据TSTZ报错

    - 在进行时区版本升级时,务必对业务影响进行全面评估,确保所有应用程序和服务都支持新的时区版本。 - 在升级前后进行数据备份,以防万一出现问题可以恢复。 - 升级后,测试所有与时间有关的查询和功能,确保...

    oracle19c所有版本通用时区版本33补丁p28852325_190000_Linux-x86-64_33版本.zip

    适用于19c所有oracle版本的33版本时区补丁 补丁用于解决ORA-39405 TSTZ版本问题的错误 用于把oracle19.3数据库加TSTZ33版本的补丁 可通过SQL> SELECT * FROM v$timezone_file;命令查询时区版本 安装过程可以查看我的...

    oracle19.3时区版本33补丁p28852325_193000DBRU_Linux-x86-64.zip

    注意:此补丁只适用于oracle19.3版本用来添加33版本时区,其他版本使用会报错 我会再上传一个适用于19c所有oracle版本的33版本时区补丁 补丁用于解决ORA-39405 TSTZ版本问题的错误 用于把oracle19.3数据库加TSTZ33...

    oracle19c所有版本通用时区版本34补丁p29997937_190000_Linux-x86-64_34版本.zip

    适用于19c所有oracle版本的34版本时区补丁 补丁用于解决ORA-39405 TSTZ版本问题的错误 用于把oracle19c数据库加TSTZ34版本的补丁 可通过SQL> SELECT * FROM v$timezone_file;命令查询时区版本 安装过程可以查看我的...

    Linux修改时区和时间

    时区的设置对系统的时间戳和日期的正确性产生重要影响。在 Linux 系统中,时区的设置可以通过手动修改时区文件或使用图形化命令实现。 1. 手动修改时区:可以通过找到相应的时区文件 /usr/share/zoneinfo/Asia/...

    C#修改Windows时区

    在编程领域,C#是一种广泛使用的面向对象的编程语言,尤其在开发...此外,频繁地修改系统时区可能会对用户造成困扰,因此在实际开发中,除非必要,一般不建议直接修改系统设置,而是通过更友好的方式提示用户进行更改。

    如何在Oracle 9i中正确转换时区

    在Oracle 9i数据库系统中,处理时区转换是一个重要的任务,特别是在全球化的环境中,不同地区的数据交流需要准确地处理时间信息。Oracle 9i引入了一些新的特性来增强时区管理,以解决在早期版本中遇到的问题。在...

    ORA-39405-时区版本36全补丁包

    值得注意的是,时区更新可能会影响到依赖于日期和时间的数据处理,因此在进行此类操作前,建议备份数据库和相关配置,以防止不可预见的问题。 总之,"ORA-39405-时区版本36全补丁包"是为了确保Oracle 19c数据库能够...

    android自动修改时区(原创)

    在Android系统中,修改设备的时区...总的来说,创建这样一个自动修改时区的服务,需要对Android的Service机制、时间处理以及权限管理有深入理解。同时,合理设计和处理时区切换的逻辑,以确保服务的稳定性和用户体验。

    oracle19c TZ41补丁 p35099667-190000-MSWIN-x86-64.zip

    TZ41补丁可能包含对Oracle数据库时区数据库的更新,这是一份包含了全球所有地区时区信息的庞大数据库,包括夏令时规则等复杂信息。 Oracle 19c是Oracle数据库的一个主要版本,它提供了许多新特性,如增强的性能、...

    p29997937_190000__oracle34时区全系统版本

    适用于19c所有oracle版本的34版本时区补丁 补丁用于解决ORA-39405 TSTZ版本问题的错误 用于把oracle19c数据库加TSTZ34版本的补丁 可 通过SQL> SELECT * FROM v$timezone_file;命令查询时区版本 打补丁参考...

    禁止修改PC时间和时区

    禁止修改PC时间和时区,避免因系统时间被篡改带来的损失

    oracle错误及解决方法

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统,其在企业级应用中占据着重要的地位。然而,使用过程中难免会遇到各种错误,这些错误通常以ORA开头的错误代码形式出现。本篇文章将深入探讨Oracle错误及其...

    Oracle UCM连接oracle数据库.doc

    这个过程确保了Oracle UCM能够正确地连接到Oracle数据库,从而实现对内容的存储和管理。配置过程中涉及的关键概念包括Oracle数据库的安装、Oracle UCM的安装配置、JDBC连接以及数据库用户的创建和权限设置。这些步骤...

    通过JDBC连接Oracle数据库的十大技巧

    理插入或更新操作,PreparedStatement 对象的优势更为显著。在批量处理中,你可以预先准备好 SQL 命令,然后多次设置参数并执行,避免了每次都...同时,定期对系统进行性能监控和调优,是确保系统持续高效运行的关键。

    Linux修改系统时区

    在Linux环境中,正确配置系统时区是非常重要的,它不仅影响到系统内部的时间计算,还会影响到依赖于系统时间的各种应用程序和服务。本文将详细介绍如何在Linux系统中修改系统时区。 #### 1. 查看当前时区 在Linux...

    解决win7中时间和时区无法修改Time-Zones

    在“控制面板”中更改区域设置,然后尝试修改时区。 7. **系统更新或补丁**:有时,安装的Windows更新或补丁可能会影响时区设置。检查最近的更新,如果有必要,可以尝试卸载问题更新。 8. **服务状态**:Windows ...

    Oracle专用Linux操作系统-OracleLinux-R6-U5-Server-x86_64

    这个操作系统的关键特性包括对性能的优化,特别是对于运行Oracle软件的服务器,以及与Red Hat Enterprise Linux的高度兼容性,使得用户可以在不改变现有基础设施的情况下,享受到Oracle提供的技术支持。 Oracle ...

    oracle删除和重建实例

    删除和重建 Oracle 实例 Oracle 数据库是一种关系型数据库管理系统,广泛应用于企业级数据库应用中。然而,在某些情况下,我们需要删除和重建 Oracle 实例,以便解决一些问题或进行升级维护。在这篇文章中,我们将...

Global site tag (gtag.js) - Google Analytics