

# Oracle 时区文件自动升级
<a name="Appendix.Oracle.Options.Timezone-file-autoupgrade"></a>

使用 `TIMEZONE_FILE_AUTOUPGRADE` 选项，您可以将当前时区文件升级到 RDS for Oracle 数据库实例上的最新版本。

**Topics**
+ [Oracle 时区文件概览](Appendix.Oracle.Options.Timezone-file-autoupgrade.tz-overview.md)
+ [更新时区文件的策略](Appendix.Oracle.Options.Timezone-file-autoupgrade.strategies.md)
+ [时区文件更新期间的停机时间](Appendix.Oracle.Options.Timezone-file-autoupgrade.considerations.md)
+ [准备更新时区文件](Appendix.Oracle.Options.Timezone-file-autoupgrade.preparing.md)
+ [添加时区文件自动升级选项](Appendix.Oracle.Options.Timezone-file-autoupgrade.adding.md)
+ [更新时区文件后检查数据](Appendix.Oracle.Options.Timezone-file-autoupgrade.checking.md)

# Oracle 时区文件概览
<a name="Appendix.Oracle.Options.Timezone-file-autoupgrade.tz-overview"></a>

Oracle Database *时区文件*存储以下信息：
+ 相对于协调世界时（UTC）的偏移量
+ 夏令时（DST）的过渡时间
+ 标准时间和 DST 的缩写

Oracle Database 提供多个版本的时区文件。在本地环境中创建 Oracle 数据库时，可以选择时区文件版本。有关更多信息，请参阅《Oracle Database 全球化支持指南》**中的[选择时区文件](https://docs.oracle.com/en/database/oracle/oracle-database/19/nlspg/datetime-data-types-and-time-zone-support.html#GUID-805AB986-DE12-4FEA-AF56-5AABCD2132DF)。

如果 DST 的规则发生变化，Oracle 将发布新的时区文件。Oracle 发布这些新的时区文件与每季度版本更新（RU）和版本更新修订（RUR）的时间表无关。时区文件位于数据库主机上的目录 `$ORACLE_HOME/oracore/zoneinfo/` 中。时区文件名使用的格式为 DstV*version*，如 DSTV35 所示。

## 时区文件如何影响数据传输
<a name="Appendix.Oracle.Options.Timezone-file-autoupgrade.data-transfer"></a>

在 Oracle 数据库中，`TIMESTAMP WITH TIME ZONE` 数据类型存储时间戳和时区数据。`TIMESTAMP WITH TIME ZONE` 数据类型的数据使用关联时区文件版本中的规则。这样，当您更新时区文件时，现有 `TIMESTAMP WITH TIME ZONE` 数据会受到影响。

在使用不同版本时区文件的数据库之间传输数据时，可能会出现问题。例如，如果您从时区文件版本比目标数据库更高的源数据库导入数据，数据库会发出 `ORA-39405` 错误。以前，您必须使用以下任一方法解决此错误：
+ 使用所需的时区文件创建 RDS for Oracle 数据库实例，从源数据库导出数据，然后将其导入到新数据库中。
+ 使用 AWS DMS 或逻辑复制来迁移数据。

## 使用 TIMEZONE\$1FILE\$1AUTOUPGRADE 选项进行自动更新
<a name="Appendix.Oracle.Options.Timezone-file-autoupgrade.option-overview"></a>

当附加到 RDS for Oracle 数据库实例的选项组包括 `TIMEZONE_FILE_AUTOUPGRADE` 选项时，RDS 将自动更新您的时区文件。通过确保 Oracle 数据库使用相同的时区文件版本，可以避免在不同环境之间移动数据时采用耗时的手动方法。容器数据库（CDB）和非 CDB 均支持 `TIMEZONE_FILE_AUTOUPGRADE` 选项。

当您向选项组添加 `TIMEZONE_FILE_AUTOUPGRADE` 选项时，您可以选择是立即添加此选项，还是在维护时段添加此选项。数据库实例应用新选项后，RDS 会检查它是否可以安装更新的 DSTv*version* 文件。目标 DSTv*version* 取决于以下内容：
+ 数据库实例当前正在运行的次要引擎版本
+ 您要将数据库实例升级到的次要引擎版本

例如，您当前的时区文件版本可能是 DSTv33。当 RDS 将更新应用到选项组时，它可能会确定 DSTv34 在数据库实例文件系统上当前可用。然后，RDS 自动将您的时区文件更新到 DSTv34。

要在支持的 RDS 版本更新中查找可用的 DST 版本，请查看[适用于 Oracle 的 Amazon Relational Database Service（Amazon RDS）发布说明](https://docs.aws.amazon.com/AmazonRDS/latest/OracleReleaseNotes/Welcome.html)中的补丁。例如，[版本 19.0.0.0.ru-2022-10.rur-2022-10.r1](https://docs.aws.amazon.com/AmazonRDS/latest/OracleReleaseNotes/oracle-version-19-0.html#oracle-version-RU-RUR.19.0.0.0.ru-2022-10.rur-2022-10.r1) 列出补丁 34533061: RDBMS - DSTV39 UPDATE - TZDATA2022C。

# 更新时区文件的策略
<a name="Appendix.Oracle.Options.Timezone-file-autoupgrade.strategies"></a>

升级数据库引擎和将 `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。

要更新时区文件，您可以使用以下策略。

**Topics**
+ [更新时区文件而不升级引擎](#Appendix.Oracle.Options.Timezone-file-autoupgrade.strategies.no-upgrade)
+ [升级时区文件和数据库引擎版本](#Appendix.Oracle.Options.Timezone-file-autoupgrade.strategies.upgrade)
+ [升级数据库引擎版本而不更新时区文件](#Appendix.Oracle.Options.Timezone-file-autoupgrade.strategies.upgrade-only)

## 更新时区文件而不升级引擎
<a name="Appendix.Oracle.Options.Timezone-file-autoupgrade.strategies.no-upgrade"></a>

在这种情况下，您的数据库使用 DSTv33，但 DSTv34 在您的数据库实例文件系统上可用。您希望将数据库实例使用的时区文件从 DSTv33 更新到 DSTv34，但您不想将您的引擎升级到新的次要版本，其中包括 DSTv35。

在 `add-option-to-option-group` 命令中，将 `TIMEZONE_FILE_AUTOUPGRADE` 添加到您的数据库实例使用的选项组。指定是立即添加此选项，还是将其推迟到维护时段。应用 `TIMEZONE_FILE_AUTOUPGRADE` 选项后，RDS 将执行以下操作：

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

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

1. 立即更新时区文件。

## 升级时区文件和数据库引擎版本
<a name="Appendix.Oracle.Options.Timezone-file-autoupgrade.strategies.upgrade"></a>

在这种情况下，您的数据库使用 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
   ```

1. 使用以下 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
   ```

## 升级数据库引擎版本而不更新时区文件
<a name="Appendix.Oracle.Options.Timezone-file-autoupgrade.strategies.upgrade-only"></a>

在这种情况下，您的数据库使用 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。

# 时区文件更新期间的停机时间
<a name="Appendix.Oracle.Options.Timezone-file-autoupgrade.considerations"></a>

当 RDS 更新时区文件时，使用 `TIMESTAMP WITH TIME ZONE` 的现有数据可能会发生变化。在这种情况下，您首要的考虑因素是停机时间。

**警告**  
如果您添加 `TIMEZONE_FILE_AUTOUPGRADE` 选项，则您引擎升级的停机时间可能要延长。更新大型数据库的时区数据可能需要数小时甚至数天。

时区文件更新的长度取决于如下因素：
+ 数据库中的 `TIMESTAMP WITH TIME ZONE` 数据量
+ 数据库实例配置
+ 数据库实例类
+ 存储配置
+ 数据库配置
+ 数据库参数设置

执行以下操作时，可能会产生额外的停机时间：
+ 当数据库实例使用过时的时区文件时，将此选项添加到选项组
+ 当新引擎版本包含时区文件的新版本时，升级 Oracle 数据库引擎

**注意**  
在时区文件更新期间，RDS for Oracle 调用 `PURGE DBA_RECYCLEBIN`。

# 准备更新时区文件
<a name="Appendix.Oracle.Options.Timezone-file-autoupgrade.preparing"></a>

时区文件升级有两个不同的阶段：准备和升级。虽然准备步骤并非必需，但强烈建议您执行此步骤。在此步骤中，您将了解哪些数据将受到运行 PL/SQL 过程 `DBMS_DST.FIND_AFFECTED_TABLES` 的影响。有关准备窗口的更多信息，请参阅 Oracle 数据库文档中的[使用时区数据升级时区文件和时间戳](https://docs.oracle.com/en/database/oracle/oracle-database/19/nlspg/datetime-data-types-and-time-zone-support.html#GUID-B0ACDB2E-4B49-4EB4-B4CC-9260DAE1567A)。

**准备更新时区文件**

1. 使用 SQL 客户端连接到您的 Oracle 数据库。

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

   ```
   SELECT * FROM V$TIMEZONE_FILE;
   ```

1. 确定数据库实例上可用的最新时区文件版本。

   ```
   SELECT DBMS_DST.GET_LATEST_TIMEZONE_VERSION FROM DUAL;
   ```

1. 确定具有类型为 `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');
   ```

1. 确定具有类型为 `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;
   ```

1. 运行准备步骤。
   + 过程 `DBMS_DST.CREATE_AFFECTED_TABLE` 可创建表来存储任何受影响的数据。将此表的名称传递给 `DBMS_DST.FIND_AFFECTED_TABLES` 过程。有关更多信息，请参阅 Oracle 数据库文档中的 [CREATE\$1AFFECTED\$1TABLE 过程](https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_DST.html#GUID-C53BAABA-914A-404C-9CD5-823257BE0B00)。
   + 此过程 `CREATE_ERROR_TABLE` 创建用于记录错误的表。有关更多信息，请参阅 Oracle 数据库文档中的 [CREATE\$1ERROR\$1TABLE 过程](https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_DST.html#GUID-6A7EA024-B02D-4486-B1D6-EF6ABF5DE507)。

   以下示例创建受影响的数据和错误表，并查找所有受影响的表。

   ```
   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;
   ```

1. 查询受影响表和错误表。

   ```
   SELECT * FROM my_affected_table;
   SELECT * FROM my_error_table;
   ```

# 添加时区文件自动升级选项
<a name="Appendix.Oracle.Options.Timezone-file-autoupgrade.adding"></a>

当您向选项组添加选项时，该选项组将处于以下状态之一：
+ 一个现有选项组当前已附加到至少一个数据库实例。添加该选项时，所有使用此选项组的数据库实例都会自动重新启动。这会导致短暂中断。
+ 现有选项组未附加到任何数据库实例。您计划添加该选项，然后将现有选项组与现有数据库实例或新数据库实例相关联。
+ 您创建一个新的选项组并添加该选项。您计划将新的选项组与现有数据库实例或新的数据库实例关联。

## 控制台
<a name="Appendix.Oracle.Options.Timezone-file-autoupgrade.console"></a>

**将时区文件自动升级选项添加到数据库实例**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择**选项组**。

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

   1. 对于 **Engine**（引擎），选择适用于您的数据库实例的 Oracle Database 版本。

   1. 对于**主引擎版本**，请选择数据库实例的版本。

   有关更多信息，请参阅 [创建选项组](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.Create)。

1. 选择要修改的选项组，然后选择 **Add Option (添加选项)**。

1. 在**添加选项**窗口中，执行以下操作：

   1. 选择 **TIMEZONE\$1FILE\$1AUTOUPGRADE**。

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

1. 根据需要设置完毕后，选择 **Add Option (添加选项)**。

## AWS CLI
<a name="Appendix.Oracle.Options.Timezone-file-autoupgrade.CLI"></a>

以下示例使用 AWS CLI [add-option-to-option-group](https://docs.aws.amazon.com/cli/latest/reference/rds/add-option-to-option-group.html) 命令将 `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
```

# 更新时区文件后检查数据
<a name="Appendix.Oracle.Options.Timezone-file-autoupgrade.checking"></a>

建议您在更新时区文件后检查数据。在准备步骤过程中，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\$1AFFECTED\$1TABLES 过程](https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_DST.html#GUID-1F977505-671C-4D5B-8570-86956F136199)。