Oracle 时区文件自动升级
使用 TIMEZONE_FILE_AUTOUPGRADE
选项,您可以将当前时区文件升级到数据库实例上的最新版本。
Oracle 时区文件概览
Oracle Database 时区文件存储以下信息:
-
相对于协调世界时(UTC)的偏移量
-
夏令时(DST)的过渡时间
-
标准时间和 DST 的缩写
Oracle Database 提供多个版本的时区文件。在本地环境中创建 Oracle 数据库时,可以选择时区文件版本。有关更多信息,请参阅《Oracle Database 全球化支持指南》中的选择时区文件
如果 DST 的规则发生变化,Oracle 将发布新的时区文件。Oracle 发布这些新的时区文件与每季度 RU 和 RUR 的时间表无关。时区文件位于数据库主机上的目录 $ORACLE_HOME/oracore/zoneinfo/
中。时区文件名使用的格式为 DstVversion
,如 DSTV35 所示。
时区文件如何影响数据传输
在 Oracle 数据库中,TIMESTAMP WITH TIME ZONE
数据类型存储时间戳和时区数据。TIMESTAMP WITH TIME ZONE
数据类型的数据使用关联时区文件版本中的规则。这样,当您更新时区文件时,现有数据会受到影响。
在使用不同版本时区文件的数据库之间传输数据时,可能会出现问题。例如,如果您尝试从时区文件版本比目标数据库高的源数据库导入数据,您会收到 ORA-39405
错误消息。以前,您必须使用以下任一方法解决此错误:
-
使用所需的时区文件创建 RDS for Oracle 数据库实例,从源数据库导出数据,然后将其导入到新数据库中。
-
使用 Amazon DMS 或逻辑复制来迁移数据。
使用 TIMEZONE_FILE_AUTOUPGRADE 选项进行自动更新
在 RDS for Oracle 中添加 TIMEZONE_FILE_AUTOUPGRADE
选项时,RDS for Oracle 将自动更新时区文件。通过确保数据库使用相同的时区文件版本,可以避免在不同环境之间移动数据时采用耗时的手动方法。容器数据库(CDB)和非 CDB 均支持 TIMEZONE_FILE_AUTOUPGRADE
选项。
当您向选项组添加 TIMESTAMP WITH TIME ZONE
选项时,您可以选择是立即添加此选项,还是在维护时段添加此选项。数据库实例使用新选项后,RDS 会检查它是否可以安装更新的 DSTvversion
文件。目标 DSTvversion
取决于以下内容:
-
数据库实例当前正在运行的次要引擎版本
-
您要将数据库实例升级到的次要引擎版本
例如,如果您当前的时区文件版本是 DSTv33,RDS 可能会确定 DSTv34 在数据库实例文件系统上当前可用。在这种情况下,当您添加 TIMESTAMP WITH TIME ZONE
选项时,RDS 会立即将您的时区文件更新为 DSTv34。
要在支持的 RDS 版本更新中查找可用的 DST 版本,请查看适用于 Oracle 的 Amazon Relational Database Service(Amazon RDS)发布说明中的补丁。例如,版本 19.0.0.0.ru-2022-10.rur-2022-10.r1 列出补丁 34533061: RDBMS - DSTV39 UPDATE - TZDATA2022C。
更新时区文件的策略
您可以升级数据库引擎并独立更新您的时区文件。这样,您必须在不同的更新策略中进行选择,具体取决于是否要同时升级数据库和时区文件。
本部分中的示例假定以下内容:
-
您尚未将
TIMEZONE_FILE_AUTOUPGRADE
添加到您的数据库实例使用的选项组。 -
您的数据库实例使用数据库版本 19.0.0.0.ru-2019-07.rur-2019-07.r1 和时区文件 DSTv33。
-
您的数据库实例文件系统包含文件 DSTV34。
-
版本更新 19.0.0.0.ru-2022-10.rur-2022-10.r1 包含 DSTv35。
要更新时区文件,您可以使用以下策略。
更新时区文件而不升级引擎
在这种情况下,您的数据库使用 DSTv33,但 DSTv34 在您的数据库实例文件系统上可用。您希望将数据库实例使用的时区文件从 DSTv33 更新到 DSTv34,但您不想将您的引擎升级到新的次要版本,其中包括 DSTv35。在您的修改数据库实例操作中,执行以下操作:
-
将
TIMEZONE_FILE_AUTOUPGRADE
添加到您的数据库实例使用的选项组。指定是立即添加此选项,还是将其推迟到维护时段。 -
不要更改引擎版本。
应用 TIMEZONE_FILE_AUTOUPGRADE
选项后,RDS 会检查是否有新的 DST 版本,看到 DSTv34 在文件系统上可用,并立即开始更新。
升级时区文件和数据库引擎版本
在这种情况下,您的数据库使用 DSTv33,但 DSTv34 在您的数据库实例文件系统上可用。您希望将数据库引擎升级到包含 DSTv35 的次要版本 19.0.0.0.ru-2022-10.rur-2022-10.r1,并在引擎升级期间将时区文件更新到 DSTv5。这样,您的目标是跳过 DSTv34 并将时区文件直接更新到 DSTv35。在您的修改数据库实例操作中,执行以下操作:
-
将
TIMEZONE_FILE_AUTOUPGRADE
添加到您的数据库实例使用的选项组。指定是立即添加此选项,还是将其推迟到维护时段。 -
更改次要引擎版本。
应用 TIMEZONE_FILE_AUTOUPGRADE
选项后,RDS 会检查是否有新的 DST 版本,看到 DSTv35 在 19.0.0.0.ru-2022-10.rur-2022-10.r1 中可用,并立即开始更新到 DSTv35。同时,RDS 将您的数据库引擎升级到版本 19.0.0.0.ru-2022-10.rur-2022-10.r1。
升级数据库引擎版本而不更新时区文件
在这种情况下,您的数据库使用 DSTv33,但 DSTv34 在您的数据库实例文件系统上可用。您希望将数据库引擎升级到版本 19.0.0.0.ru-2022-10.rur-2022-10.r1(其中包含 DSTv35),但保留时区文件 DSTv33。您可能出于以下原因来选择该策略:
-
您的数据不使用
TIMESTAMP WITH TIME ZONE
数据类型。 -
您的数据使用
TIMESTAMP WITH TIME ZONE
数据类型,但您的数据不受时区更改的影响。 -
您想推迟更新时区文件,因为您无法容忍额外的停机时间。
您的策略取决于以下哪些可能性是确实存在的:
-
您的数据库实例未与包含
TIMEZONE_FILE_AUTOUPGRADE
的选项组关联。保持选项组不变,这样 RDS 就不会更新您的时区文件。 -
您的数据库实例与一个包含
TIMEZONE_FILE_AUTOUPGRADE
的选项组关联。将您的数据库实例与不包含TIMEZONE_FILE_AUTOUPGRADE
的选项组关联,然后将您的数据库引擎升级到 19.0.0.0.ru-2022-10.rur-2022-10.r1。
时区文件更新期间的停机时间
当 RDS 更新时区文件时,使用 TIMESTAMP WITH
TIME ZONE
的现有数据可能会发生变化。在这种情况下,您首要的考虑因素是停机时间。
警告
如果您添加 TIMEZONE_FILE_AUTOUPGRADE
选项,则您引擎升级的停机时间可能要延长。更新大型数据库的时区数据可能需要数小时甚至数天。
时区文件更新的长度取决于如下因素:
-
数据库中的
TIMESTAMP WITH TIME ZONE
数据量 -
数据库实例配置
-
数据库实例类
-
存储配置
-
数据库配置
-
数据库参数设置
执行以下操作时,可能会产生额外的停机时间:
-
当数据库实例使用过时的时区文件时,将此选项添加到选项组
-
当新引擎版本包含时区文件的新版本时,升级 Oracle 数据库引擎
注意
在时区文件更新期间,RDS for Oracle 调用 PURGE
DBA_RECYCLEBIN
。
准备更新时区文件
时区文件升级有两个不同的阶段:准备和升级。虽然准备步骤并非必需,但强烈建议您执行此步骤。在此步骤中,您将了解哪些数据将受到运行 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 过程。 -
此过程
CREATE_ERROR_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
;
添加时区文件自动升级选项
当您向选项组添加选项时,该选项组将处于以下状态之一:
-
一个现有选项组当前已附加到至少一个数据库实例。添加该选项时,所有使用此选项组的数据库实例都会自动重新启动。这会导致短暂中断。
-
现有选项组未附加到任何数据库实例。您计划添加该选项,然后将现有选项组与现有数据库实例或新数据库实例相关联。
-
您创建一个新的选项组并添加该选项。您计划将新的选项组与现有数据库实例或新的数据库实例关联。
控制台
将时区文件自动升级选项添加到数据库实例
登录 Amazon Web Services Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/
。 -
在导航窗格中,选择选项组。
-
确定您想要使用的选项组。您可以创建新的选项组,或使用现有选项组。如果您想使用现有选项组,请跳到下一步。或者,通过以下设置创建自定义数据库选项组:
-
对于 Engine(引擎),选择适用于您的数据库实例的 Oracle Database 版本。
-
对于主引擎版本,请选择数据库实例的版本。
有关更多信息,请参阅“创建选项组”。
-
-
选择要修改的选项组,然后选择 Add Option (添加选项)。
-
在添加选项窗口中,执行以下操作:
-
选择 TIMEZONE_FILE_AUTOUPGRADE。
-
要在添加选项后在所有关联数据库实例上启用该选项,对于立即应用,请选择是。如果选择否(默认),则会在下一个维护时段为每个关联数据库实例启用此选项。
-
-
根据需要设置完毕后,选择 Add Option (添加选项)。
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 过程