场景:从19.3导出的dump文件无法导入19.18,报错是不支持从 TSTZ 版本为340的源数据库导入到 TSTZ 版本为 32 的目标数据库
这个错误是因为数据库时区版本不一致造成的,并且是源数据时区版本高。目标数据库时区版本低。
下载补丁包p34698179,却无法应用补丁,提示补丁包冲突,原因是19.18已经有34698179补丁,却在$ORACLE_HOME/oracore/zoneinfo下没有对应40时区的文件
于是采用手动拷贝文件
1.将补丁包中的timezone_40.dat以及其他对应文件拷贝到$ORACLE_HOME/oracore/zoneinfo中
2.查询当前数据库的信息:
SQL> SELECT version FROM v$timezone_file;
VERSION
----------
32
当前DST的版本为32
3.进行DST版本升级
此时需要把数据库以upgrade模式打开
set serveroutput on
EXEC DBMS_DST.BEGIN_UPGRADE(40);
此时查询:
SELECT property_name, SUBSTR(property_value, 1, 30) value
FROM database_properties
WHERE property_name LIKE 'DST_%'
ORDER BY property_name;
property_name property_value
-------------------- --------------------
DST_PRIMARY_TT_VERSION 32
DST_SECONDARY_TT_VERSION 40
DST_UPGRADE_STATE upgrade
4.检查受影响的表
SELECT owner, table_name, upgrade_in_progress FROM dba_tstz_tables;
OWNER TABLE_NAME UPGRADE_IN_PROGRESS
----- ------------------------- -------------------
GSMADMIN_INTERNAL AQ$_CHANGE_LOG_QUEUE_TABLE_L YES
MDSYS SDO_DIAG_MESSAGES_TABLE YES
DVSYS AUDIT_TRAIL$ YES
GSMADMIN_INTERNAL AQ$_CHANGE_LOG_QUEUE_TABLE_S YES
DVSYS SIMULATION_LOG$ YES
需要为yes受到影响的表进行处理
5.处理受影响的表
此时需要把数据库以read write打开
VAR numfail number;
BEGIN
DBMS_DST.UPGRADE_DATABASE(:numfail,
parallel => TRUE,
log_errors => TRUE,
log_errors_table => 'SYS.DST$ERROR_TABLE',
log_triggers_table => 'SYS.DST$TRIGGER_TABLE',
error_on_overlap_time => TRUE,
error_on_nonexisting_time => TRUE);
DBMS_OUTPUT.PUT_LINE('Number of tables failed to upgrade:'|| :numfail);
END;
/
6.结束升级
当所有表升级后,进行end_upgrade
VAR numfail number;
BEGIN
DBMS_DST.END_UPGRADE(:numfail);
DBMS_OUTPUT.PUT_LINE('Number of tables failed to upgrade:'|| :numfail);
END;
/
7.检查DST版本
SQL> SELECT version FROM v$timezone_file;
VERSION
----------
40
SELECT property_name, SUBSTR(property_value, 1, 30) value
FROM database_properties
WHERE property_name LIKE 'DST_%'
ORDER BY property_name;
property_name property_value
-------------------- --------------------
DST_PRIMARY_TT_VERSION 40
DST_SECONDARY_TT_VERSION 0
DST_UPGRADE_STATE NONE
|