重庆思庄Oracle、Redhat认证学习论坛

标题: 19.18手动升级时区从32到40 [打印本页]

作者: 刘泽宇    时间: 2024-4-13 17:44
标题: 19.18手动升级时区从32到40
场景:从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





欢迎光临 重庆思庄Oracle、Redhat认证学习论坛 (http://bbs.cqsztech.com/) Powered by Discuz! X3.2