

# 在 RDS for SQL Server 中使用存储
<a name="Appendix.SQLServer.CommonDBATasks.DatabaseStorage"></a>

使用 RDS for SQL Server，您最多可以将三个附加卷连接到 RDS for SQL Server 实例，每个卷映射到一个唯一的 Windows 驱动器盘符。这支持您在默认 `D:` 驱动器之外的多个卷上分配数据库文件。添加存储卷后，可以提高数据库文件管理和存储优化的灵活性。

优势包括：
+ **灵活的文件分配**：将数据库数据文件和日志文件分配到多个卷上，以提高 I/O 性能。
+ **存储优化**：使用不同的存储类型和配置来满足不同的工作负载要求。
+ **可扩展性**：无需修改现有卷，即可增加存储容量。

**Topics**
+ [

## 将附加存储卷与 RDS for SQL Server 结合使用的注意事项
](#SQLServer.ASV.Considerations)
+ [

## 使用 RDS for SQL Server 添加、移除或修改存储卷
](#SQLServer.ASV.Management)
+ [

## 适用于 RDS for SQL Server 的附加存储卷的还原操作
](#SQLServer.ASV.Restore)
+ [

## 适用于 RDS for SQL Server 的附加存储卷的使用案例
](#SQLServer.ASV.UseCases)

## 将附加存储卷与 RDS for SQL Server 结合使用的注意事项
<a name="SQLServer.ASV.Considerations"></a>

将附加存储卷与 RDS for SQL Server 结合使用时，请注意以下功能和限制：
+ 您只能在 SQL Server 标准版（SE）、企业版（EE）和开发版（DEV-EE）上添加存储卷。
+ 您最多可以为每个实例添加 3 个附加存储卷。
+ 卷名称自动映射到 Windows 驱动器盘符，如下所示：
  + `rdsdbdata2`：`H:` 驱动器
  + `rdsdbdata3`：`I:` 驱动器
  + `rdsdbdata4`：`J:` 驱动器
+ 使用 NVMe 实例存储时，TempDB 文件将继续使用 `T:` 驱动器。SQL Server 审计文件和 Microsoft 商业智能（MSBI）文件保留在 `D:` 驱动器上。
+ 您只能添加通用型 SSD（gp3）和预调配 IOPS SSD（io2）存储类型。
+ 额外存储卷的最小存储大小与为默认 `D:` 驱动器设置的限制相同。数据库实例在所有卷上的最大存储大小总计为 256 TiB。
+ 不支持向带有只读副本的实例或只读副本实例添加存储卷。
+ 不支持向启用了跨区域自动备份的实例添加存储卷。
+ 不支持配置附加存储卷来实现存储自动扩缩。
+ 不支持在创建卷后在卷之间移动文件。
+ 您无法删除 `D:` 卷，但只要其它存储卷为空，就可以将其删除。
+ 不支持在快照还原或时间点故障恢复（PITR）期间修改现有卷的大小。但是，您可以在还原操作期间添加新的存储卷。

## 使用 RDS for SQL Server 添加、移除或修改存储卷
<a name="SQLServer.ASV.Management"></a>

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

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

**Topics**
+ [

### 添加存储卷
](#SQLServer.ASV.Adding)
+ [

### 扩展附加存储卷
](#SQLServer.ASV.Scaling)
+ [

### 移除附加存储卷
](#SQLServer.ASV.Removing)

### 添加存储卷
<a name="SQLServer.ASV.Adding"></a>

您最多可以在默认 `D:` 驱动器之外添加三个存储卷。要向 RDS for SQL Server 实例添加新的存储卷，请使用带 `additional-storage-volumes` 参数的 `modify-db-instance` 命令。

以下示例添加一个名为 `rdsdbdata4` 的新的 4000 GiB 通用型 SSD（gp3）卷。

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

### 扩展附加存储卷
<a name="SQLServer.ASV.Scaling"></a>

除存储大小外，您可以修改附加存储卷的任何存储设置。以下示例修改 `rdsdbdata2` 卷的 IOPS 设置。

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

### 移除附加存储卷
<a name="SQLServer.ASV.Removing"></a>

您无法删除 `D:` 卷，但可以在附加存储卷为空时将其删除。

**警告**  
在移除附加存储卷之前，请确保该卷上未存储任何数据库文件。

以下示例移除 `rdsdbdata4` 卷。

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

## 适用于 RDS for SQL Server 的附加存储卷的还原操作
<a name="SQLServer.ASV.Restore"></a>

还原数据库时，可以添加存储卷。也可以修改现有卷的存储设置。

**Topics**
+ [

### 快照还原
](#SQLServer.ASV.SnapshotRestore)
+ [

### 时间点故障恢复
](#SQLServer.ASV.PITR)
+ [

### 原生数据库还原
](#SQLServer.ASV.NativeRestore)

### 快照还原
<a name="SQLServer.ASV.SnapshotRestore"></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="SQLServer.ASV.PITR"></a>

在时间点故障恢复（PITR）期间，您可以使用自定义配置添加新的附加存储卷。

以下示例执行 PITR 并添加一个新的 5000 GiB 通用型 SSD（gp3）卷：

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

### 原生数据库还原
<a name="SQLServer.ASV.NativeRestore"></a>

您可以使用 `rds_restore_database` 存储过程将数据库还原到特定的附加存储卷。两个新参数支持卷选择：

**`data_file_volume`**  
指定数据库数据文件的驱动器盘符

**`log_file_volume`**  
指定数据库日志文件的驱动器盘符

以下示例还原一个数据库，其数据文件位于 `H:` 驱动器上，而日志文件位于 `I:` 驱动器上：

```
EXEC msdb.dbo.rds_restore_database    
    @restore_db_name='my_database',
    @s3_arn_to_restore_from='arn:aws:s3:::my-bucket/backup-file.bak',
    @data_file_volume='H:',
    @log_file_volume='I:';
```

如果您未指定卷参数，或者为这两个参数指定了 `D:` 驱动器，则数据库文件将还原到默认 `D:` 驱动器：

```
EXEC msdb.dbo.rds_restore_database    
    @restore_db_name='my_database',
    @s3_arn_to_restore_from='arn:aws:s3:::my-bucket/backup-file.bak';
```

## 适用于 RDS for SQL Server 的附加存储卷的使用案例
<a name="SQLServer.ASV.UseCases"></a>

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

**Topics**
+ [

### 在附加存储卷上创建数据库
](#SQLServer.ASV.NewDatabase)
+ [

### 扩展存储容量
](#SQLServer.ASV.ExtendStorage)
+ [

### 在卷之间移动数据库
](#SQLServer.ASV.MoveDatabase)
+ [

### 将数据归档到经济高效的存储
](#SQLServer.ASV.ArchiveData)

### 在附加存储卷上创建数据库
<a name="SQLServer.ASV.NewDatabase"></a>

您可以使用标准 SQL Server `CREATE DATABASE` 语句直接在附加存储卷上创建新的数据库。

以下示例创建一个数据库，其数据文件位于 `H:` 驱动器上，而日志文件位于 `I:` 驱动器上：

```
CREATE DATABASE MyDatabase
ON (
    NAME = 'MyDatabase_Data',
    FILENAME = 'H:\rdsdbdata\data\MyDatabase_Data.mdf',
    SIZE = 100MB,
    FILEGROWTH = 10MB
)
LOG ON (
    NAME = 'MyDatabase_Log',
    FILENAME = 'I:\rdsdbdata\data\MyDatabase_Log.ldf',
    SIZE = 10MB,
    FILEGROWTH = 10%
);
```

### 扩展存储容量
<a name="SQLServer.ASV.ExtendStorage"></a>

当默认 `D:` 驱动器达到其最大容量时，您可以添加附加存储卷，扩展现有卷，并在新卷上创建新的数据文件或日志文件。

**扩展存储容量**

1. 使用 `modify-db-instance` 命令向实例添加存储卷。

1. 向附加存储卷中添加新的数据文件：

   ```
   ALTER DATABASE MyDatabase
   ADD FILE (
       NAME = 'MyDatabase_Data2',
       FILENAME = 'H:\rdsdbdata\data\MyDatabase_Data2.ndf',
       SIZE = 500MB,
       FILEGROWTH = 50MB
   );
   ```

### 在卷之间移动数据库
<a name="SQLServer.ASV.MoveDatabase"></a>

要将数据库移动到其它卷，请将备份和还原方法与 `rds_backup_database` 和 `rds_restore_database` 存储过程结合使用。有关更多信息，请参阅 [使用本机备份和还原](SQLServer.Procedural.Importing.Native.Using.md)。

**将数据库移至其它卷**

1. 使用 `rds_backup_database` 备份数据库：

   ```
   EXEC msdb.dbo.rds_backup_database 
       @source_db_name='MyDatabase',
       @s3_arn_to_backup_to='arn:aws:s3:::my-bucket/database-backup.bak';
   ```

1. 将数据库还原到目标卷：

   ```
   EXEC msdb.dbo.rds_restore_database    
       @restore_db_name='MyDatabase_New',
       @s3_arn_to_restore_from='arn:aws:s3:::my-bucket/database-backup.bak',
       @data_file_volume='H:',
       @log_file_volume='I:';
   ```

1. 从旧驱动器中删除数据库以释放空间。有关更多信息，请参阅 [删除 Amazon RDS for Microsoft SQL Server 数据库实例中的数据库](Appendix.SQLServer.CommonDBATasks.DropMirrorDB.md)。

### 将数据归档到经济高效的存储
<a name="SQLServer.ASV.ArchiveData"></a>

对于分区表，您可以将较旧的数据归档到具有不同性能特征的附加存储卷。

**归档分区数据**

1. 添加具有适当存储类型和容量的存储卷。

1. 在附加存储卷上创建新的文件组：

   ```
   ALTER DATABASE MyDatabase
   ADD FILEGROUP ArchiveFileGroup;
   
   ALTER DATABASE MyDatabase
   ADD FILE (
       NAME = 'Archive_Data',
       FILENAME = 'H:\rdsdbdata\data\Archive_Data.ndf',
       SIZE = 1GB,
       FILEGROWTH = 100MB
   ) TO FILEGROUP ArchiveFileGroup;
   ```

1. 使用 SQL Server 分区管理命令将分区移动到新的文件组。