ORA-39405: Oracle Data Pump 时区升级

Posted 翰墨文海 QQ1319820057

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ORA-39405: Oracle Data Pump 时区升级相关的知识,希望对你有一定的参考价值。

客户端数据库版本是19.3

而导出的数据库版本是19.4,19.8的版本。

现在需要将19.3数据库端导出的expdp备份导入亚马逊云的数据库(19.4,19.8版本),提示如下:

  不支持从 TSTZ 版本为33 的源数据库导入到 TSTZ 版本为 32 的目标数据库,这个错误是因为数据库时区版本不一致造成的,并且是源数据时区版本高。目标数据库时区版本低。目标数据库时区版本高也可以导入。

步骤一:升级到版本19.8(这一步多余,不需要升级)

查看源端和目标端数据库的时区以及补丁版本:

 

 

  

 

 

 

由于我的是windows单机的19c,所以升级比较简单,需要关闭数据库。

停止监听金额数据库,解压补丁包,替换吊OPATCH TOOL。

SET ORACLE_HOME=F:\\app\\Administrator\\19c\\product\\19.0.0\\dbhome_1

set PATH=%ORACLE_HOME%\\bin;%PATH%;%SystemRoot%/system32;%SystemRoot%;F:\\app\\Administrator\\19c\\product\\19.0.0\\dbhome_1\\OPatch

进入补丁解压目录:F:\\app\\Administrator\\p31247621_190000_MSWIN-x86-64\\31247621

opatch apply

 

开库执行 datapatch 脚本:

alter pluggable database all open; --我的库没有,不需要执行这一步。

cd F:\\app\\Administrator\\19c\\product\\19.0.0\\dbhome_1\\OPatch

datapatch -verbose

 

进行验证:

 

 两台都升级成功了。

 

 比较坑的是19.8任然是没有天坑,所以后面我单独找了补丁包28852325,但是19c windows的补丁包没有这个补丁(linux和aix有),所以我说下载的下一个补丁29997937(34时区的,直接跳过33了)。

步骤二:时区补丁29997937(也可以是任何大于33时区的)(不需要关闭数据库和监听)

 

 

 但是时区还是的修改,数据库已经存在了。

 

 

启动数据库后编译失效的对象。  

@F:\\app\\Administrator\\19c\\product\\19.0.0\\dbhome_1\\rdbms\\admin\\utlrp.sql

select DBMS_DST.get_latest_timezone_version from dual;

 

DECLARE
l_tz_version PLS_INTEGER;
BEGIN
l_tz_version := DBMS_DST.get_latest_timezone_version;
DBMS_OUTPUT.put_line(\'l_tz_version=\' || l_tz_version);
DBMS_DST.begin_prepare(l_tz_version);
END;
/

 

col property_name for a30
col property_value for a20
select property_name, property_value from database_properties where property_name LIKE \'DST_%\' order by property_name;

 

  

 --顺序执行执行以下语句:

--以下是受影响的时区的表

TRUNCATE TABLE sys.dst$affected_tables;
TRUNCATE TABLE sys.dst$error_table;

EXEC DBMS_DST.find_affected_tables;

select * from sys.dst$affected_tables;
select * from sys.dst$error_table;
EXEC DBMS_DST.end_prepare;

--升级时区,以upgrade模式启动
SHUTDOWN IMMEDIATE
STARTUP UPGRADE

SET SERVEROUTPUT ON
DECLARE
l_tz_version PLS_INTEGER;
BEGIN
select DBMS_DST.get_latest_timezone_version into l_tz_version from dual;
DBMS_OUTPUT.put_line(\'l_tz_version=\' || l_tz_version);
DBMS_DST.begin_upgrade(l_tz_version);
END;
/


SHUTDOWN IMMEDIATE
STARTUP

--升级 ZONE 文件:会影响所有具有TIMESTAMP WITH TIME ZONE数据类型的表

SET SERVEROUTPUT ON
DECLARE
l_failures PLS_INTEGER;
BEGIN
DBMS_DST.upgrade_database(l_failures);
DBMS_OUTPUT.put_line(\'DBMS_DST.upgrade_database : l_failures=\' || l_failures);
DBMS_DST.end_upgrade(l_failures);
DBMS_OUTPUT.put_line(\'DBMS_DST.end_upgrade : l_failures=\' || l_failures);
END;
/

SELECT * FROM v$timezone_file;

 

 

 

 

 

 

 

 

 

 更新成功。

 虽然找不到33时区版本,但是可以impdp了。

impdp ttfc/xxxx directory=RDS_CLD_4 network_link=RDS_CLD_4 dumpfile=RDS_CLD_4_20210611_1259.DMP  logfile=20210613_imp.log TABLES=SBTTFC.RPT_USER_GAME_SUM,SBTTFC.RPT_USER_INDEX_INFO,SBTTFC.RPT_ACC_SUBJECT_BAL remap_schema=sbttfc:ttfc

 

 

以上是关于ORA-39405: Oracle Data Pump 时区升级的主要内容,如果未能解决你的问题,请参考以下文章

使用 C# 和 Oracle 在存储函数中传递参数

Oracle函数

JDBC连接oracle数据库

JDBC连接oracle数据库

单项链表

数据高级2