Oracle 时区文件自动升级 - Amazon Relational Database Service

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-name name ...

更新策略取决于是要一起升级数据库和时区文件,还是只执行其中一个操作。请记住,如果您更新选项组,然后在单独的 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 将执行以下操作:

  1. 检查是否有新的 DST 版本。

  2. 确定 DSTv34 在文件系统上是否可用。

  3. 立即更新时区文件。

升级时区文件和数据库引擎版本

在这种情况下,您的数据库使用 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-version new-version \ ----option-group-name og-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。

要立即升级您的引擎,然后升级您的时区文件,请按顺序执行操作:

  1. 仅使用以下 CLI 命令升级数据库引擎:

    aws rds modify-db-instance \ --db-instance-identifier my-instance \ --engine-version new-version \ --apply-immediately
  2. 使用以下 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 数据库文档中的使用时区数据升级时区文件和时间戳

准备更新时区文件
  1. 使用 SQL 客户端连接到您的 Oracle 数据库。

  2. 确定当前使用的时区文件版本。

    SELECT * FROM V$TIMEZONE_FILE;
  3. 确定数据库实例上可用的最新时区文件版本。

    SELECT DBMS_DST.GET_LATEST_TIMEZONE_VERSION FROM DUAL;
  4. 确定具有类型为 TIMESTAMP WITH LOCAL TIME ZONETIMESTAMP 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');
  5. 确定具有类型为 TIMESTAMP WITH LOCAL TIME ZONETIMESTAMP 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;
  6. 运行准备步骤。

    • 过程 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 * FROM my_affected_table; SELECT * FROM my_error_table;
  7. 查询受影响表和错误表。

    SELECT * FROM my_affected_table; SELECT * FROM my_error_table;

添加时区文件自动升级选项

当您向选项组添加选项时,该选项组将处于以下状态之一:

  • 一个现有选项组当前已附加到至少一个数据库实例。添加该选项时,所有使用此选项组的数据库实例都会自动重新启动。这会导致短暂中断。

  • 现有选项组未附加到任何数据库实例。您计划添加该选项,然后将现有选项组与现有数据库实例或新数据库实例相关联。

  • 您创建一个新的选项组并添加该选项。您计划将新的选项组与现有数据库实例或新的数据库实例关联。

控制台

将时区文件自动升级选项添加到数据库实例
  1. 登录 AWS Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/

  2. 在导航窗格中,选择选项组

  3. 确定您想要使用的选项组。您可以创建新的选项组,或使用现有选项组。如果您想使用现有选项组,请跳到下一步。或者,通过以下设置创建自定义数据库选项组:

    1. 对于 Engine(引擎),选择适用于您的数据库实例的 Oracle Database 版本。

    2. 对于主引擎版本,请选择数据库实例的版本。

    有关更多信息,请参阅 创建选项组

  4. 选择要修改的选项组,然后选择 Add Option (添加选项)

  5. 添加选项窗口中,执行以下操作:

    1. 选择 TIMEZONE_FILE_AUTOUPGRADE

    2. 要在添加选项后在所有关联数据库实例上启用该选项,对于立即应用,请选择。如果选择(默认),则会在下一个维护时段为每个关联数据库实例启用此选项。

  6. 根据需要设置完毕后,选择 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 过程