最近做 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)
- 迁移方式:
expdp到impdp
导入时报错:
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$ROOT 和 PDB$SEED 仍为 43,而业务 PDB 升级到 45,是一个可用配置。
从管理角度看,Root、PDB$SEED、业务 PDB 保持一致更方便。但为了完成单个业务 PDB 的导入,只升级目标 PDB 就足够了。
这次问题的核心结论是:RU 版本高不代表 TSTZ Version 高;当目标库 TSTZ Version 低于源库时,Data Pump 会拒绝导入。把目标 PDB 升级到相同或更高的 Time Zone Version 后,即可解决问题。
关注我,和AI一起成长~