

# 在 RDS for Oracle 中使用存储
<a name="User_Oracle_AdditionalStorage"></a>

每个 RDS for Oracle 实例都有一个主存储卷。要增加存储容量，最多可以将三个附加存储卷连接到数据库实例。根据您的工作负载要求，对于每个卷在 gp3 和 io2 存储之间进行选择。例如，您可以将经常访问的数据放在 io2 卷上，而将历史数据放在 gp3 卷上。

使用附加存储卷可实现以下优势：
+ **增强的容量**：通过连接最多三个附加存储卷，将每个数据库实例的总存储量扩展到多达 256 TiB。
+ **灵活的存储配置和性能优化**：混合不同的存储类型（gp3 和 io2），以根据您的数据访问模式优化成本和性能。将高性能 io2 存储上频繁访问的数据与经济实惠的 gp3 存储上的归档数据分开。
+ **根据需要扩展和减少存储容量**：在需要附加存储空间时连接卷（例如在数据迁移期间），之后删除该卷。通过这种方式，您可以扩展和减少数据库实例的总存储空间。
+ **联机数据移动**：使用 Oracle 数据库的内置功能，无需停机即可在卷之间移动数据。

**注意**  
您可以移除附加存储卷，但不能移除主卷。

**Topics**
+ [

## 将附加存储卷与 RDS for Oracle 结合使用的注意事项
](#User_Oracle_AdditionalStorage.considerations)
+ [

## 将附加存储卷与 RDS for Oracle 结合使用的限制
](#User_Oracle_AdditionalStorage.limitations)
+ [

## 在 RDS for Oracle 中对附加存储卷执行数据库管理操作
](#User_Oracle_AdditionalStorage.DBManagement)
+ [

# 使用 RDS for Oracle 添加、移除或修改存储卷
](User_Oracle_AdditionalStorage.ModifyStorageVolumes.md)
+ [

# 在 RDS for Oracle 中使用附加存储卷备份和还原数据
](User_Oracle_AdditionalStorage.BackupRestore.md)
+ [

# RDS for Oracle 中附加存储卷的使用案例
](User_Oracle_AdditionalStorage.UseCases.md)

## 将附加存储卷与 RDS for Oracle 结合使用的注意事项
<a name="User_Oracle_AdditionalStorage.considerations"></a>

将附加存储卷与 RDS for Oracle 结合使用时，请考虑以下事项：
+ 您最多可以为每个实例添加 3 个附加存储卷。
+ 附加存储卷必须使用以下卷名称：
  + rdsdbdata2
  + rdsdbdata3
  + rdsdbdata4
+ 您只能添加通用型 SSD（gp3）和预调配 IOPS SSD（io2）存储类型。
+ 在应用程序继续运行的同时，您可以使用 Oracle 的联机重新放置功能在卷之间移动数据。
+ 当您通过修改数据库实例来创建附加存储卷时，无论计划修改设置如何，RDS 都会立即创建存储卷。添加存储卷是一项联机操作，不会影响数据库性能。请参阅[使用计划修改设置](USER_ModifyInstance.ApplyImmediately.md)。

要获得最佳性能，请在使用附加存储卷时检查以下各项：
+ 数据移动规划
  + 在非高峰时段安排大型移动
  + 将大型操作分成较小的分块
  + 在移动过程中监控系统资源
+ 资源管理
  + 在两个卷上保留足够的可用空间
  + 使用 AWR 或 Statspack 监控 I/O 模式
  + 监视是否发生存储空间已满的情形
+ 最佳实践
  + 尽可能使用联机数据文件重新放置操作
  + 维护适当的索引
  + 定期监控空间使用情况

将附加存储卷与副本结合使用时：
+ 当您为具有附加存储卷的数据库实例创建 RDS for Oracle 副本时，RDS 会自动在副本上配置附加存储卷。但是，在主数据库实例的存储卷中所做的任何后续修改都不会自动应用于副本。
+ 在跨卷管理数据文件位置时，我们建议使用参数组设置而不是会话级别更改，以确保主实例和副本实例之间的行为一致。

## 将附加存储卷与 RDS for Oracle 结合使用的限制
<a name="User_Oracle_AdditionalStorage.limitations"></a>

以下限制适用于将附加存储卷与 RDS for Oracle 结合使用：
+ 您无法向内存低于 64 GiB 的实例类型添加存储卷，因为它们没有足够的内存来支持大型存储卷。
+ 对于附加存储卷，最小存储大小为 200 GiB。数据库实例的主存储卷应等于或大于 200 GiB，才能连接附加存储卷。数据库实例在所有卷上的最大存储大小总计为 256 TiB。
+ 具有附加存储卷的数据库实例不支持以下功能：
  + 跨区域自动备份
  + 存储自动扩缩（用于附加存储卷）
  + 跨账户快照复制
  + 公有快照
+ 您无法删除主存储卷 (`rdsdbdata`)，但只要其它附加存储卷为空，就可以删除这些附加存储卷。
+ 您无法将联机重做日志、归档的重做日志和控制文件存储在其它存储卷中。这些文件只能存储在主存储卷 (`rdsdbdata`) 中。

## 在 RDS for Oracle 中对附加存储卷执行数据库管理操作
<a name="User_Oracle_AdditionalStorage.DBManagement"></a>

在 RDS for Oracle 中使用附加存储卷时，您可以执行数据库管理操作，例如创建表空间或在存储卷之间移动数据。有关对附加存储卷执行数据库管理操作的更多信息，请参阅以下各节：
+ [在 RDS for Oracle 中指定数据库文件位置](Appendix.Oracle.CommonDBATasks.TablespacesAndDatafiles.md#Appendix.Oracle.CommonDBATasks.DatabaseFileLocations)
+ [在 RDS for Oracle 中创建表空间并调整其大小](Appendix.Oracle.CommonDBATasks.TablespacesAndDatafiles.md#Appendix.Oracle.CommonDBATasks.CreatingTablespacesAndDatafiles)
+ [在 RDS for Oracle 中的卷之间移动数据文件](Appendix.Oracle.CommonDBATasks.MovingDataBetweenVolumes.md#Appendix.Oracle.CommonDBATasks.MovingDatafiles)

# 使用 RDS for Oracle 添加、移除或修改存储卷
<a name="User_Oracle_AdditionalStorage.ModifyStorageVolumes"></a>

您可以使用 AWS 管理控制台或 AWS CLI 添加、修改和移除附加存储卷。所有操作都使用带 `additional-storage-volumes` 参数的 `modify-db-instance` 命令。

**重要**  
添加或移除附加存储卷会触发一个备份待处理操作，并进入中断时段。备份工作流程完成后，中断时段将结束。



## 添加存储卷
<a name="User_Oracle_AdditionalStorage.ModifyStorageVolumes.Add"></a>

除了主存储卷之外，您最多可以添加三个存储卷。要向 RDS for Oracle 实例添加新的存储卷，请使用带 `additional-storage-volumes` 参数的 `modify-db-instance` 命令。

以下代码段添加了一个新的 5000 GiB 通用型 SSD（gp3）卷，预调配 IOPS 为 4000，名称为 `rdsdbdata3`。

```
aws rds modify-db-instance \
  --db-instance-identifier my-oracle-instance \
  --region us-east-1 \
  --additional-storage-volumes '[
        {
            "VolumeName":"rdsdbdata3",
            "StorageType":"gp3",
            "AllocatedStorage":5000
            "IOPS":4000}
    ]' \
  --apply-immediately
```

## 修改存储卷
<a name="User_Oracle_AdditionalStorage.ModifyStorageVolumes.Modifying"></a>

您可以修改附加存储卷的存储类型、分配的存储卷、IOPS 以及存储吞吐量设置。以下代码段修改 `rdsdbdata2` 卷的 IOPS 设置。

```
aws rds modify-db-instance \
  --db-instance-identifier my-oracle-instance \
  --region us-east-1 \
  --additional-storage-volumes '[
        {
            "VolumeName":"rdsdbdata2",
            "IOPS":8000}
    ]' \
  --apply-immediately
```

**注意**  
一旦将附加存储卷添加到实例，您就无法减少该存储卷的存储分配。

## 移除存储卷
<a name="User_Oracle_AdditionalStorage.ModifyStorageVolumes.Remove"></a>

当不再需要时，您可以从 RDS for Oracle 数据库实例中移除附加存储卷。在移除卷之前，请确保已将所有数据库文件从该卷中移出，并且没有数据库对象引用该卷。验证卷状态是否为 `Not-in-use`。您可以移除附加存储卷，但不能移除主存储卷。

**警告**  
在移除附加存储卷之前，请确保该卷上未存储任何数据库文件。移除包含活动数据库文件的卷会导致数据库损坏。

以下示例移除 `rdsdbdata4` 卷。

```
aws rds modify-db-instance \
  --db-instance-identifier my-oracle-instance \
  --region us-east-1 \
  --additional-storage-volumes '[
        {
            "VolumeName":"rdsdbdata2",
            "SetForDelete":true}
    ]' \
  --apply-immediately
```

# 在 RDS for Oracle 中使用附加存储卷备份和还原数据
<a name="User_Oracle_AdditionalStorage.BackupRestore"></a>

您可以使用自动备份，并通过附加存储卷使用数据库实例创建数据库快照。所有备份操作都包括主卷和附加存储卷。您也可以通过附加存储卷对数据库实例使用时间点故障恢复。还原数据库时，可以添加存储卷。也可以修改现有卷的存储设置。从快照还原数据库时，不能删除附加存储卷。

**Topics**
+ [

## 创建手动快照
](#User_Oracle_AdditionalStorage.BackupRestore.ManualSnapshots)
+ [

## 还原手动快照
](#User_Oracle_AdditionalStorage.BackupRestore.RestoreSnapshots)
+ [

## 时间点故障恢复
](#User_Oracle_AdditionalStorage.BackupRestore.PitR)

## 创建手动快照
<a name="User_Oracle_AdditionalStorage.BackupRestore.ManualSnapshots"></a>

以下示例使用附加存储卷创建数据库的手动快照：

```
aws rds create-db-snapshot \
--db-instance-identifier my-oracle-asv-instance \
--db-snapshot-identifier my-snapshot
```

## 还原手动快照
<a name="User_Oracle_AdditionalStorage.BackupRestore.RestoreSnapshots"></a>

从快照还原时，您可以添加新的附加存储卷，或修改现有卷的 IOPS 或吞吐量设置。以下示例从快照还原数据库实例，并修改 `rdsdbdata2` 卷的 IOPS 设置：

```
aws rds restore-db-instance-from-db-snapshot \
  --db-instance-identifier my-restored-instance \
  --db-snapshot-identifier my-snapshot \
  --region us-east-1 \
  --additional-storage-volumes '[
        {
            "VolumeName":"rdsdbdata2",
            "IOPS":5000
        }
    ]'
```

## 时间点故障恢复
<a name="User_Oracle_AdditionalStorage.BackupRestore.PitR"></a>

在时间点故障恢复（PITR）期间，您可以使用自定义配置添加新的附加存储卷。以下示例执行 PITR 并为 `rdsdbdata2` 卷添加一个新的 5000 GiB 通用型 SSD（gp3），IOPS 为 5000，存储吞吐量为 200 MB/s：

```
aws rds restore-db-instance-to-point-in-time \
  --source-db-instance-identifier my-source-instancemy-source-instance \
  --target-db-instance my-pitr-instance\
  --use-latest-restorable-time \
  --region us-east-1 \
  --additional-storage-volumes '[
        {
            "VolumeName":"rdsdbdata2",
            "StorageType":"gp3",
            "AllocatedStorage":5000,
            "IOPS":5000,
            "StorageThroughput":200
        }
    ]'
```

# RDS for Oracle 中附加存储卷的使用案例
<a name="User_Oracle_AdditionalStorage.UseCases"></a>

附加存储卷支持各种数据库管理方案。以下各节介绍了常见的使用案例和实施方法。

**Topics**
+ [

## 将存储容量扩展到 64 TiB 以上
](#User_Oracle_AdditionalStorage.UseCases.Extendingstoragecapacity)
+ [

## 在单独的卷上对频繁和不频繁访问的数据进行存储分层
](#User_Oracle_AdditionalStorage.UseCases.Storagetiering)
+ [

## 用于数据加载和卸载的临时存储
](#User_Oracle_AdditionalStorage.UseCases.Temporarystorage)
+ [

## 将 Oracle 可传输表空间与附加存储卷结合使用
](#User_Oracle_AdditionalStorage.UseCases.TransportableTablespaces)

## 将存储容量扩展到 64 TiB 以上
<a name="User_Oracle_AdditionalStorage.UseCases.Extendingstoragecapacity"></a>

当主存储卷接近 64 TiB 限制但数据库中需要更多存储空间时，您可以使用附加存储卷。您可以使用 `modify-db-instance` 命令将附加存储卷连接到数据库实例，每个存储卷最多 64 TiB。连接附加存储卷后，您可以在附加存储卷上创建表空间，并使用标准 Oracle SQL 将表、索引和分区等对象移动到这些表空间。有关更多信息，请参阅 [在 RDS for Oracle 中对附加存储卷执行数据库管理操作](User_Oracle_AdditionalStorage.md#User_Oracle_AdditionalStorage.DBManagement)。

## 在单独的卷上对频繁和不频繁访问的数据进行存储分层
<a name="User_Oracle_AdditionalStorage.UseCases.Storagetiering"></a>

您可以通过在卷之间配置不同的存储类型，使用附加存储卷来优化成本和性能。例如，您可以使用高性能预调配 IOPS SSD 存储（io2）卷来存储频繁访问的数据，而将历史数据存储在经济实惠的通用型（gp3）存储卷上。您可以使用标准 Oracle 命令将特定的数据库对象（表、索引和分区）移动到这些表空间。有关更多信息，请参阅 [在 RDS for Oracle 中对附加存储卷执行数据库管理操作](User_Oracle_AdditionalStorage.md#User_Oracle_AdditionalStorage.DBManagement)。

## 用于数据加载和卸载的临时存储
<a name="User_Oracle_AdditionalStorage.UseCases.Temporarystorage"></a>

您可以按照以下步骤，使用附加存储卷作为大型数据加载或导出的临时存储：
+ 使用以下命令在附加存储卷上创建一个目录：

  ```
  BEGIN
  rdsadmin.rdsadmin_util.create_directory(
              p_directory_name => 'DATA_PUMP_DIR2',
              p_database_volume_name => 'rdsdbdata2');
  END;
  /
  ```
+ 创建目录后，按照[使用 Oracle Data Pump 导入](Oracle.Procedural.Importing.DataPump.md)中所述的步骤将数据导出并导入到新目录。
+ 操作完成后，移除文件，并可以选择删除该卷以节省存储成本。只有当附加存储卷为空时，您才能移除该存储卷。

## 将 Oracle 可传输表空间与附加存储卷结合使用
<a name="User_Oracle_AdditionalStorage.UseCases.TransportableTablespaces"></a>

您可以通过 Oracle 可传输表空间，使用附加存储卷将数据文件移动到附加存储卷中，步骤如下：
+ 在使用附加存储卷将可传输表空间导入到目标数据库之前，先在会话级别设置 `db_create_file_dest` 参数。

  ```
  ALTER SESSION SET db_create_file_dest = '/rdsdbdata2/db';
  
  VAR x CLOB;
  
  BEGIN
  :x := rdsadmin.rdsadmin_transport_util.import_xtts_tablespaces(
  p_tablespace_list => 'TBTEST1',
  p_directory_name => 'XTTS_DIR_DATA2',
  p_platform_id => 13);
  END;
  /
  
  PRINT :x;
  ```
+ 检查可传输表空间导入状态：

  ```
  ALTER SESSION SET nls_date_format = 'DD.MM.YYYY HH24:MI:SS';
  
  COL xtts_operation_start_utc FORMAT A30
  COL xtts_operation_end_utc FORMAT A30
  COL xtts_operation_state FORMAT A30
  COL xtts_operation_type FORMAT A30
  
  SELECT xtts_operation_start_utc, xtts_operation_type, xtts_operation_state
  FROM rdsadmin.rds_xtts_operation_info;
  ```
+ 可传输表空间导入完成后，导入可传输表空间元数据。

  ```
  BEGIN
  rdsadmin.rdsadmin_transport_util.import_xtts_metadata(
  p_datapump_metadata_file => 'xttdump.dmp',
  p_directory_name => 'XTTS_DIR_DATA2');
  END;
  /
  ```