impdp 遇到 TSTZ Version 报错:ORA-39405 处理实践

最近做 Oracle 数据库迁移时,笔者在 impdp 阶段遇到一个典型报错:源库的 TSTZ Version 比目标库高,导致 Data Pump 直接拒绝导入。这个问题容易被误判成 RU 版本问题,但真正关键点在 Time Zone Version。

01 | 问题现象与原因

迁移环境如下:

  • 源库:Oracle Database 23.26.1(ODA)
  • 目标库:Oracle AI Database 26ai(23.26.2,自建 CDB/PDB)
  • 迁移方式:expdpimpdp

导入时报错:

sql 复制代码
ORA-39002: invalid operation
ORA-39405: Oracle Data Pump does not support importing from a source database
with TSTZ version 44 into a target database with TSTZ version 43.

一开始容易疑惑:目标库 RU 已经更高,为什么 Time Zone Version 反而更低?

原因是 Database RU 和 Time Zone Version 是两套独立版本体系。升级 RU 或 Oracle Home,并不会自动升级数据库当前使用的 Time Zone Version。

可以在目标库查看当前 Time Zone Version:

sql 复制代码
SELECT * FROM v$timezone_file;

结果显示目标库仍是:

text 复制代码
timezlrg_43.dat 43

再查看 Oracle Home 支持的最新 Time Zone Version:

sql 复制代码
SELECT dbms_dst.get_latest_timezone_version FROM dual;

结果为:

text 复制代码
45

这说明 Oracle Home 已经支持 Version 45,但目标数据库本身仍停留在 Version 43。因此,当导入来自 TSTZ Version 44 的 dump 时,Data Pump 会报 ORA-39405

02 | 只升级目标 PDB 即可解决

本次场景不需要重新建库,也不需要重新导出。只要把目标业务 PDB 的 Time Zone Version 升级到与源库相同或更高即可。

先切换到目标 PDB:

sql 复制代码
ALTER SESSION SET CONTAINER=DATACLAWPDB;

以 Upgrade 模式打开 PDB:

sql 复制代码
ALTER DATABASE OPEN UPGRADE;

开始升级窗口,这里使用 Oracle Home 当前支持的最新版本 45

sql 复制代码
BEGIN
 DBMS_DST.BEGIN_PREPARE(45);
END;
/

BEGIN
 DBMS_DST.END_PREPARE;
END;
/

BEGIN
 DBMS_DST.BEGIN_UPGRADE(45);
END;
/

然后重启 PDB:

sql 复制代码
SHUTDOWN IMMEDIATE;
STARTUP;

升级所有 TSTZ 数据:

sql 复制代码
SET SERVEROUTPUT ON;

DECLARE
 l_failures BINARY_INTEGER;
BEGIN
 DBMS_DST.UPGRADE_DATABASE(l_failures);
 DBMS_OUTPUT.PUT_LINE('Failures = ' || l_failures);
END;
/

如果输出中 Failures = 0,说明需要处理的对象已经成功升级。

最后结束升级窗口:

sql 复制代码
SET SERVEROUTPUT ON;

DECLARE
 l_failures BINARY_INTEGER;
BEGIN
 DBMS_DST.END_UPGRADE(l_failures);
 DBMS_OUTPUT.PUT_LINE('Failures = ' || l_failures);
END;
/

成功后再次确认:

sql 复制代码
SELECT * FROM v$timezone_file;

目标 PDB 显示为:

text 复制代码
timezlrg_45.dat
45

此时重新执行 impdp,不再出现 ORA-39405,导入可以正常通过。

补充一点:在多租户架构中,PDB 的 Time Zone Version 可以独立于 CDB$ROOT。也就是说,CDB$ROOTPDB$SEED 仍为 43,而业务 PDB 升级到 45,是一个可用配置。

从管理角度看,Root、PDB$SEED、业务 PDB 保持一致更方便。但为了完成单个业务 PDB 的导入,只升级目标 PDB 就足够了。

这次问题的核心结论是:RU 版本高不代表 TSTZ Version 高;当目标库 TSTZ Version 低于源库时,Data Pump 会拒绝导入。把目标 PDB 升级到相同或更高的 Time Zone Version 后,即可解决问题。

关注我,和AI一起成长~