ORA-39405→Oracle 19c DST 时区版本快速升级操作指南(CDB/PDB)
2026/9/12 15:58:03 网站建设 项目流程

一、DST 是什么?

DST(Daylight Saving Time)在 Oracle 中可以简单理解为数据库使用的全球时区规则版本

Oracle 通过时区文件维护这些规则,例如:

timezlrg_32.dat → DST 版本 32 timezlrg_43.dat → DST 版本 43

在进行 Data Pump 数据迁移时,如果源库 DST 版本高于目标库,例如:

源库:43 目标库:32

导入报错:

ORA-39405

因此,新数据库部署完成后,在正式impdp前,应先检查源库和目标库 DST 版本。版本一致无需处理;目标版本较低时再进行升级。


二、检查源库和目标库 DST 版本

源库和目标库分别执行:

SELECT filename, version FROM v$timezone_file;

例如:

源库: timezlrg_43.dat 43 目标库: timezlrg_32.dat 32

这种情况目标库需要升级。

如果源、目标版本已经一致,无需执行后面的 DST 升级操作


三、确认目标 Oracle Home 存在对应时区文件

例如源库是 43:

ls -l $ORACLE_HOME/oracore/zoneinfo/timezlrg_43.dat

文件存在即可继续。

也可以查看 Oracle Home 已安装的时区文件:

ls $ORACLE_HOME/oracore/zoneinfo/timezlrg_*.dat

注意:Oracle RU 更新后,Oracle Home 中可能已经包含新版时区文件,但已有数据库实际使用的 DST 版本不一定同步升级,所以最终以v$timezone_file查询结果为准。


四、升级 CDB$ROOT

登录数据库:

sqlplus / as sysdba

确认当前容器:

SHOW CON_NAME;

如果不是CDB$ROOT

ALTER SESSION SET CONTAINER=CDB$ROOT;

关闭所有业务 PDB:

ALTER PLUGGABLE DATABASE ALL CLOSE IMMEDIATE;

1. 执行官方检查脚本

SPOOL /tmp/utltz_upg_check.log @?/rdbms/admin/utltz_upg_check.sql SPOOL OFF

确认检查没有异常后,再进行正式升级。

2. 执行官方升级脚本

SPOOL /tmp/utltz_upg_apply.log @?/rdbms/admin/utltz_upg_apply.sql SPOOL OFF

升级过程中脚本可能自动重启数据库,不要人为中断或手工重启数据库

成功后会看到类似:

INFO: The RDBMS DST update is successfully finished.

完成后退出:

EXIT;

五、确认 CDB$ROOT 升级结果

重新登录:

sqlplus / as sysdba

执行:

SHOW CON_NAME; SELECT filename, version FROM v$timezone_file;

例如:

timezlrg_43.dat 43

说明 CDB$ROOT 已升级成功。


六、检查并升级业务 PDB

打开业务 PDB,例如:

ALTER PLUGGABLE DATABASE YJXTPDB OPEN; ALTER SESSION SET CONTAINER=YJXTPDB; SHOW CON_NAME; SELECT filename, version FROM v$timezone_file;

如果已经是:

timezlrg_43.dat 43

不需要继续升级。

如果仍然是旧版本,例如:

timezlrg_32.dat 32

则在当前业务 PDB 中继续执行官方脚本。

先检查:

SPOOL /tmp/YJXTPDB_utltz_check.log @?/rdbms/admin/utltz_upg_check.sql SPOOL OFF

确认没有异常后执行升级:

SPOOL /tmp/YJXTPDB_utltz_apply.log @?/rdbms/admin/utltz_upg_apply.sql SPOOL OFF

七、最终检查

升级完成后重新连接数据库。

检查 CDB$ROOT:

ALTER SESSION SET CONTAINER=CDB$ROOT; SELECT filename, version FROM v$timezone_file;

检查业务 PDB:

ALTER SESSION SET CONTAINER=YJXTPDB; SELECT filename, version FROM v$timezone_file;

最终确认:

源库 = 43 CDB$ROOT = 43 业务 PDB = 43

确认无误后,即可开始业务表结构和数据迁移。


八、日后快速操作流程

以后新建 Oracle 19c 数据库,按照下面流程操作即可:

安装 Oracle 19c ↓ 安装 RU 补丁 ↓ 创建 CDB / PDB ↓ 检查源库 DST ↓ 检查目标库 DST ↓ 版本一致? ↓是 ↓否 无需处理 检查 Oracle Home ↓ utltz_upg_check.sql ↓ utltz_upg_apply.sql ↓ 检查 CDB$ROOT ↓ 检查业务 PDB ↓ PDB 版本低则继续升级 ↓ 最终确认版本一致 ↓ 执行 impdp

最常用的 4 个命令

① 查询数据库当前 DST:

SELECT filename, version FROM v$timezone_file;

② 查看 Oracle Home 时区文件:

ls $ORACLE_HOME/oracore/zoneinfo/timezlrg_*.dat

③ Oracle 官方升级前检查:

@?/rdbms/admin/utltz_upg_check.sql

④ Oracle 官方执行升级:

@?/rdbms/admin/utltz_upg_apply.sql

操作原则:先查版本,不一致才升级;先升级 CDB$ROOT,再检查业务 PDB;最终确认 DST 版本满足迁移要求后,再进行 Data Pump 导入。

其中43YJXTPDB都只是示例。以后操作时,分别替换为实际目标 DST 版本实际业务 PDB 名称即可。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询