

# 升级 Microsoft SQL Server 数据库引擎
<a name="USER_UpgradeDBInstance.SQLServer"></a>

如果 Amazon RDS 支持数据库引擎的新版本，您可以将您的数据库实例升级到新版本。SQL Server 数据库实例具有两种升级：主要版本升级和次要版本升级。

*主要版本升级*会包含不与现有应用程序向后兼容的数据库更改。因此，您必须*手动*为数据库实例执行主要版本升级。您可以通过修改数据库实例来启动主要版本升级。不过，在执行主要版本升级之前，建议您按照[测试 RDS for SQL Server 升级](USER_UpgradeDBInstance.SQLServer.UpgradeTesting.md)中所述的步骤测试升级。

*次要版本升级*仅包含与现有应用程序向后兼容的更改。您可以通过两种方式升级数据库实例的次要版本：
+ *手动*：修改您的数据库实例以启动升级
+ *自动*：为数据库实例启用自动次要版本升级

启用自动次要版本升级后，当较新的次要版本中有关键安全更新可用时，RDS for SQL Server 会在计划的维护时段内自动升级数据库实例。

对于 `16.00.4120.1`、`15.00.4365.2`、`14.00.3465.1`、`13.00.6435.1` 之后的次要引擎版本，默认情况下会禁用以下安全协议：
+ `rds.tls10`（TLS 1.0 协议）
+ `rds.tls11`（TLS 1.1 协议）
+ `rds.rc4`（RC4 密码）
+ `rds.curve25519`（Curve25519 加密）
+ `rds.3des168`（三重 DES 加密）

对于较早的引擎版本，Amazon RDS 默认情况下启用这些安全协议。

```
...

"ValidUpgradeTarget": [
    {
        "Engine": "sqlserver-se",
        "EngineVersion": "14.00.3281.6.v1",
        "Description": "SQL Server 2017 14.00.3281.6.v1",
        "AutoUpgrade": false,
        "IsMajorVersionUpgrade": false
    }
...
```

有关执行升级的更多信息，请参阅[升级 SQL Server 数据库实例](#USER_UpgradeDBInstance.SQLServer.Upgrading)。有关在 Amazon RDS 上可用的 SQL Server 版本的信息，请参阅 [Amazon RDS for Microsoft SQL Server](CHAP_SQLServer.md)。

Amazon RDS 还支持升级推出策略，以管理跨多个数据库资源和 AWS 账户的自动次要版本升级。有关更多信息，请参阅 [使用 AWS Organizations 升级推出策略自动升级次要版本](RDS.Maintenance.AMVU.UpgradeRollout.md)。

**Topics**
+ [RDS for SQL Server 的主要版本升级](USER_UpgradeDBInstance.SQLServer.Major.md)
+ [SQL Server 升级的注意事项](USER_UpgradeDBInstance.SQLServer.Considerations.md)
+ [测试 RDS for SQL Server 升级](USER_UpgradeDBInstance.SQLServer.UpgradeTesting.md)
+ [升级 SQL Server 数据库实例](#USER_UpgradeDBInstance.SQLServer.Upgrading)
+ [在支持结束之前升级已弃用的数据库实例](#USER_UpgradeDBInstance.SQLServer.DeprecatedVersions)

# RDS for SQL Server 的主要版本升级
<a name="USER_UpgradeDBInstance.SQLServer.Major"></a>

Amazon RDS 当前支持对 Microsoft SQL Server 数据库实例进行以下主要版本升级。

您可以将现有数据库实例从 SQL Server 2008 之外的任何版本升级到 SQL Server 2017 或 2019。要从 SQL Server 2008 升级，请先升级到其他版本之一。


****  

| 当前版本 | 支持的升级版本 | 
| --- | --- | 
|  SQL Server 2019  |  SQL Server 2022  | 
|  SQL Server 2017  |  SQL Server 2022 SQL Server 2019  | 
|  SQL Server 2016  |  SQL Server 2022 SQL Server 2019 SQL Server 2017  | 

您可以使用 AWS CLI 查询（如以下示例）来查找特定数据库引擎版本的可用升级。

**Example**  
对于 Linux、macOS 或 Unix：  

```
aws rds describe-db-engine-versions \
    --engine sqlserver-se \
    --engine-version 14.00.3281.6.v1 \
    --query "DBEngineVersions[*].ValidUpgradeTarget[*].{EngineVersion:EngineVersion}" \
    --output table
```
对于 Windows：  

```
aws rds describe-db-engine-versions ^
    --engine sqlserver-se ^
    --engine-version 14.00.3281.6.v1 ^
    --query "DBEngineVersions[*].ValidUpgradeTarget[*].{EngineVersion:EngineVersion}" ^
    --output table
```
输出显示您可以将版本 14.00.3281.6 升级到最新推出的 SQL Server 2017 或 2019 版本。  

```
--------------------------
|DescribeDBEngineVersions|
+------------------------+
|      EngineVersion     |
+------------------------+
|  14.00.3294.2.v1       |
|  14.00.3356.20.v1      |
|  14.00.3381.3.v1       |
|  14.00.3401.7.v1       | 
|  14.00.3421.10.v1      |
|  14.00.3451.2.v1       |
|  15.00.4043.16.v1      |
|  15.00.4073.23.v1      |
|  15.00.4153.1.v1       |
|  15.00.4198.2.v1       |
|  15.00.4236.7.v1       |
+------------------------+
```

## 数据库兼容性级别
<a name="USER_UpgradeDBInstance.SQLServer.Major.Compatibility"></a>

您可以使用 Microsoft SQL Server 数据库兼容性级别调整某些数据库行为，以模仿之前版本的 SQL Server。有关更多信息，请参阅 Microsoft 文档中的[兼容性级别](https://msdn.microsoft.com/en-us/library/bb510680.aspx)。在升级数据库实例时，任何现有的数据库将保持其原始兼容性级别。

您可以使用 ALTER DATABASE 命令更改数据库的兼容性级别。例如，要将名为 `customeracct` 的数据库更改为与 SQL Server 2016 兼容，请发出以下命令：

```
1. ALTER DATABASE customeracct SET COMPATIBILITY_LEVEL = 130
```

# SQL Server 升级的注意事项
<a name="USER_UpgradeDBInstance.SQLServer.Considerations"></a>

在升级流程期间，Amazon RDS 会创建两个数据库快照。第一个数据库快照是数据库实例在进行任何升级更改前的。第二个数据库快照是在升级结束后制作的。

**注意**  
如果您将数据库实例的备份保留期设置为大于 0 的数字，则 Amazon RDS 只需创建数据库快照。要更改您的备份保留期，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

升级完成后，您无法恢复为之前版本的数据库引擎。如果您想恢复到以前的版本，请从升级前创建的数据库快照还原以创建新的数据库实例。

在 SQL Server 的次要或主要版本升级期间，**Free Storage Space**和 **Disk Queue Depth** 指标将显示 `-1`。升级完毕后，这两个指标都将恢复正常。

在升级 SQL Server 实例之前，请查看以下信息。

**Topics**
+ [启动升级之前的最佳实践](#USER_UpgradeDBInstance.SQLServer.BestPractices)
+ [多可用区注意事项](#USER_UpgradeDBInstance.SQLServer.MAZ)
+ [只读副本注意事项](#USER_UpgradeDBInstance.SQLServer.readreplica)
+ [选项组注意事项](#USER_UpgradeDBInstance.SQLServer.OGPG.OG)
+ [参数组注意事项](#USER_UpgradeDBInstance.SQLServer.OGPG.PG)

## 启动升级之前的最佳实践
<a name="USER_UpgradeDBInstance.SQLServer.BestPractices"></a>

在开始升级过程之前，请实施以下准备步骤，以实现最佳的升级性能并最大限度地减少潜在问题：

时间和工作负载管理  
+ 安排在事务量较低的时段进行升级。
+ 在升级时段内尽量减少写入操作。
这样，Amazon RDS 就能够通过减少 RDS 在次要到主要配对期间需要还原的事务日志备份文件的数量，来更快地完成升级。

事务管理  
+ 确定并监控长时间运行的事务。
+ 在开始升级之前，确保所有关键事务都已提交。
+ 防止在升级时段内具有长时间运行的事务。

日志文件优化  
查看和优化事务日志文件：  
+ 缩小大小过大的日志文件。
+ 减少较高的日志消耗模式。
+ 管理虚拟日志文件（VLF）。
+ 为正常操作保留充足的可用空间。

## 多可用区注意事项
<a name="USER_UpgradeDBInstance.SQLServer.MAZ"></a>

Amazon RDS 通过使用 SQL Server 数据库镜像 (DBM) 或 Always On 可用性组 (AG) 支持为运行 Microsoft SQL Server 的数据库实例进行多可用区部署。有关更多信息，请参阅 [Amazon RDS for Microsoft SQL Server 多可用区部署](USER_SQLServerMultiAZ.md)。

在多可用区部署（Mirroring/AlwaysOn）中，当请求升级时，RDS 会对主实例和辅助实例采用滚动升级策略。滚动升级可确保在辅助实例升级期间至少有一个实例可用于事务。预计中断只会持续失效转移的这段期间。

在升级期间，RDS 会将辅助实例从多可用区配置中移除，对辅助实例执行升级，并还原在主实例断开连接期间从主实例获取的所有事务日志备份。还原所有日志备份后，RDS 会将升级后的辅助实例加入主实例。当所有数据库都处于同步状态时，RDS 会失效转移到已升级的辅助实例。失效转移完成后，RDS 将继续升级旧的主实例，还原所有事务日志备份，并使其与新的主实例配对。

为了尽量减少此失效转移持续时间，我们建议，当使用在连接字符串中支持 `MultiSubnetFailover` 连接选项的客户端库时，使用 AlwaysOn AG 可用性组侦听器端点。使用可用性组侦听器端点时，失效转移时间通常少于 10 秒，但是，此持续时间不包括任何额外的崩溃恢复时间。

## 只读副本注意事项
<a name="USER_UpgradeDBInstance.SQLServer.readreplica"></a>

在数据库版本升级期间，Amazon RDS 会升级所有只读副本以及主数据库实例。Amazon RDS 不支持单独对只读副本进行数据库版本升级。有关只读副本的更多信息，请参阅 [在 Amazon RDS 中使用 Microsoft SQL Server 的只读副本](SQLServer.ReadReplicas.md)。

当您执行主数据库实例的数据库版本升级时，该实例的所有只读副本也会自动升级。Amazon RDS 将在升级主数据库实例之前同时升级所有只读副本。在主数据库实例上的数据库版本升级完成之前，只读副本可能不可用。

## 选项组注意事项
<a name="USER_UpgradeDBInstance.SQLServer.OGPG.OG"></a>

如果数据库实例使用自定义数据库选项组，则在某些情况下，Amazon RDS 无法自动向数据库实例分配新的选项组。例如，在您升级到新的主要版本时，必须指定新的选项组。我们建议您创建新的选项组，然后向该组添加与现有自定义选项组相同的选项。

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

## 参数组注意事项
<a name="USER_UpgradeDBInstance.SQLServer.OGPG.PG"></a>

如果您的数据库实例使用自定义数据库参数组：
+ Amazon RDS 在升级后自动重新启动数据库实例。
+ 在某些情况下，RDS 无法自动为您的数据库实例分配新参数组。

  例如，在升级到新的主要版本时，必须指定新参数组。我们建议您创建新参数组，然后配置您现有的自定义参数组中的那些参数。

有关更多信息，请参阅 [在 Amazon RDS 中创建数据库参数组](USER_WorkingWithParamGroups.Creating.md) 或 [在 Amazon RDS 中复制数据库参数组](USER_WorkingWithParamGroups.Copying.md)。

# 测试 RDS for SQL Server 升级
<a name="USER_UpgradeDBInstance.SQLServer.UpgradeTesting"></a>

在数据库实例上执行主要版本升级前，应该彻底地测试数据库以及访问该数据库的所有应用程序，了解是否与新版本兼容。我们建议您使用以下过程。

**测试主要版本升级**

1. 对于数据库引擎的新版本，查看 Microsoft 文档中的[升级 SQL Server](https://docs.microsoft.com/en-us/sql/database-engine/install-windows/upgrade-sql-server)，以了解是否存在可能会影响数据库或应用程序的兼容性问题。

1. 如果数据库实例使用自定义选项组，则创建与您正升级到的新版本兼容的新选项组。有关更多信息，请参阅“[选项组注意事项](USER_UpgradeDBInstance.SQLServer.Considerations.md#USER_UpgradeDBInstance.SQLServer.OGPG.OG)”。

1. 如果数据库实例使用自定义参数组，则创建与您正升级到的新版本兼容的新参数组。有关更多信息，请参阅“[参数组注意事项](USER_UpgradeDBInstance.SQLServer.Considerations.md#USER_UpgradeDBInstance.SQLServer.OGPG.PG)”。

1. 为要升级的数据库实例创建数据库快照。有关更多信息，请参阅“[为 Amazon RDS 的单可用区数据库实例创建数据库快照](USER_CreateSnapshot.md)”。

1. 恢复数据库快照，以便创建一个新的测试数据库实例。有关更多信息，请参阅“[还原到数据库实例](USER_RestoreFromSnapshot.md)”。

1. 使用下面介绍的一种方法来修改此新测试数据库实例，以将其升级到新版本：
   + [控制台](USER_UpgradeDBInstance.Upgrading.md#USER_UpgradeDBInstance.Upgrading.Manual.Console)
   + [AWS CLI](USER_UpgradeDBInstance.Upgrading.md#USER_UpgradeDBInstance.Upgrading.Manual.CLI)
   + [RDS API](USER_UpgradeDBInstance.Upgrading.md#USER_UpgradeDBInstance.Upgrading.Manual.API)

1. 计算升级的实例使用的存储容量以决定升级是否需要额外的存储容量。

1. 对升级的数据库实例运行所需次数的质量保证测试以确保数据库和应用程序可正常使用新版本。实施任何必需的新测试，评估您在步骤 1 中发现的任何兼容性问题的影响。测试所有的存储过程和功能。将应用程序的测试版本指向所升级的数据库实例。

1. 如果所有测试通过，那么请在生产数据库实例上执行升级。我们建议您直到确认一切正常后，再允许对数据库实例执行写入操作。

## 升级 SQL Server 数据库实例
<a name="USER_UpgradeDBInstance.SQLServer.Upgrading"></a>

有关手动或自动升级 SQL Server 数据库实例的信息，请参阅以下信息：
+ [升级数据库实例 引擎版本](USER_UpgradeDBInstance.Upgrading.md)
+ [在 Amazon RDS for SQL Server 上将 SQL Server 2008 R2 升级到 SQL Server 2016 的最佳实践](https://aws.amazon.com/blogs/database/best-practices-for-upgrading-sql-server-2008-r2-to-sql-server-2016-on-amazon-rds-for-sql-server/)

**重要**  
如果您有任何使用 AWS KMS 进行加密的快照，建议您在支持结束之前启动升级。

## 在支持结束之前升级已弃用的数据库实例
<a name="USER_UpgradeDBInstance.SQLServer.DeprecatedVersions"></a>

主要版本被弃用之后，您不能在新数据库实例上安装它。RDS 将尝试自动升级所有现有数据库实例。

如果您需要恢复已弃用的数据库实例，可以执行时间点恢复 (PITR) 或还原快照。这样做可让您获得使用已弃用版本的数据库实例的临时访问权。但是，在主要版本完全弃用之后，这些数据库实例也将自动升级到支持的版本。