在 Amazon RDS 中使用 Microsoft SQL Server 的只读副本 - Amazon Relational Database Service
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

在 Amazon RDS 中使用 Microsoft SQL Server 的只读副本

一般使用只读副本配置 Amazon RDS 数据库实例之间的复制。有关只读副本的一般信息,请参阅使用只读副本

在本部分中,您可以找到有关使用 Amazon RDS for SQL Server 上的只读副本的特定信息。

为 SQL Server 配置只读副本

数据库实例可充当复制的源实例之前,您必须在源数据库实例上启用自动备份。为此,请将备份保留期设定为非 0 值。源数据库实例必须是具有 Always On 可用性组 (AG) 的多可用区部署。设置此类部署还会强制启用自动备份。

创建 SQL Server 只读副本不需要中断主数据库实例。Amazon RDS 为源数据库实例和只读副本设置所需的参数和权限,而不中断任何服务。将创建源数据库实例的快照,此快照将变为只读副本。在删除只读副本时不会发生中断。

您可以从一个源数据库实例创建最多 5 个只读副本。为了有效地进行复制,每个只读副本具有的计算和存储资源的量应与源数据库实例的一样多。如果扩展源数据库实例,则还应扩展只读副本。

源数据库实例的 SQL Server 数据库引擎版本及其所有只读副本必须相同。Amazon RDS 在升级只读副本后,不论维护时段是什么,都将立即升级主实例。有关升级数据库引擎版本的更多信息,请参阅升级 Microsoft SQL Server 数据库引擎

为了让只读副本可以接收和应用源数据库实例的更改,它应具有足够的计算和存储资源。如果只读副本达到计算、网络或存储资源容量,则只读副本会停止接收或应用来自其源实例的更改。您可以单独修改某个只读副本的存储和 CPU 资源,不受其源实例及其他只读副本的影响。

SQL 服务器的只读副本限制

以下限制适用于 Amazon RDS 上的 SQL Server 只读副本:

  • 只读副本仅在 SQL Server 企业版 (EE) 引擎中可用。

  • 只读副本可用于 SQL Server 版本 2016 和 2017。

  • 待复制的源数据库实例必须是具有 Always On AG 的多可用区部署。

  • 只读副本仅适用于 EC2-VPC 平台上的数据库实例。

  • 只读副本仅适用于在具有四个或更多 vCPU 的数据库实例类上运行的数据库实例。

  • Amazon RDS for SQL Server 不支持以下内容:

    • 在其他 AWS 区域中创建只读副本(跨区域只读副本)

    • 只读副本的备份保留

    • 从只读副本进行时间点恢复

    • 只读副本的手动快照

    • 多可用区只读副本

    • 创建只读副本的只读副本

    • 将用户登录同步到只读副本

  • Amazon RDS for SQL Server 不会通过干预来缓解源数据库实例及其只读副本之间的高副本滞后。确保源数据库实例及其只读副本在计算能力和存储方面具有适当的大小,可以适合其运营负载。

  • SQL Server 只读副本属于与源数据库实例相同的选项组。对源选项组或源选项组成员资格作出的修改会传播到只读副本。将这些更改应用到源数据库实例之后,它们也会立即应用到只读副本,而不管只读副本的维护时段是什么。

    有关选项组的更多信息,请参阅 使用选项组

排除 SQL Server 只读副本问题

您可以通过查看 Amazon RDS ReplicaLag 指标,在 Amazon CloudWatch 中监控复制滞后。有关使用复制滞后时间的信息,请参阅 监控只读复制

如果复制滞后时间太长,则您可以使用以下查询,获取有关滞后的信息。

SELECT AR.replica_server_name , DB_NAME (ARS.database_id) 'database_name' , AR.availability_mode_desc , ARS.synchronization_health_desc , ARS.last_hardened_lsn , ARS.last_redone_lsn , ARS.secondary_lag_seconds FROM sys.dm_hadr_database_replica_states ARS INNER JOIN sys.availability_replicas AR ON ARS.replica_id = AR.replica_id --WHERE DB_NAME(ARS.database_id) = 'database_name' ORDER BY AR.replica_server_name;