适用于:SQL Server
在 SQL Server 2012 和 2014 中,初始化 SQL Server Always On 可用性组中的次要副本的唯一方法是使用备份、复制和还原。 SQL Server 2016 引入了用于初始化次要副本的新功能“自动种子设定”。 自动设定种子使用日志流传输,通过 VDI 将可用性组中每个数据库的备份流式传送到其次要副本,并使用已配置的端点。 最初创建可用性组或将数据库添加到可用性组时,可以使用此新功能。 自动设定种子在所有支持 Always On 可用性组的 SQL Server 版本中均可用,并且可用于传统可用性组和分布式可用性组。
安全性
安全性权限根据要初始化的副本类型而有所不同:
- 对于传统可用性组,在将次要副本加入可用性组时,必须向该次要副本上的可用性组授予权限。 在 Transact-SQL 中,使用命令
ALTER AVAILABILITY GROUP [<AGName>] GRANT CREATE ANY DATABASE。 - 对于分布式可用性组(其中正在创建的副本的数据库位于第二个可用性组的主要副本上),无需额外的权限,因为它已是主要副本。 但是,如果第二个可用性组中只有一个副本,则向次要可用性组名称授予
CREATE ANY DATABASE权限,否则自动设定种子可能会失败。 - 对于分布式可用性组的第二个可用性组上的次要副本,必须使用命令
ALTER AVAILABILITY GROUP [<2ndAGName>] GRANT CREATE ANY DATABASE。 此辅助副本由第二个可用性组的主副本进行播种。
对主副本的性能和事务日志的影响
自动种子设定是否可用于初始化次要副本具体取决于数据库大小、网络速度,以及主要副本和次要副本之间的距离。 例如,给定:
- 数据库大小为 5 TB
- 网络速度为 1 Gb/秒
- 两个站点之间的距离为 1000 英里
如果最大带宽可用,每秒 1 Gb 的网络可以提供 125 MB/秒的持续吞吐量。在上述条件下,自动种子设定需要超过 11 个小时的时间。 实际上,自动初始化过程会更慢,因为网络信号会随着距离增加而衰减,而且该链路还需要与网络上的其他资源共享。 在种子设定过程中,主要副本上的数据库事务日志将继续增大,并且在该数据库的自动种子设定完成之前无法截断。 然后,可通过事务日志备份来截断事务日志。
自动种子设定是一种可处理最多五个数据库的单线程进程。 单线程可能会影响性能,尤其是在可用性组具有多个数据库的情况下。
压缩可用于自动做种,但默认处于禁用状态。 启用压缩可减少网络带宽并可能加快进程速度,但代价是增加处理器开销。 若要在执行自动种子设定期间使用压缩,请启用跟踪标志 9567;请参阅 为可用性组调整压缩设置。
磁盘布局
在 SQL Server 2016 及更早版本中,自动播种创建数据库所使用的文件夹必须预先存在,并且其路径必须与主副本上的路径相同。
在 SQL Server 2017 中,Microsoft 建议对参与可用性组的所有副本使用相同的数据和日志文件路径,但如有必要,可使用其他路径。 例如,在跨平台可用性组中,SQL Server 的一个实例适用于 Windows,而 SQL Server 的另一实例适用于 Linux。 不同平台的默认路径不同。 SQL Server 2017 支持具有不同默认路径的 SQL Server 实例的可用性组副本。
下表列出了支持自动设定种子的受支持数据磁盘布局示例:
| 主要实例 默认数据路径 |
辅助实例 默认数据路径 |
主要实例 源文件位置 |
辅助实例 目标文件位置 |
|---|---|---|---|
| c:\data\ | /var/opt/mssql/data/ | c:\data\ | /var/opt/mssql/data/ |
| c:\data\ | /var/opt/mssql/data/ | c:\data\group1\ | /var/opt/mssql/data/group1/ |
| c:\data\ | d:\data\ | c:\data\ | d:\data\ |
| c:\data\ | d:\data\ | c:\data\group1\ | d:\data\group1\ |
其中主要和辅助副本数据库位置不是实例的默认路径的方案不受此更改影响。 对用于匹配主副本文件路径的辅助副本文件路径的要求保持不变。
| 主要实例 默认数据路径 |
辅助实例 默认数据路径 |
主要实例 文件位置 |
辅助实例 文件位置 |
|---|---|---|---|
| c:\data\ | c:\data\ | d:\group1\ | d:\group1\ |
| c:\data\ | c:\data\ | d:\data\ | d:\data\ |
| c:\data\ | c:\data\ | d:\data\group1\ | d:\data\group1\ |
如果混合使用主要和辅助副本上的默认和非默认路径,SQL Server 2017 的行为将不同于之前的版本。 下表显示了 SQL Server 2017 的行为。
| 主要实例 默认数据路径 |
辅助实例 默认数据路径 |
主要实例 文件位置 |
SQL Server 2016 辅助实例 文件位置 |
SQL Server 2017 辅助实例 文件位置 |
|---|---|---|---|---|
| c:\data\ | d:\data\ | c:\data\ | c:\data\ | d:\data\ |
| c:\data\ | d:\data\ | c:\data\group1\ | c:\data\group1\ | d:\data\group1\ |
若要恢复到 SQL Server 2016 和之前版本的行为,请启用跟踪标志 9571。 有关如何启用跟踪标志的信息,请参阅 DBCC TRACEON (Transact-SQL)。
创建具有自动播种功能的可用性组
您可以使用 Transact-SQL 或 SQL Server Management Studio(SSMS,17 或更高版本),通过自动播种创建可用性组。 若要使用 SSMS 中的可用性组向导,请遵循这些说明 - 进行到步骤 9 时,你将看到自动种子设定为第一个和默认选项。
以下示例使用 Transact-SQL 创建启用了自动设定初始值的可用性组。 另请参阅主题创建可用性组 (Transact-SQL)。 将 SEEDING_MODE 选项设置为 AUTOMATIC,即可在次要副本上启用种子设定。 默认行为是 MANUAL,这是 SQL Server 2016 之前的行为,需要在主要副本上进行数据库备份、将备份文件复制到次要副本并通过 WITH NORECOVERY 还原备份。
CREATE AVAILABILITY GROUP [<AGName>]
FOR DATABASE db1
REPLICA ON N'Primary_Replica'
WITH (
ENDPOINT_URL = N'TCP://Primary_Replica.Contoso.com:5022',
FAILOVER_MODE = AUTOMATIC,
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT
),
N'Secondary_Replica' WITH (
ENDPOINT_URL = N'TCP://Secondary_Replica.Contoso.com:5022',
FAILOVER_MODE = AUTOMATIC,
SEEDING_MODE = AUTOMATIC);
GO
在执行 SEEDING_MODE 语句期间在主要副本上设置 CREATE AVAILABILITY GROUP 不起作用,因为主要副本已包含数据库的主要读/写副本。 仅当另一个副本被设为主要副本并添加数据库时,才应用 SEEDING_MODE。 稍后可更改种子设定模式 - 请参阅更改副本的种子设定模式。
在成为次要副本的实例上,一旦联接实例,SQL Server 日志中将添加以下消息:
可用性组“AGName”的本地可用性副本未被授予创建数据库的权限,但其
SEEDING_MODE为AUTOMATIC。 使用ALTER AVAILABILITY GROUP ... GRANT CREATE ANY DATABASE,以便允许创建由主可用性副本初始化的数据库。
授予可用性组在复制副本上创建数据库的权限
加入后,授予可用性组在 SQL Server 的辅助副本实例上创建数据库的权限。 若要使自动播种正常工作,可用性组需要具有创建数据库的权限。
提示
当可用性组在辅助副本上创建数据库时,它将“sa”(更具体地说是 sid 0x01 的帐户)设置为数据库的所有者。
若要在辅助副本自动创建数据库后更改数据库所有者,请使用 ALTER AUTHORIZATION。 请参阅ALTER AUTHORIZATION(Transact-SQL)。
以下示例对名为 AGName 的可用性组授予此权限。
ALTER AVAILABILITY GROUP [<AGName>]
GRANT CREATE ANY DATABASE
GO
如有必要,请在辅助副本上设置数据库的所有者。
验证自动植入
如果成功,则将在次要副本上自动创建具有下列任一状态的数据库:
- 已同步(如果次要副本配置为同步,且数据已同步)。
- 正在同步(如果次要副本配置为异步数据移动,或者配置为同步数据移动但尚未与主副本同步)。
除了下文所述的动态管理视图之外,还可以在 SQL Server 日志中查看自动种子设定的开始和完成情况:
将备份和还原与自动种子设定结合起来
可以将传统的备份、复制和还原与自动设定种子结合使用。 在这种情况下,首先还原次要副本上的数据库,包括所有可用的事务日志。 接下来,在创建可用性组时启用自动设定种子,以使次要副本的数据库赶上进度,就像已还原了尾日志备份一样(请参阅 尾日志备份 (SQL Server))。
使用自动种子设定将数据库添加到可用性组
可以使用 Transact-SQL 或 SQL Server Management Studio(SSMS,版本 17 或更高版本),通过自动设定种子将数据库添加到可用性组中。
如果在将其次要副本添加到可用性组时使用了自动播种,则无需再执行任何其他操作。 如果辅助副本使用了备份、复制和还原,请首先更改种子设定模式(请参阅下一节),然后使用 GRANT 语句添加数据库 - 请参阅可用性组 - 添加数据库。
更改副本的播种模式
创建可用性组后,可以更改副本的种子设定模式,因此可以启用或禁用自动种子设定。 在创建后启用自动种子设定后,如果数据库是通过备份、复制和还原方式创建的,则可使用自动种子设定将其添加到可用性组中。 例如:
ALTER AVAILABILITY GROUP [AGName]
MODIFY REPLICA ON 'Replica_Name'
WITH (SEEDING_MODE = AUTOMATIC)
若要禁用自动播种,请将该值设为 MANUAL。
在创建可用性组后禁止自动播种
如果不希望对次要副本完全禁用自动种子设定,但想要暂时防止次要副本自动创建数据库,请拒绝可用性组 CREATE 权限。 在以下情况下会出现这种情况:已将新数据库添加到可用性组中,但不应允许可用性组在次要副本上创建该数据库。
ALTER AVAILABILITY GROUP [AGName]
DENY CREATE ANY DATABASE
GO
监控自动播种
监视自动种子设定并对其进行故障排除的方法有四种:
- SQL Server 日志(之前已介绍)
- 动态管理视图
- 备份历史记录表
- 扩展的事件
动态管理视图
有两个动态管理视图 (DMV) 可用于监视播种过程:sys.dm_hadr_automatic_seeding 和 sys.dm_hadr_physical_seeding_stats。
sys.dm_hadr_automatic_seeding包含自动播种的总体状态,并保留每次执行的历史记录(无论成功与否)。 列current_state的值为 COMPLETED 或 FAILED。 如果该值为 FAILED,请借助failure_state_desc中的值来帮助诊断该问题。 可能需要将其与 SQL Server 日志中的内容相结合,以确定问题所在。 此 DMV 会在主副本和所有辅助副本上填充数据。sys.dm_hadr_physical_seeding_stats显示自动种子设定操作执行期间的状态。 与sys.dm_hadr_automatic_seeding一样,该项会同时返回主副本和辅助副本的值,但不会存储这些历史记录。 这些值仅适用于当前执行,且不会保留。 相关列包括start_time_utcend_time_utc、estimate_time_complete_utc、total_disk_io_wait_time_ms和total_network_wait_time_ms,并且如果种子设定操作失败,则会显示 failure_message。
备份历史记录表
自动种子设定还会将条目放入 msdb 表中,该表存储用于备份和还原的历史记录。 在接收自动种子设定的次要副本上,backupmediafamily 表的 physical_device_name 列的值为 GUID,backupset 中的相应条目为 server_name 和 machine_name 的主要副本的名称。
扩展事件
自动种子设定添加了新的扩展事件,用于在初始化过程中跟踪状态更改、故障和性能统计信息。 例如,以下脚本会创建一个扩展事件会话,用于捕获与自动播种相关的事件。
CREATE EVENT SESSION [AlwaysOn_autoseed] ON SERVER
ADD EVENT sqlserver.hadr_automatic_seeding_state_transition,
ADD EVENT sqlserver.hadr_automatic_seeding_timeout,
ADD EVENT sqlserver.hadr_db_manager_seeding_request_msg,
ADD EVENT sqlserver.hadr_physical_seeding_backup_state_change,
ADD EVENT sqlserver.hadr_physical_seeding_failure,
ADD EVENT sqlserver.hadr_physical_seeding_forwarder_state_change,
ADD EVENT sqlserver.hadr_physical_seeding_forwarder_target_state_change,
ADD EVENT sqlserver.hadr_physical_seeding_progress,
ADD EVENT sqlserver.hadr_physical_seeding_restore_state_change,
ADD EVENT sqlserver.hadr_physical_seeding_submit_callback
ADD TARGET package0.event_file(
SET filename=N'autoseed.xel',
max_file_size=(5),
max_rollover_files=(4)
)
WITH (
MAX_MEMORY=4096 KB,
EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,
MAX_DISPATCH_LATENCY=30 SECONDS,
MAX_EVENT_SIZE=0 KB,
MEMORY_PARTITION_MODE=NONE,
TRACK_CAUSALITY=OFF,
STARTUP_STATE=ON
)
GO
ALTER EVENT SESSION AlwaysOn_autoseed ON SERVER STATE=START
GO
下表列出了与自动种子设定相关的扩展事件。
| 名称 | 说明 |
|---|---|
| hadr_db_manager_seeding_request_msg | 种子设定请求消息。 |
| hadr_physical_seeding_backup_state_change | 物理播种备份端状态更改。 |
| hadr_physical_seeding_restore_state_change | 物理播种还原端状态更改 |
| 高可用性和灾难恢复物理设定转发器状态更改 | 物理数据导入转发器端状态变更。 |
| HADR 物理播种转发器目标状态更改 | 物理种子传送转发器目标端状态变更。 |
| hadr_physical_seeding_submit_callback | 物理播种提交回调事件。 |
| hadr_physical_seeding_failure | 物理播种失败事件。 |
| hadr_physical_seeding_progress | 物理播种进度事件。 |
| hadr_physical_seeding_schedule_long_task_failure | 物理播种计划任务长时间任务失败事件。 |
| hadr_automatic_seeding_start | 在提交自动种子设定操作时发生。 |
| hadr_automatic_seeding_state_transition | 在自动种子设定操作更改状态时发生。 |
| hadr_automatic_seeding_success | 在自动种子设定操作成功时发生。 |
| hadr_automatic_seeding_failure | 在自动种子设定操作失败时发生。 |
| hadr_automatic_seeding_timeout | 当自动播种操作超时时,会发生此情况。 |
另请参阅
ALTER AVAILABILITY GROUP (Transact-SQL)