暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

最佳实践|Oracle 12c 数据库升级时区文件和带有时区数据的时间戳

原创 小小亮 2022-10-10
2501

有时需要在 Oracle 数据库中升级时区文件和带有时区 (TSTZ) 数据的时间戳,例如当您升级到新版本的数据库或夏令时 (DST) 规则发生变化时。

下面是我们的步骤:

  1. 检查 Oracle 主目录中可用的最新版本的时区文件:

[oracle@hostname]$ cd $ORACLE_HOME/oracore/
[oracle@hostname oracore]$ ls
mesg zoneinfo

2. 备份当前 zoneinfo 文件

[oracle@hostname oracore]$ cp zoneinfo zoneinfo_old

3. 检查数据库的状态:

[oracle@hostname zoneinfo]$ 更多 $ORACLE_HOME/oracore/zoneinfo/timezdif.csv

文件版本 1.0
字段:VERSION#、TIMEZONE_NAME、FROM_YEAR、TO_YEAR
注意:TO_YEAR 的 NULL/空白表示 db 可表示/允许的最大年份。
14, Africa/Casablanca, 2010,
14, Africa/Tunis, 2010,
14, America/Argentina/San_Luis, 2010,
14, America/Tijuana, 2010,
14, America/Santiago, 2010, 2010
14, America/Asuncion, 2010 ,
14, 南极洲/凯西, 2010,

还从 sqlplus 检查:

SQL> SELECT PROPERTY_NAME, SUBSTR(property_value, 1, 30) value FROM DATABASE_PROPERTIES
     WHERE PROPERTY_NAME LIKE 'DST_%'
     ORDER BY PROPERTY_NAME;

PROPERTY_NAME                 |VALUE
------------------------------|------------------------------
DST_PRIMARY_TT_VERSION        |14
DST_SECONDARY_TT_VERSION      |0
DST_UPGRADE_STATE             |NONE

SQL> select * from v$timezone_file;

FILENAME                VERSION     CON_ID
-------------------- ---------- ----------
timezlrg_14.dat              14          0

SQL> select TZ_VERSION from registry$database;

TZ_VERSION
----------
14

4. 设置相关参数

应清除回收站,并根据以下 MOS 说明设置一些会话参数:

在有大量数据受新 TZ 文件影响的数据库中,通过 DBUA 执行时区升级需要更多时间(文档 ID 2259734.1)
使用 DBMS_DST 更新 12c 第 1 版(12.1.0.1 及更高版本)中的 RDBMS DST 版本(文档 ID 1509653.1)

更改会话集“_with_subquery”=materialize;
更改会话集“_simple_view_merging”=TRUE;
清除 dba_recyclebin;


5. 开始升级过程

SQL> set serveroutput on
SQL> exec DBMS_DST.BEGIN_PREPARE(26);
A prepare window has been successfully started.
PL/SQL procedure successfully completed.

SQL> shutdown immediate;

SQL> startup upgrade;
ORACLE instance started.

SQL> exec DBMS_DST.BEGIN_UPGRADE(28);

PL/SQL procedure successfully completed.

SQL> SELECT PROPERTY_NAME, SUBSTR(property_value, 1, 30) value
     FROM DATABASE_PROPERTIES
     WHERE PROPERTY_NAME LIKE 'DST_%'
     ORDER BY PROPERTY_NAME;
  
PROPERTY_NAME                  VALUE
------------------------------ ------------------------------
DST_PRIMARY_TT_VERSION         28
DST_SECONDARY_TT_VERSION       14
DST_UPGRADE_STATE              UPGRADE

SQL> shu immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> startup
ORACLE instance started.

SQL> truncate table sys.dst$error_table;

Table truncated.

SQL> truncate table sys.dst$trigger_table;

Table truncated.

--Check possibe errors here
SQL>  SELECT * FROM sys.dst$error_table;

no rows selected

SQL> alter session set "_with_subquery"=materialize;

Session altered.

SQL> alter session set "_simple_view_merging"=TRUE;

Session altered.

SQL> set serveroutput on
SQL> VAR numfail number
SQL> 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('Failures:'|| :numfail);
     END;
   /
 
Table list: "SYSMAN"."MGMT_PROV_SUITE_INST_MEMBERS"
Number of failures: 0
Table list: "SYSMAN"."MGMT_PROV_STAGING_DIRS"
Number of failures: 0
Table list: "SYSMAN"."MGMT_PROV_RPM_REP"
Number of failures: 0
Table list: "SYSMAN"."MGMT_PROV_OPERATION"
Number of failures: 0
Table list: "SYSMAN"."MGMT_PROV_NET_CONFIG"
Number of failures: 0
Table list: "SYSMAN"."MGMT_PROV_IP_RANGE"
Number of failures: 0
Table list: "SYSMAN"."MGMT_PROV_DEFAULT_IMAGE"
Number of failures: 0
Table list: "SYSMAN"."MGMT_PROV_CLUSTER_NODES"
Number of failures: 0
Table list: "SYSMAN"."MGMT_PROV_BOOTSERVER"
Number of failures: 0
Table list: "SYSMAN"."MGMT_PROV_ASSIGNMENT"
Number of failures: 0
Table list: "SYSMAN"."AQ$_MGMT_NOTIFY_QTABLE_S"
Number of failures: 0
Table list: "SYSMAN"."AQ$_MGMT_NOTIFY_QTABLE_L"
Number of failures: 0
Table list: "SYSMAN"."AQ$_MGMT_LOADER_QTABLE_S"
Number of failures: 0
Table list: "SYSMAN"."AQ$_MGMT_LOADER_QTABLE_L"
Number of failures: 0
Table list: "IX"."AQ$_STREAMS_QUEUE_TABLE_S"
Number of failures: 0
Table list: "IX"."AQ$_STREAMS_QUEUE_TABLE_L"
Number of failures: 0
Table list: "IX"."AQ$_ORDERS_QUEUETABLE_S"
Number of failures: 0
Table list: "IX"."AQ$_ORDERS_QUEUETABLE_L"
Number of failures: 0
Failures:0

PL/SQL procedure successfully completed.

--Check error again

SQL> SELECT * FROM sys.dst$error_table;

no rows selected

-- Check timezone 
SQL> select * from v$timezone_file;

FILENAME                VERSION
-------------------- ----------
timezlrg_28.dat              28

SQL> SELECT PROPERTY_NAME, SUBSTR(property_value, 1, 30) value
      FROM DATABASE_PROPERTIES
      WHERE PROPERTY_NAME LIKE 'DST_%'
      ORDER BY PROPERTY_NAME;
  
PROPERTY_NAME                  VALUE
------------------------------ ------------------------------
DST_PRIMARY_TT_VERSION         28
DST_SECONDARY_TT_VERSION       0
DST_UPGRADE_STATE              NONE


原文标题:Upgrading The Time Zone File And Timestamp With Time Zone Data Oracle Database12c

原文作者:Helios
原文链接:https://heliosguneserol.com/2022/10/04/upgrading-the-time-zone-file-and-timestamp-with-time-zone-data-oracle-database12c/

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论