在 Amazon RDS 中使用 Microsoft SQL Server 的只读副本
一般使用只读副本配置 Amazon RDS 数据库实例之间的复制。有关只读副本的一般信息,请参阅使用数据库实例只读副本。
在本部分中,您可以找到有关使用 Amazon RDS for SQL Server 上的只读副本的特定信息。
主题
为 SQL Server 配置只读副本
数据库实例可充当复制的源实例之前,您必须在源数据库实例上启用自动备份。为此,请将备份保留期设定为非 0 值。源数据库实例必须是具有 Always On 可用性组 (AG) 的多可用区部署。设置此类部署还会强制启用自动备份。
创建 SQL Server 只读副本不需要中断源数据库实例。Amazon RDS 为源数据库实例和只读副本设置必要的参数和权限,而不会中断任务服务。将创建源数据库实例的快照,此快照将变为只读副本。在删除只读副本时不会发生中断。
您可以从一个源数据库实例创建最多 15 个只读副本。为了有效地进行复制,我们建议您为每个只读副本配置与源数据库实例数量相同的计算和存储资源。如果扩展源数据库实例,则还应扩展只读副本。
源数据库实例及其所有只读副本的 SQL Server 数据库引擎版本必须相同。无论维护时段如何,Amazon RDS 都会在升级只读副本后立即升级主要副本。有关升级数据库引擎版本的更多信息,请参阅升级 Microsoft SQL Server 数据库引擎。
为了让只读副本可以接收和应用源数据库实例的更改,它应具有足够的计算和存储资源。如果只读副本达到计算、网络或存储资源容量,则只读副本会停止接收或应用来自其源实例的更改。您可以单独修改某个只读副本的存储和 CPU 资源,不受其源实例及其他只读副本的影响。
SQL Server 的只读副本限制
以下限制适用于 Amazon RDS 上的 SQL Server 只读副本:
-
只读副本仅在 SQL Server 企业版 (EE) 引擎中可用。
-
只读副本可用于 SQL Server 版本 2016–2019。
-
待复制的源数据库实例必须是具有 Always On AG 的多可用区部署。
-
您可以从一个源数据库实例创建最多 15 个只读副本。
-
只读副本仅适用于在具有四个或更多 vCPU 的数据库实例类上运行的数据库实例。
-
Amazon RDS for SQL Server 不支持以下内容:
-
只读副本的备份保留
-
从只读副本进行时间点恢复
-
只读副本的手动快照
-
多可用区只读副本
-
创建只读副本的只读副本
-
将用户登录同步到只读副本
-
-
Amazon RDS for SQL Server 不会通过干预来缓解源数据库实例及其只读副本之间的高副本滞后。确保源数据库实例及其只读副本在计算能力和存储方面具有适当的大小,可以适合其运营负载。
RDS for SQL Server 副本的选项注意事项
在创建 RDS for SQL Server 副本之前,请考虑以下要求、限制和建议:
-
如果 SQL Server 副本与其源数据库实例位于同一区域,请确保它与源数据库实例属于同一选项组。对源选项组或源选项组成员资格做出的修改会传播到副本。不管副本的维护时段是什么,这些更改在应用到源数据库实例后,都会立即应用到副本。
有关选项组的更多信息,请参阅 使用选项组。
-
在您创建 SQL Server 跨区域副本时,Amazon RDS 会为其创建专用选项组。
您无法从专用选项组中删除 SQL Server 跨区域副本。任何其他数据库实例都无法使用 SQL Server 跨区域副本的专用选项组。
以下选项为复制的选项。要将复制的选项添加到 SQL Server 跨区域只读副本,请将其添加到源数据库实例的选项组中。选项还会安装在源数据库实例的所有副本上。
-
TDE
以下选项为非复制的选项。您可以在专用选项组中添加或删除未复制的选项。
-
MSDTC
-
SQLSERVER_AUDIT
-
要对跨区域只读副本启用
SQLSERVER_AUDIT
选项,请在跨区域只读副本上的专用选项组和源实例的选项组上添加SQLSERVER_AUDIT
选项。通过在 SQL Server 跨区域只读副本的源实例上添加SQLSERVER_AUDIT
选项,可以在源实例的每个跨区域只读副本上创建服务器级审计对象和服务器级审计规范。要允许跨区域只读副本访问以将完成的审计日志上载到 Amazon S3 桶,请将SQLSERVER_AUDIT
选项添加到专用选项组并配置选项设置。您用作审计文件目标的 Amazon S3 桶必须与跨区域只读副本位于同一区域中。您可以单独修改每个跨区域只读副本的SQLSERVER_AUDIT
选项的选项设置,以便每个只读副本都能访问各自区域中的 Amazon S3 桶。
跨区域只读副本不支持以下选项。
-
SSRS
-
SSAS
-
SSIS
跨区域只读副本部分支持以下选项。
-
SQLSERVER_BACKUP_RESTORE
-
SQL Server 跨区域副本的源数据库实例可以具有
SQLSERVER_BACKUP_RESTORE
选项,但在删除源数据库实例的所有跨区域副本之前,您无法对源数据库实例执行原生还原。在创建跨区域副本期间,任何现有的原生还原任务都将被取消。您无法将SQLSERVER_BACKUP_RESTORE
选项添加到专用选项组。有关原生备份和还原的更多信息,请参阅 使用本机备份和还原导入和导出 SQL Server 数据库。
提升 SQL Server 跨区域只读副本时,提升后的副本的行为与其他 SQL Server 数据库实例相同,包括其选项的管理。有关选项组的更多信息,请参阅 使用选项组。
-
将数据库用户和对象与 SQL Server 只读副本同步
创建只读副本时主数据库实例中存在的任何登录名、自定义服务器角色、SQL 代理任务或其他服务器级对象,都应出现在新创建的只读副本中。但是,在创建只读副本后在主数据库实例中创建的任何服务器级对象不会自动复制,您必须在只读副本中手动创建它们。
数据库用户将自动从主数据库实例复制到只读副本。由于只读副本数据库处于只读模式,因此无法在数据库中更新数据库用户的安全标识符(SID)。因此,当在只读副本中创建 SQL 登录名时,务必确保该登录名的 SID 与主数据库实例中相应 SQL 登录名的 SID 相匹配。如果您未同步 SQL 登录名的 SID,这些登录名将无法访问只读副本中的数据库。经 Windows Active Directory(AD)身份验证的登录名不会遇到此问题,因为 SQL Server 从 Active Directory 获取 SID。
将 SQL 登录名从主数据库实例同步到只读副本
-
连接到主数据库实例。
-
在主数据库实例中创建新的 SQL 登录名。
USE [master] GO CREATE LOGIN
TestLogin1
WITH PASSWORD = 'REPLACE WITH PASSWORD
';注意
作为安全最佳实践,请指定除此处所示提示以外的密码。
-
为数据库中的 SQL 登录名创建新的数据库用户。
USE [
REPLACE WITH YOUR DB NAME
] GO CREATE USERTestLogin1
FOR LOGINTestLogin1
; GO -
检查主数据库实例中新创建的 SQL 登录名的 SID。
SELECT name, sid FROM sys.server_principals WHERE name =
TestLogin1
; -
连接到只读副本。创建新的 SQL 登录名。
CREATE LOGIN
TestLogin1
WITH PASSWORD = 'REPLACE WITH PASSWORD
', SID=[REPLACE WITH sid FROM STEP #4
];
或者,如果您有权访问只读副本数据库,则可以按如下方式修复孤立用户:
-
连接到只读副本。
-
识别数据库中的孤立用户。
USE [
REPLACE WITH YOUR DB NAME
] GO EXEC sp_change_users_login 'Report'; GO -
为孤立的数据库用户创建新的 SQL 登录名。
CREATE LOGIN
TestLogin1
WITH PASSWORD = 'REPLACE WITH PASSWORD
', SID=[REPLACE WITH sid FROM STEP #2
];示例:
CREATE LOGIN
TestLogin1
WITH PASSWORD = 'TestPa$$word#1
', SID=[0x1A2B3C4D5E6F7G8H9I0J1K2L3M4N5O6P
];注意
作为安全最佳实践,请指定除此处所示提示以外的密码。
排除 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
;