
简介面向Oracle数据库管理员及运维工程师这是一款用于Windows Server 2008及以上环境的Oracle 19c时区TZ41补丁官方编号P35099667主要解决跨时区数据处理、夏令时切换、时区数据库过期等问题避免时间显示异常、数据记录偏差及潜在安全漏洞。压缩包共10个文件以6个dat时区数据文件为核心配合2个xml配置清单和2个txt说明文档整体约352KB结构紧凑便于快速核对文件构成与用途。目前已有697人学习下载尤其适合金融机构、电商、跨国企业等对时间准确性敏感的业务系统。补丁内dat与xml内容用于同步最新全球时区规则与夏令时信息能够减少因时区不一致导致的数据错误和合规风险确保Oracle数据库在更新后保持稳定、高效运行该包体积小、文件内聚可作为生产环境时区维护的常备工具。 接手一台 Windows Server 上的 Oracle 19c运维群里丢过来一个补丁包p35099667-190000-MSWIN-x86-64.zip备注就一句话——“TZ41 补丁尽快打”。第一次见到这种命名的人很容易懵这是安全补丁小版本升级还是跟那个 TZ 版本号有什么关系这篇就把这个补丁包讲透包含它是什么、为什么业务系统需要它、Windows 环境下怎么打、打完补丁还要做什么以及我实际踩过的几个坑。如果你还没装好 Oracle 19c这篇不是安装教程而是装好之后、业务上线前最容易被忽略的一个环节时区数据更新。不管你是 DBA、运维还是自己搭库学习的人只要手里拿到一个带 TZ 字样的补丁包这篇都值得看完再动手。1. 这个补丁包到底是什么读懂文件名与业务场景1.1 文件名逐段拆解先把这个文件名拆开看Oracle 的补丁命名其实很规律读懂了就不会拿错文件。p35099667这是 My Oracle SupportMOS上的补丁号去 support.oracle.com 搜索这个编号就能看到对应的 README 和下载页面所有官方说明都挂在这个号码下面。190000对应数据库版本 19c完整写法是 19.0.0.0.0。看到这个段就知道它是给 19c 用的不是给 11g、12c 或 21c 用的。MSWIN平台标识这是 Microsoft Windows 平台专用包。同一个补丁号在 Linux 上会是p35099667_190000_Linux-x86-64.zip这种命名。新手最容易在这里栽跟头——下载成 Linux 包在 Windows 上 opatch apply 会直接报错浪费半天时间。x86-6464 位架构。现在的服务器基本都是 x86-64如果是纯 32 位 WindowsOracle 19c 本身已经不太推荐了。还要注意一个细节这是个.zip压缩包不是直接给 opatch 用的目录。下载后先解压再对解压出来的目录执行opatch apply把 zip 直接传给 opatch 会报“补丁目录不存在”。1.2 为什么业务系统会需要 TZ41 补丁TZ 补丁是“时区补丁”。Oracle 数据库内置了一份全球时区规则快照包含标准 UTC 偏移、夏令时DST切换规则、时区简称等数据。这套数据不是永远不变的——全球不同地区会不定期调整夏令时规则比如修改切换日期、取消夏令时、调整标准时区等等具体地区我就不点名了各地政策调整的原因比较多样。如果你的业务只在一个固定地区跑且所有时间字段都用不带时区的TIMESTAMP可能感觉不到变化。但只要程序用了TIMESTAMP WITH TIME ZONE或者通过AT TIME ZONE/FROM_TZ做跨时区转换时区规则陈旧就会导致转换结果错误。就算你完全不用带时区的类型只要业务涉及“本地时间到底对应哪一个 UTC 时刻”的计算——比如计费、排程、交易时间切片——也会受影响。我实际遇到过一次因为时区规则更新日志采集程序拿到的 UTC 时间没有按新规则转换导致一批结算数据差了一个小时。定位问题花了一整天最后发现是数据库时区文件版本太老。所以 TZ 补丁不是“可打可不打”的优化项而是数据准确性层面的必要维护。1.3 时区版本与数据库版本的关系Oracle 把时区文件的版本编号成数字比如 40、41。当前数据库用的是哪个版本直接查SELECT VERSION FROM V$TIMEZONE_FILE;打完 TZ41 补丁后数据库安装目录里的时区文件会变成 41 版但这里有个很容易误解的地方补丁应用和数据库内部时区升级是两件事。很多 DBA 以为opatch apply完就万事大吉结果一查V$TIMEZONE_FILE还是 40就慌了。其实这是正常的第 3 节我会专门讲数据库内部的时区升级步骤。如果你想看更全面的时区文件背景和方法论MOS 文档 412160.1Overview of Database Time Zone Files是权威参考所有版本升级步骤都以它为准。2. 打补丁前的准备工作这步偷懒后面全是眼泪2.1 环境信息核查清单打补丁前先花十分钟做环境核查能省掉后面三个小时的排查。我每次操作前都会逐项确认数据库版本SELECT * FROM V$VERSION;确认是 19c。补丁平台核对下载的是 MSWIN 还是 Linux 包架构是 x86-64。已安装补丁opatch lsinventory看看有没有和 35099667 冲突的补丁。如果之前装过自定义补丁可能需要先移除冲突项。当前时区版本SELECT VERSION FROM V$TIMEZONE_FILE;记录下来升级前后对比用。OPatch 工具版本opatch version。这个是 Windows 平台上最常见的失败点下面单独说。Windows 上 opatch 的路径一般是%ORACLE_HOME%\OPatch\opatch.bat。有些环境安装了 Oracle 19c 后从没升级过 OPatch版本会比较旧而新出的补丁对 OPatch 版本要求越来越高。2.2 OPatch 版本与补丁依赖每一个补丁包解压后的 README.html 里都会写清楚 OPatch 的最低版本要求。我遇到过的 19c 时区补丁一般要求 OPatch 版本在某个具体版本以上例如 README 中会写明“请确保 OPatch 版本不低于 12.2.0.1.x”这种字样具体以你这个补丁包里的 README 为准。如果当前 OPatch 版本不满足要求需要去 MOS 下载对应版本的 OPatch 工具覆盖安装。升级 OPatch 前建议先把原目录备份一下比如把%ORACLE_HOME%\OPatch复制成OPatch_bak。这样万一新版本工具异常还能切回去。另外OPatch 依赖 Java 运行环境Windows 上如果 Java 环境变量损坏opatch 会报“无法定位 Java 运行时环境”这时候检查JAVA_HOME和PATH里的 java 路径是第一步。2.3 备份策略打补丁本质上是修改 ORACLE_HOME 里的二进制文件风险虽然不高但出了问题恢复成本很高。我建议至少做三层备份数据库备份生产库一定要有最近的 RMAN 全备或至少是可恢复的备份。如果条件有限也至少要把关键业务表的数据导出一份。ORACLE_HOME 备份Windows 下整体复制 ORACLE_HOME 往往不现实但至少备份%ORACLE_HOME%\OPatch和%ORACLE_HOME%\oracore\zoneinfo这两个目录。打完补丁如果发现时区文件异常这两个目录能帮你手动恢复。注册表备份Windows 平台的 Oracle 把大量服务信息写进注册表打补丁前用reg export把 Oracle 相关注册表项导出一份。平时排障、卸载、清理残留都用得上。很多搜“如何卸载 oracle19c 注册表”的问题本质上就是没留好备份卸载时找不到哪些键值该删。3. Windows 平台上的 TZ 补丁安装实操3.1 下载与解压的坑补丁解压这一步看起来简单但我见过不少人在这一步翻车。第一下载后先校验文件大小和 MOS 页面上标注的大小对比一下。文件不完整会导致解压报“CRC 校验错误”这种 zip 直接删了重下不要在损坏文件上浪费时间。第二解压到纯英文路径。我习惯放在C:\oracle_patches\35099667这种层级简单的目录。千万不要放到中文路径或带空格的路径里比如C:\Users\张三\新建文件夹\35099667后面 opatch 经常报一些莫名其妙的错比如“无法定位到 Java 运行时环境”“Open file failed”其实根子就是路径里出现了无法识别的字符。第三解压后先打开 README.html 看一眼。有人图省事README 都不看就直接 apply结果漏掉前置条件报错了才回头翻文档。至少看三处最低 OPatch 版本、是否有其他冲突补丁、是否需要在 apply 前停掉特定服务。3.2 停服务与打补丁命令Windows 下打补丁前要把 Oracle 相关服务全部停掉。用管理员身份打开命令提示符执行net stop OracleServiceORCL net stop OracleOraDB19Home1TNSListener这里的OracleServiceORCL是实例服务ORCL是你实际的实例名监听服务名可能带版本号和 Home 名以你机器上services.msc里看到的实际名称为准。顺带把OracleVssWriterORCL、OracleMTSRecoveryService等服务也停掉干净利落。然后执行cd /d %ORACLE_HOME%\OPatch opatch apply C:\oracle_patches\35099667opatch 会先做预检查检查通过后会显示补丁信息并询问是否继续输入y回车。整个 apply 过程在普通虚拟机上大概二十分钟到半小时生产机看磁盘速度。看到OPatch succeeded字样并且退出码为 0才算成功。日志会写到%ORACLE_HOME%\cfgtoollogs\opatch\opatch_日期_时间.log。这里我要特别提醒apply 过程中千万不要因为界面长时间没输出就 CtrlC 或重启机器。有人看到 opatch 卡在某个百分比半小时不动以为死机了强杀进程结果 opatch 状态不一致后面手工清理更麻烦。耐心等日志在写就说明没死。3.3 数据库时区版本升级最容易漏的一步opatch apply做完只更新了安装目录里的时区文件。数据库数据字典里记录的时区版本不会自动跟着变。要完成数据库内的时区升级需要进入 SQL*Plus 操作。这一步是最多人漏掉的漏掉之后数据库反复出现时间处理异常查半天才发现时区版本没升。第一步预检sqlplus / as sysdba SQL C:\app\oracle\product\19.0.0\dbhome_1\rdbms\admin\utltzuv2.sql这个脚本会扫描当前库中所有使用到TIMESTAMP WITH TIME ZONE等时区相关类型的数据评估升级到 TZ41 后会有哪些行受影响输出类似update.txt的报告。报告里如果提示有非法时区数据或冲突需要先处理。比如有的历史数据使用了非标准的时区简称升级后可能会成为无效数据这时候要先人工确认是否修正。第二步正式升级SQL SHUTDOWN IMMEDIATE; SQL STARTUP UPGRADE; SQL C:\app\oracle\product\19.0.0\dbhome_1\rdbms\admin\utltzu_upgrd.sql脚本执行时间取决于库中涉及时区类型的数据量可能几分钟也可能几小时。执行完成后SQL SHUTDOWN IMMEDIATE; SQL STARTUP; SQL SELECT VERSION FROM V$TIMEZONE_FILE;VERSION 变成 41才算真正完成。关于回滚要特别注意如果只是在 opatch 阶段发现问题可以用opatch rollback -id 35099667回滚补丁。但如果数据库时区已经升级到 41再回滚补丁就有风险了可能导致二进制时区文件与库内时区版本不一致数据库启动时或运行时出现异常。所以在正式环境操作时尽量一次评估好、一次做完不要边打边改。4. 常见报错排查与 Windows 环境专属坑4.1 高频报错速查表整理一份我在 Windows 上给 Oracle 19c 打补丁时遇到的高频报错按排查顺序排列报错特征常见原因处理方式PREREQ_OPATCH_VERSION_FAILEDOPatch 版本低于补丁要求先升级 OPatch 再重试Invalid patch type或patch not found平台包选错或 zip 未解压确认 MSWIN/x86-64 包解压完整路径后重试Open file failed解压路径含中文、空格或特殊字符放到C:\oracle_patches\35099667这类纯英文路径Exception in thread main java.lang...Java 环境异常或被杀毒软件拦截检查 JAVA_HOME临时关闭实时防护后重试database still up/RDBMS server is activeOracle 服务没停干净net stop停掉所有 Oracle 服务后再 applyAccess Deniedcmd 不是管理员权限右键“以管理员身份运行”命令提示符4.2 Windows 平台与 Server 2022 环境的特殊注意点Windows 上打 Oracle 补丁和 Linux 有些差异这套流程我在 Windows Server 2022 上实际验证过整体兼容性没问题但有几个点要单独注意。权限问题是头号杀手。Windows 的 UAC 机制下普通权限的 cmd 即使能打开,写 ORACLE_HOME 下的文件也可能失败。所以一开始就用管理员身份打开命令提示符不要等到 Access Denied 才想起来。杀毒软件实时防护要留意。有些杀毒软件会把 opatch 临时释放的脚本或可执行文件当威胁处理导致 apply 中断。我一般会在操作期间临时关闭针对 ORACLE_HOME 目录的实时防护打完补丁立刻恢复。如果你所在的团队有安全合规要求至少把%ORACLE_HOME%目录加到排除列表。中文系统编码问题。打补丁时如果日志出现中文乱码不用紧张那是控制台代码页和工具输出的编码不一致不影响补丁结果。但不要把补丁解压到中文路径这一点前面说过Windows 中文环境下更容易触发。注册表和服务残留的问题Windows 平台特有。如果补丁中途失败服务列表里可能残留半拉子服务影响后续重试。排查时可以用sc query查看具体服务状态确认为残留服务后可考虑sc delete清理。注意别删到正常的数据库服务建议先备份相关注册表项。以后如果彻底卸载 Oracle 19c清理注册表项时也建议在操作前先导出备份避免误删系统级键值。4.3 打完之后怎么验证才算真正收尾补丁打完不是终点我会按这个清单过一遍才算收尾opatch lsinventory能看到 35099667 已应用。SELECT VERSION FROM V$TIMEZONE_FILE;返回 41。抽查几条跨时区数据和应用侧预期的 UTC 偏移做对比。确认监听服务和数据库实例恢复正常。通知业务方“时区规则已更新”——这一点很重要因为升级后涉及历史时间戳的 UTC 表示可能发生变化业务侧需要知道背景。另外说一个我个人的操作习惯我会把所有要执行的命令和 SQL 提前写在一个文本文件里实际执行时一行一行复制到窗口避免手误。同时把补丁包、opatch 日志、预检报告放在同一个目录下事后回溯问题时非常方便。最后再分享一个经验。这次我在 Windows Server 2022 上加 Oracle 19c 的 TZ41 补丁最花时间的不是 apply反而是utltzu_upgrd.sql在跑的时候——库里有大量历史跨时区数据等了接近一个小时。如果你负责的库也有类似情况提前和业务窗口对齐别在快下班时才动手。还有预检报告utltzuv2.sql的输出一定要逐条看别只瞄一眼影响行数就跳过。很多时候系统运行得好好的突然某个月报表对不上根子就在于时区规则更新后没有处理这些历史数据。把这层想清楚再动手比事后回滚省心太多。本文还有配套的精品资源点击获取