Oracle 时区文件自动升级
使用 TIMEZONE_FILE_AUTOUPGRADE
选项,您可以将当前时区文件升级到 RDS for Oracle 数据库实例上的最新版本。
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
数据类型的数据使用关联时区文件版本中的规则。这样,当您更新时区文件时,现有 TIMESTAMP WITH TIME ZONE
数据会受到影响。
在使用不同版本时区文件的数据库之间传输数据时,可能会出现问题。例如,如果您从时区文件版本比目标数据库更高的源数据库导入数据,数据库会发出 ORA-39405
错误。以前,您必须使用以下任一方法解决此错误:
-
使用所需的时区文件创建 RDS for Oracle 数据库实例,从源数据库导出数据,然后将其导入到新数据库中。
-
使用 AWS DMS 或逻辑复制来迁移数据。
使用 TIMEZONE_FILE_AUTOUPGRADE 选项进行自动更新
当附加到 RDS for Oracle 数据库实例的选项组包括 TIMEZONE_FILE_AUTOUPGRADE
选项时,RDS 将自动更新您的时区文件。通过确保 Oracle 数据库使用相同的时区文件版本,可以避免在不同环境之间移动数据时采用耗时的手动方法。容器数据库(CDB)和非 CDB 均支持 TIMEZONE_FILE_AUTOUPGRADE
选项。
当您向选项组添加 TIMEZONE_FILE_AUTOUPGRADE
选项时,您可以选择是立即添加此选项,还是在维护时段添加此选项。数据库实例应用新选项后,RDS 会检查它是否可以安装更新的 DSTvversion
文件。目标 DSTvversion
取决于以下内容:
-
数据库实例当前正在运行的次要引擎版本
-
您要将数据库实例升级到的次要引擎版本
例如,您当前的时区文件版本可能是 DSTv33。当 RDS 将更新应用到选项组时,它可能会确定 DSTv34 在数据库实例文件系统上当前可用。然后,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
选项添加到选项组是单独的操作。如果有较新的时区文件可用,则添加 TIMEZONE_FILE_AUTOUPGRADE
选项会启动对时区文件的更新。您可以立即或在下一个维护时段运行以下命令(仅显示相关选项):
-
仅使用以下 RDS CLI 命令升级数据库引擎:
modify-db-instance --engine-version
name
... -
仅使用以下 CLI 命令添加
TIMEZONE_FILE_AUTOUPGRADE
选项:add-option-to-option-group --option-group-name
name
--options OptionName=TIMEZONE_FILE_AUTOUPGRADE ... -
使用以下 CLI 命令升级您的数据库引擎并向您的实例添加新的选项组:
modify-db-instance --engine-version
name
--option-group-namename
...
更新策略取决于是要一起升级数据库和时区文件,还是只执行其中一个操作。请记住,如果您更新选项组,然后在单独的 API 操作中升级数据库引擎,则在升级数据库引擎时,当前可能正在进行时区文件更新。
本部分中的示例假定以下内容:
-
您尚未将
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。
在 add-option-to-option-group
命令中,将 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。
要同时升级引擎和时区文件,请使用 --option-group-name
和 --engine-version
选项运行 modify-db-instance
。您可以立即运行此命令,也可以将其推迟到维护时段。在 In --option-group-name
中指定包含 TIMEZONE_FILE_AUTOUPGRADE
选项的选项组。例如:
aws rds modify-db-instance --db-instance-identifier
my-instance
\ --engine-versionnew-version
\ ----option-group-nameog-with-timezone-file-autoupgrade
\ --apply-immediately
RDS 开始将引擎升级到 19.0.0.0.ru-2022-10.rur-2022-10.r1。应用 TIMEZONE_FILE_AUTOUPGRADE
选项后,RDS 会检查是否有新的 DST 版本,看到 DSTv35 在 19.0.0.0.ru-2022-10.rur-2022-10.r1 中可用,并立即开始更新到 DSTv35。
要立即升级您的引擎,然后升级您的时区文件,请按顺序执行操作:
-
仅使用以下 CLI 命令升级数据库引擎:
aws rds modify-db-instance \ --db-instance-identifier
my-instance
\ --engine-versionnew-version
\ --apply-immediately -
使用以下 CLI 命令将
TIMEZONE_FILE_AUTOUPGRADE
选项添加到附加到您的实例的选项组:aws rds add-option-to-option-group \ --option-group-name
og-in-use-by-your-instance
\ --options OptionName=TIMEZONE_FILE_AUTOUPGRADE \ --apply-immediately
升级数据库引擎版本而不更新时区文件
在这种情况下,您的数据库使用 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
的选项组关联。在modify-db-instance
命令中,不要指定新的选项组,这样 RDS 就不会更新您的时区文件。 -
您的数据库实例目前与一个包含
TIMEZONE_FILE_AUTOUPGRADE
的选项组关联。在单个modify-db-instance
命令中,将您的数据库实例与不包含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;
-
确定数据库实例上可用的最新时区文件版本。
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
;
添加时区文件自动升级选项
当您向选项组添加选项时,该选项组将处于以下状态之一:
-
一个现有选项组当前已附加到至少一个数据库实例。添加该选项时,所有使用此选项组的数据库实例都会自动重新启动。这会导致短暂中断。
-
现有选项组未附加到任何数据库实例。您计划添加该选项,然后将现有选项组与现有数据库实例或新数据库实例相关联。
-
您创建一个新的选项组并添加该选项。您计划将新的选项组与现有数据库实例或新的数据库实例关联。
控制台
将时区文件自动升级选项添加到数据库实例
登录 AWS Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/
。 -
在导航窗格中,选择选项组。
-
确定您想要使用的选项组。您可以创建新的选项组,或使用现有选项组。如果您想使用现有选项组,请跳到下一步。或者,通过以下设置创建自定义数据库选项组:
-
对于 Engine(引擎),选择适用于您的数据库实例的 Oracle Database 版本。
-
对于主引擎版本,请选择数据库实例的版本。
有关更多信息,请参阅 创建选项组。
-
-
选择要修改的选项组,然后选择 Add Option (添加选项)。
-
在添加选项窗口中,执行以下操作:
-
选择 TIMEZONE_FILE_AUTOUPGRADE。
-
要在添加选项后在所有关联数据库实例上启用该选项,对于立即应用,请选择是。如果选择否(默认),则会在下一个维护时段为每个关联数据库实例启用此选项。
-
-
根据需要设置完毕后,选择 Add Option (添加选项)。
AWS CLI
以下示例使用 AWS 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 过程