
简介该资源是面向 Windows 平台 Oracle 19c 数据库运维与开发人员的 TZ41 时区补丁包补丁编号 P35099667主要用于修复与时区TZ相关的性能、安全及稳定性问题更新时区数据库中的夏令时等规则保障跨时区数据处理与报表的准确性。压缩包共 10 个文件以 dat 数据文件、xml 配置文件和 txt 说明文档为主整体约 352KB体积小巧便于随取随用。目前已有 713 人学习下载适合需要为 Windows Server 2008 及以上环境打补丁的 DBA 参考。包内附带的 README 说明与配置项可帮助读者核对补丁内容、确认先决条件并结合 OPatch 流程完成安装与验证降低升级风险保持数据库合规与稳定运行。1. 一个 19c 补丁包为什么值得单独拆开讲手里拿到一个p35099667-190000-MSWIN-x86-64.zip文件名信息量其实很大补丁号 35099667、目标版本 19.0.0.0、平台 MSWIN x86-64。它对应的是 Oracle 19c 在 Windows 上的 TZ41 时区补丁。时区补丁这东西平时没人惦记一旦踩上就是硬伤——数据库里TIMESTAMP WITH TIME ZONE字段、调度任务、物化视图刷新时间全跟着偏移业务侧报出来的现象往往是“时间对不上”“任务提前跑了”排查半天才发现是 DST 规则库过期。这个包解决的就是把 19c 的时区数据升到 TZ41 版本适合还在维护 19c Windows 实例、又不想整体打大补丁的 DBA。下面按“先搞清它改了什么再动手最后说坑”的顺序拆。2. TZ41 到底动了什么时区文件与版本号的关系2.1 时区补丁不是改注册表是换数据文件Oracle 的时区支持靠一组内部数据文件承载TZ 版本号TZ38、TZ39、TZ41 这种对应的是 IANA 时区数据库的某次发布快照。每次发布可能包含某些国家调整 DST 起止日期、新增时区名、废弃旧别名。补丁做的事本质上是把这些数据文件替换成新版本同时更新数据字典里记录的TZ_VERSION。所以判断一个库要不要打最直接的办法不是看补丁号而是查当前版本-- 查当前数据库的时区文件版本 SELECT * FROM v$timezone_file; -- 19c 常见输出 TZ_VERSION 为 31/32/36 等低于 41 就说明落后v$timezone_file返回的VERSION就是当前生效的 TZ 版本。如果业务涉及跨时区存储、或者有依赖 DST 规则的定时任务版本落后就可能在某次 DST 切换后出现一小时偏差。这里要区分两个概念DBTIMEZONE是数据库时区设置SESSIONTIMEZONE是会话时区它们和 TZ 版本是两回事——版本决定的是“规则库新旧”不是“你用哪个时区”。很多人把这两者混为一谈结果补丁打完了发现时间还是不对其实是会话时区配错了。2.2 为什么 Windows 平台要单独一个包Oracle 补丁按平台分发MSWIN-x86-64就是 Windows 64 位。Windows 上的打补丁流程和 Linux 差异不小没有opatch直接跑那么简单涉及服务停止、ORACLE_HOME下的 DLL 替换、以及可能的catupgrd类脚本执行。这个包是“单补丁”形态不是 RURelease Update意味着它只含时区相关改动体积小、影响面窄适合不想动大版本的用户。但窄不等于无风险后面避坑章节会讲几个典型翻车点。2.3 打之前必须确认的三件事第一确认ORACLE_HOME和实例版本严格匹配 19.0.0.019c 的小版本差异会导致 opatch 报冲突。第二确认 opatch 工具本身版本够新老 opatch 认不出新补丁的元数据。第三确认有可回退的备份——时区补丁虽然小但数据字典更新是不可逆的回退只能靠还原。常见做法是先做一次冷备或者 RMAN 全备再动补丁。这三件事任何一件没做后面出问题就只能干瞪眼。3. 在 Windows 上落地从解压到验证的完整链路3.1 环境准备与 opatch 版本核对先把 zip 解压到一个不含空格和中文的路径比如D:\patch\35099667。然后以管理员身份打开 cmd设置环境变量指向目标库的ORACLE_HOME-- 注意这是 Windows cmd 环境不是 SQL set ORACLE_HOMED:\app\oracle\product\19.0.0\dbhome_1 set PATH%ORACLE_HOME%\OPatch;%ORACLE_HOME%\bin;%PATH% opatch versionopatch version输出如果低于 12.2.0.1.17 这类较新版本建议先升级 opatch否则opatch apply可能直接报 “Patch is not applicable”。opatch 升级本身也是替换ORACLE_HOME\OPatch目录操作前把旧目录改名备份。这一步看着琐碎但老 opatch 是 Windows 打补丁最常见的第一个拦路虎。3.2 停库、停服务与补丁应用Windows 上打补丁前必须停掉所有相关服务包括 OracleService 和监听。用srvctl或服务管理器都行关键是确认没有残留进程占用ORACLE_HOME下的文件-- 停监听与实例服务服务名按实际实例名替换 lsnrctl stop net stop OracleServiceORCL -- 确认无 oracle.exe 残留 tasklist | findstr oracle确认干净后进入补丁目录执行应用。opatch apply会做冲突检测、文件替换、以及调用补丁自带的 SQL 脚本更新数据字典cd /d D:\patch\35099667 opatch apply -- 过程中会提示是否继续确认无冲突后输入 y -- 结束后检查日志D:\patch\35099667\*.log参数上没什么可调的opatch apply默认就会跑postinstall脚本。真正要看的是输出末尾有没有OPatch succeeded以及日志里有没有Warning级别的 SQL 报错。有些环境会因为数据字典里有自定义对象导致脚本部分失败这种失败不一定会让 opatch 整体报错必须翻日志确认。3.3 启动后验证 TZ 版本与时间行为补丁应用完启动服务和实例然后回到 SQL 层验证-- 启动后确认版本已变为 41 SELECT * FROM v$timezone_file; -- 检查数据字典里的时区版本记录 SELECT parameter, value FROM nls_database_parameters WHERE parameter LIKE %TIMEZONE%; -- 用一个跨 DST 的时间点做行为验证 SELECT TZ_OFFSET(America/New_York) FROM dual;v$timezone_file的VERSION变成 41 才算真正生效。如果还是旧值说明 postinstall 脚本没跑成功需要手动执行补丁目录下的 SQL。另外建议拿一个已知的 DST 切换日期做一次FROM_TZ转换测试确认偏移符合 TZ41 的规则而不是只看版本号——版本号对了但规则没加载的情况虽然少见但确实存在。4. 避坑与排查五个真实会翻车的点4.1 现象opatch 报 “Patch already installed”原因通常是之前打过同系列补丁但没清理或者ORACLE_HOME里残留了补丁元数据。解决是先opatch lspatches看已装列表确认是否真的重复如果是残留用opatch rollback -id 35099667回退后再重打。别直接删 inventory 文件那会让后续补丁管理彻底乱套。4.2 现象补丁应用成功但v$timezone_file仍是旧版本原因是 postinstall 的 SQL 脚本执行失败常见于数据字典有无效对象或权限不足。解决是翻 opatch 日志找到失败的 SQL手动以SYS身份在ORACLE_HOME\rdbms\admin下执行对应脚本再重启实例。这个坑最隐蔽因为 opatch 整体返回成功不翻日志根本发现不了。4.3 现象启动实例报 ORA-00600 或数据字典不一致多半是补丁过程中服务没停干净文件被占用导致部分 DLL 替换失败。解决是停库后确认tasklist无 oracle 进程重新opatch apply覆盖必要时先 rollback。Windows 上文件锁比 Linux 严格得多这是平台特性带来的额外风险。4.4 现象业务时间仍然偏移一小时先别怀疑补丁查SESSIONTIMEZONE和客户端时区设置。TZ 版本只决定规则库不决定你用哪个时区。用SELECT SESSIONTIMEZONE, DBTIMEZONE FROM dual确认再看应用连接串有没有显式设时区。很多“补丁没用”的结论其实是配置问题。4.5 现象回退后数据字典报错时区补丁的数据字典更新不可逆opatch rollback只回退文件不回退已执行的 SQL。所以回退前必须有补丁前的完整备份靠 rollback 命令本身不够。这是最容易让人产生“有后悔药”错觉的地方血泪经验就是打之前备份别指望 rollback 兜底。5. 进阶把时区版本纳入日常巡检与升级决策打完这个补丁不算完时区数据会持续更新TZ41 之后还会有新版本。我一般会把v$timezone_file的版本查询塞进日常巡检脚本和表空间、告警日志一起跑版本落后就提前排期。下面这个查询可以直接放进监控-- 巡检用时区版本 当前时区配置一屏看完 SELECT TZ_VERSION AS item, TO_CHAR(version) AS val FROM v$timezone_file UNION ALL SELECT DBTIMEZONE, dbtimezone FROM dual UNION ALL SELECT SESSIONTIMEZONE, sessiontimezone FROM dual;判断要不要跟进新补丁看两点业务是否涉及跨时区时间运算以及是否有依赖 DST 的调度。两者都不涉及的库可以缓一缓涉及的就别拖DST 切换一年两次错过窗口就得等半年。另外单补丁和 RU 的选择上如果实例已经落后多个 RU单独打时区补丁只是止血长远还是得规划一次 RU 升级否则补丁冲突会越来越难处理。还有一个容易被忽略的点应用侧和数据库侧的时区认知要一致。数据库升到 TZ41 了但中间件或客户端 JDBC 驱动如果自带旧时区缓存照样会算错。验证时最好从应用连接实际跑一条带时区转换的查询而不是只在 sqlplus 里看。我现在的习惯是任何时区相关补丁打完都强制走一遍“版本查询 DST 边界转换 应用侧实测”三步少一步都可能留下隐患。希望帮到你。本文还有配套的精品资源点击获取