
简介面向 Oracle DBA 与数据库运维人员的时区版本升级脚本包用于将数据库时区版本调整至较新版本通常配合官方时区补丁使用。包内共 4 个 SQL 文件压缩包约 16KB体量轻便主要包含升级前检查、时区调整应用以及相关统计辅助脚本并附有执行顺序说明先运行检查脚本评估环境再执行应用脚本完成调整便于在变更前确认兼容性与影响范围。已有 1693 人学习适合需要处理时区版本不一致、补丁配套升级或升级前预检的运维场景。脚本以 SQL 形式组织方便在 SQL*Plus 等环境中按说明逐步执行可作为时区版本调整的辅助工具帮助读者快速完成环境核查、变更实施与结果验证降低手工操作遗漏风险。1. 凌晨两点的 ORA-01805多半是时区文件版本没对齐去年冬天一个报表库半夜跑批失败报ORA-01805: possible error in date/time operation诡异的是同一条 SQL 在数据库服务器上手工执行正常应用连上来就报错。查了两个小时才定位数据库用的时区文件和应用服务器上客户端带的时区数据差了三四个版本两边对同一个TIMESTAMP WITH TIME ZONE值的偏移解释不一致SQL 里只要带AT TIME ZONE、FROM_TZ或者跨时区比较就必然报错。这类问题不是改 SQL 能解决的动的是数据库的时区版本time zone file version。手工做一遍要走BEGIN_PREPARE → UPGRADE_DATABASE → END_PREPARE → BEGIN_UPGRADE → UPGRADE_DATABASE → END_UPGRADE六个动作中间还得配合只读窗口、错误表排查、版本校验漏一步就白跑。这份 DBMS_DST_scripts V1.9 干的就是把这一串按顺序固化成可重复执行的脚本包。它适合手里有含 TSTZ 列的老库、要在可控停机窗口里做一次时区版本抬升的运维和 DBA也适合第一次做这件事、想先照着一份能跑的流程走一遍的人。如果库里一个 TSTZ 列都没有那用不上它换掉 tzfile 重启就完事。2. 拆包看结构V1.9 封的是三段窗口和两张错误表2.1 时区文件是张映射表升级动的是存量数据的偏移解释先把概念掰清楚不然容易把时区版本升级当成改参数。Oracle 的时区规则放在$ORACLE_HOME/oracore/zoneinfo/下文件名形如timezlrg_N.dat、timezone_N.datN 就是版本号。这个文件里存的不是北京时间等于 UTC8这种常量而是一张地区 → 历史偏移规则的映射表包含历次夏令时的起止时间点。某个地区调整过一次切换日期就要出一个新版本。v$timezone_file告诉你当前数据库正在用第几版v$timezone_file_supplied列出这套 ORACLE_HOME 里实际放了几份、都到第几版。两个视图一对你就知道能不能升、能升到几。关键在于 TSTZ 列的物理存储内部记的是 UTC 时刻加一个偏移量不存地区名。数据库没有这条数据属于哪个地区的信息一旦规则被修正旧数据里那个裸偏移量就没有办法再反推回正确的绝对时刻。所以升级动作本质是按新规则把每一行 TSTZ 值重算一遍写回新的内部表示。这也解释了为什么改DBTIMEZONE、ALTER SESSION SET TIME_ZONE全都没用——它们只影响显示不碰存量数据。一个直白的例子某地区把夏令时起点从 3 月最后一个周日改到第二个周日落在这一小时里的历史数据按旧规则反推的 UTC 时刻会比正确值差 3600 秒。升级之后这批行的显示值可能平移一小时这是正常现象不是脚本写错了。2.2 三条路径选错会白白多停两小时脚本包一般会把三种做法都留出入口按库的体量选路径动作序列停机特征适用场景单段式BEGIN_UPGRADE→UPGRADE_DATABASE→END_UPGRADE全程停机时长约等于全量扫 TSTZ 表库不大、TSTZ 表少、能停够时间两段式BEGIN_PREPARE→UPGRADE_DATABASE试跑→END_PREPARE→BEGIN_UPGRADE→UPGRADE_DATABASE→END_UPGRADE试跑段不停机正式段停机生产库、表多、不敢一次压上只换 tzfile替换oracore/zoneinfo下文件后重启一次重启库内无 TSTZ 数据只需版本对齐两段式是我默认选的理由不是更稳这种空话而是试跑段能提前把所有转换异常的行炸出来。UPGRADE_DATABASE在 prepare 窗口里跑完不落盘END_PREPARE会把改动回滚代价只是多扫一遍表的 IO 和时间。生产库上这一遍能换到正式窗口里不会因为脏数据中途停很划算。第三个路径容易被误解只换 tzfile 只让二进制认识新规则存量 TSTZ 数据仍按旧规则存着客户端版本对齐的问题能解决数据层面的一致性问题解决不了。2.3 包里各脚本的分工脚本包各版本文件名略有出入按功能对号入座即可不要死记名字。功能分区典型内容依赖对象什么时候跑环境体检查v$timezone_file、v$timezone_file_supplied、TSTZ 列清单、行数估算数据字典视图窗口前一周影响面分析调DBMS_DST.FIND_AFFECTED_TABLES输出受影响的表和时区列表DBMS_DST窗口前一周试跑段BEGIN_PREPAREUPGRADE_DATABASE错误写进DST$ERRORSDBMS_DST低峰期可反复跑正式段END_PREPARE、BEGIN_UPGRADE、UPGRADE_DATABASE、END_UPGRADEDBMS_DST停机窗口内校验段版本核对、快照比对、失效对象统计上一阶段产物正式段结束后立刻清理段删快照表、删错误表、删临时基线表SYS 权限观察期结束后2.4 这份包管不到的三件事别指望一个 SQL 脚本包把周边全包了有三块必须自己收尾。一是客户端侧。应用服务器上 Oracle Client 的 tzfile、JDBC 驱动自带的时区数据、甚至某些语言的运行时库都有自己的一份时区规则。数据库升到新版本、客户端还停在旧版本ORA-01805照样复现。升级前后要逐个节点核对这一条我吃过亏。二是主备架构。主库做的升级会通过 redo 传到备库但备库的二进制里必须已经包含新版本 tzfile否则 apply 会直接停住。顺序是先把所有节点的二进制和补丁对齐再在主库动数据本文还有配套的精品资源点击获取