Oracle 时区文件自动升级
使用 TIMEZONE_FILE_AUTOUPGRADE
选项,您可以将当前时区文件升级到数据库实例上的最新版本。
时区文件的用途
在 Oracle 数据库中,TIMESTAMP WITH TIME ZONE
数据类型存储时间戳和时区数据。此数据类型对于保留本地时区信息非常有用。
Oracle 数据库将转换规则和 UTC 偏移量存储在时区文件。偏移量是本地时间和 UTC 之间的差值。在本地环境中创建 Oracle 数据库时,可以选择时区文件版本。TIMESTAMP WITH TIME ZONE
数据类型的数据使用关联时区文件版本中的规则。时区文件驻留在 $ORACLE_HOME/oracore/zoneinfo/
。
如果政府更改了夏令时(DST)的规则,Oracle 将发布新的时区文件。Oracle 发布时区文件与 PSU 和 RU 分开。时区文件名使用的格式为 DstVversion
,如 DSTV35 所示。在 Amazon RDS for Oracle 中添加 TIMEZONE_FILE_AUTOUPGRADE
选项时,您可以更新时区文件。
TIMEZONE_FILE_AUTOUPGRADE
选项在不同环境之间移动数据时非常有用。如果您尝试从具有高于目标数据库的时区文件版本的源数据库导入数据,您会收到 ORA-39405
错误消息。以前,您必须使用以下任一方法解决错误:
-
使用所需的时区文件创建 Oracle 实例 RDS,从源数据库导出数据,然后将其导入到新数据库中。
-
使用 Amazon DMS 或逻辑复制来迁移数据。
通过 TIMEZONE_FILE_AUTOUPGRADE
选项,可以升级源数据库上的时区文件,而无需使用前面的繁琐技术。
更新时区文件的注意事项
当您更新时区文件时,使用 TIMESTAMP WITH TIME ZONE
的数据可能会发生变化。您的首要考虑因素是停机时间。
如果您添加 TIMEZONE_FILE_AUTOUPGRADE
,则您的引擎升级可能会需要长时间停机。更新大型数据库的时区数据可能需要数小时甚至数天。
更新的长度取决于以下因素:
-
数据库中的
TIMESTAMP WITH TIME ZONE
数据量 -
实例配置
-
数据库实例类
-
存储配置
-
数据库配置
-
数据库参数设置
执行以下操作时,可能会产生额外的停机时间:
-
当实例使用过时时区文件时,向选项组添加选项
-
当新引擎版本包含时区文件的新版本时,升级 Oracle 数据库引擎
在时区文件更新期间,RDS for Oracle 调用 PURGE DBA_RECYCLEBIN
。
由于时区文件的更新会修改行,因此主数据库会自动将这些更改推送到任何只读副本。无论 TIMEZONE_FILE_AUTOUPGRADE
选项是否已安装在副本选项组中,此复制都会发生。
更新时区文件的策略
您可以升级引擎并独立更新您的时区文件。因此,您必须在不同的更新策略中进行选择。
本节中的示例假设您的实例使用数据库版本 19.0.0.0.ru-2019-07.rur-2019-07.r1 和时区文件 DSTv33。您的数据库实例文件系统包含文件 DSTV34。此外,假设发布更新 19.0.0.0.ru-2021-01.rur-2021-01.r1 包含 DSTv35。要更新时区文件,您可以使用以下策略:
-
更新数据库使用的时区文件,而不升级数据库引擎版本。
将您的实例使用的时区文件从 DSTv33 更新为 DSTV34。在您的修改实例操作中,执行以下操作:
-
将
TIMEZONE_FILE_AUTOUPGRADE
添加到您的实例使用的选项组。 -
不要更改引擎版本。
-
-
在同一操作中升级数据库引擎版本和时区文件。
将引擎升级到版本 19.0.0.0.ru-2021-01.rur-2021-01.r1 并在同一操作中将时区文件更新为 DSTv35。在您的修改实例操作中,执行以下操作:
-
将
TIMEZONE_FILE_AUTOUPGRADE
添加到您的实例使用的选项组。 -
更改引擎版本。
-
-
升级数据库引擎版本而不更新时区文件。
将数据库升级到版本 19.0.0.0.ru-2021-01.rur-2021-01.r1,但保留时区文件 DSTv33。在这种情况下,可能性如下:
-
您的实例未与包含
TIMEZONE_FILE_AUTOUPGRADE
的选项组关联。保持选项组原样。 -
您的实例关联到一个包含
TIMEZONE_FILE_AUTOUPGRADE
的选项组。将您的实例与没有TIMEZONE_FILE_AUTOUPGRADE
的选项组相关联。然后,修改引擎版本。
您可能出于以下原因来选择该策略:
-
您的数据不使用
TIMESTAMP WITH TIME ZONE
数据类型。 -
您的数据使用
TIMESTAMP WITH TIME ZONE
数据类型,但您的数据不受时区更改的影响。 -
您想推迟更新时区文件,因为您无法容忍额外的停机时间。
-
准备更新时区文件
时区文件升级有两个不同的阶段:准备和升级。虽然准备步骤并非必需,但强烈建议您执行此步骤。在此步骤中,您将了解哪些数据将受到运行 PL/SQL 过程 DBMS_DST.FIND_AFFECTED_TABLES
的影响。有关准备窗口的更多信息,请参阅 Oracle 数据库文档中的使用时区数据升级时区文件和时间戳
准备更新时区文件
-
使用 SQL 客户端连接到您的 Oracle 数据库。
-
确定当前使用的时区文件版本。
SELECT * FROM V$TIMEZONE_FILE;
-
确定数据库实例上可用的最新时区文件版本。仅当您使用 Oracle Database 12c 第 2 版(12.2)或更高版本时,此步骤才适用。
SELECT DBMS_DST.GET_LATEST_TIMEZONE_VERSION FROM DUAL;
-
确定具有类型为
TIMESTAMP WITH LOCAL TIME ZONE
或TIMESTAMP WITH TIME ZONE
的列的表总大小。SELECT SUM(BYTES)/1024/1024/1024 "Total_size_w_TSTZ_columns_GB" FROM DBA_SEGMENTS WHERE SEGMENT_TYPE LIKE 'TABLE%' AND (OWNER, SEGMENT_NAME) IN (SELECT OWNER, TABLE_NAME FROM DBA_TAB_COLUMNS WHERE DATA_TYPE LIKE 'TIMESTAMP%TIME ZONE');
-
确定具有类型为
TIMESTAMP WITH LOCAL TIME ZONE
或TIMESTAMP WITH TIME ZONE
的列的段的名称和大小。SELECT OWNER, SEGMENT_NAME, SUM(BYTES)/1024/1024/1024 "SEGMENT_SIZE_W_TSTZ_COLUMNS_GB" FROM DBA_SEGMENTS WHERE SEGMENT_TYPE LIKE 'TABLE%' AND (OWNER, SEGMENT_NAME) IN (SELECT OWNER, TABLE_NAME FROM DBA_TAB_COLUMNS WHERE DATA_TYPE LIKE 'TIMESTAMP%TIME ZONE') GROUP BY OWNER, SEGMENT_NAME;
-
运行准备步骤。
-
过程
DBMS_DST.CREATE_AFFECTED_TABLE
可创建表来存储任何受影响的数据。将此表的名称传递给DBMS_DST.FIND_AFFECTED_TABLES
过程。有关更多信息,请参阅 Oracle 数据库文档中的 CREATE_AFFECTED_TABLE 过程。 -
此过程创建错误表将创建用于记录错误的表。有关更多信息,请参阅 Oracle 数据库文档中的 CREATE_ERROR_TABLE 过程
。
以下示例创建受影响的数据和错误表,并查找所有受影响的表。
EXEC DBMS_DST.CREATE_ERROR_TABLE('
my_error_table
') EXEC DBMS_DST.CREATE_AFFECTED_TABLE('my_affected_table
') EXEC DBMS_DST.BEGIN_PREPARE(new_version
); EXEC DBMS_DST.FIND_AFFECTED_TABLES('my_affected_table
', TRUE, 'my_error_table
'); EXEC DBMS_DST.END_PREPARE; SELECT * FROMmy_affected_table
; SELECT * FROMmy_error_table
; -
-
查询受影响表和错误表。
SELECT * FROM
my_affected_table
; SELECT * FROMmy_error_table
;
添加时区文件自动升级选项
将时区自动升级选项添加到数据库实例的过程如下所示:
-
创建新的选项组,或者复制或修改现有选项组。
-
将 选项添加到该选项组。
-
将选项组与数据库实例相关联。
如果添加该选项,则在数据库实例自动重新启动时会出现短暂中断。
控制台
将时区文件自动升级选项添加到数据库实例
-
确定您想要使用的选项组。您可以创建新的选项组,或使用现有选项组。如果您想使用现有选项组,请跳到下一步。或者,通过以下设置创建自定义数据库选项组:
-
对于引擎,请选择适用于您的数据库实例的 Oracle 版本。
-
对于主引擎版本,请选择数据库实例的版本。
有关更多信息,请参阅 创建选项组。
-
-
将 TIMEZONE_FILE_AUTOUPGRADE 选项添加到选项组。
重要 如果在已附加到一个或多个数据库实例的现有选项组中添加选项,所有数据库实例自动重新启动时都会发生短暂中断。
-
将选项组应用到新的或现有的数据库实例:
-
对于新数据库实例,您可以在启动实例时应用选项组。有关更多信息,请参阅 创建 Amazon RDS 数据库实例。
-
对于现有数据库实例,您可以通过修改实例并附加新的选项组来应用选项组。如果您将时区选项添加到现有数据库实例,则在数据库实例自动重新启动时会出现短暂中断。有关更多信息,请参阅 修改 Amazon RDS 数据库实例。
-
Amazon CLI
以下示例使用 Amazon CLI add-option-to-option-group 命令将 TIMEZONE_FILE_AUTOUPGRADE
选项添加到名为 myoptiongroup
的选项组。
对于 Linux、macOS 或 Unix:
aws rds add-option-to-option-group \ --option-group-name "
myoptiongroup
" \ --options "OptionName=TIMEZONE_FILE_AUTOUPGRADE
" \ --apply-immediately
对于 Windows:
aws rds add-option-to-option-group ^ --option-group-name "
myoptiongroup
" ^ --options "OptionName=TIMEZONE_FILE_AUTOUPGRADE
" ^ --apply-immediately
更新时区文件后检查数据
建议您在更新时区文件后检查数据。在准备步骤过程中,RDS for Oracle 会自动创建以下表:
-
rdsadmin.rds_dst_affected_tables
– 列出包含受更新影响的数据的表 -
rdsadmin.rds_dst_error_table
– 列出更新过程中生成的错误
这些表独立于您在准备时段中创建的任何表。要查看更新的结果,请按如下方式查询表。
SELECT * FROM rdsadmin.rds_dst_affected_tables; SELECT * FROM rdsadmin.rds_dst_error_table;
有关受影响数据和错误表的架构的更多信息,请参阅 Oracle 文档中的 FIND_AFFECTED_TABLES 过程