在 SQL Server 2012 和 2014 中,初始化 SQL Server Always On 可用性组中的次要副本的唯一方法是手动执行备份、复制和还原。SQL Server 2016 引入了用于自动初始化次要副本数据库的新功能“自动种子设定” 。 自动种子设定使用日志流传输,使用 VDI 备份并将备份传输到使用endpoints配置的次要副本的每个数据库。 此新特性可以在最初创建可用性组,或将数据库添加到可用性组时使用,并且可与传统可用性组或分布式可用性组一起使用。
一、 用前须知
1. 安全性
权限根据要初始化的副本类型有所不同:
- 对于传统可用性组,必须给从副本上的AG授权,因为它已加入到可用性组。
ALTER AVAILABILITY GROUP [<AGName>] GRANT CREATE ANY DATABASE;
- 对于分布式可用性组从AG的主副本,无需额外的权限,因为它已是主副本。
- 对于分布式可用性组从AG的从副本,必须使用以下命令。从AG的从副本将它通过自己的主副本(即从AG的主副本)进行自动种子设定。
ALTER AVAILABILITY GROUP [<2ndAGName>] GRANT CREATE ANY DATABASE;
2. 自动种子设定对主副本的性能和事务日志影响
在某些情况下,自动种子设定可能不是初始化次要副本的最优选择。 自动种子设定过程中,SQL Server 通过网络执行备份以进行初始化。 如果数据库非常大或者次要副本是远程副本,此过程会很缓慢。 在备份过程中,无法截断这些数据库的事务日志,因此,如果繁忙的数据库初始化过程耗时冗长,则可能导致事务日志大幅增加。 在将数据库添加到具有自动种子设定的可用性组之前,请先评估数据库大小、负载和副本之间的站点距离。
自动种子设定是单线程进程,最多可处理五个数据库。 单线程可能会影响性能,尤其是在可用性组具有多个数据库的情况下。在主实例中,SQL Server 对每个 LUN 使用一个线程来读取更改。 在从实例中,则对每个 LUN 使用一个线程来初始化数据库。
自动种子设定可以使用压缩(默认处于禁用状态)。启用压缩可减少网络带宽并可能减少自动种子设定的传输时间,但也会增大 CPU 使用率。若要在自动种子设定过程中使用压缩,请启用跟踪标志 9567 - 请参阅调整可用性组的压缩。
3. 必备条件与磁盘布局
在 SQL Server 2016 中,自动种子设定要求数据和日志文件路径在参与可用性组的每个 SQL Server 实例上均相同。 在 2017 中,你可以使用不同的路径,但是 Microsoft 建议,当所有副本都承载于相同的平台(例如 Windows 或 Linux)时,使用相同的路径。 跨平台可用性组针对副本具有不同的路径。 有关详细信息,请参阅下表。
下表列出了自动种子设定支持的数据磁盘布局示例:
主实例 默认数据路径 |
辅助实例 默认数据路径 |
主实例 源文件位置 |
辅助实例 目标文件位置 |
---|---|---|---|
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 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)。
二、 使用自动种子设定创建可用性组
1. 图形化界面
使用SQL Server Management Studio(SSMS,版本17或更高版本)创建可用性组,你将看到自动种子设定为默认选项。
2. T-SQL创建
-
创建终结点
每台服务器需要一个终结点。 以下脚本创建将 TCP 端口 5022 用于侦听器的终结点。 设置 <endpoint_name> 和 LISTENER_PORT 以匹配你的环境并在两个服务器上运行该脚本:
CREATE ENDPOINT [<endpoint_name>]
STATE=STARTED
AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL)
FOR DATA_MIRRORING (
ROLE = ALL,
AUTHENTICATION = WINDOWS NEGOTIATE,
ENCRYPTION = REQUIRED ALGORITHM AES
)
GO
- 创建可用性组
下面的脚本将创建可用性组。在 SQL Server 的主实例上运行。
CREATE AVAILABILITY GROUP [<availability_group_name>]
FOR DATABASE db1
REPLICA ON'<*primary_server*>'
WITH (ENDPOINT_URL = N'TCP://<primary_server>.<fully_qualified_domain_name>:5022',
FAILOVER_MODE = AUTOMATIC,
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
BACKUP_PRIORITY = 50,
SECONDARY_ROLE(ALLOW_CONNECTIONS = NO),
SEEDING_MODE = AUTOMATIC),
N'<secondary_server>' WITH (ENDPOINT_URL = N'TCP://<secondary_server>.<fully_qualified_domain_name>:5022',
FAILOVER_MODE = AUTOMATIC,
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
BACKUP_PRIORITY = 50,
SECONDARY_ROLE(ALLOW_CONNECTIONS = NO),
SEEDING_MODE = AUTOMATIC);
GO
- 将辅助服务器实例加入到可用性组,并向可用性组授予创建数据库的权限
在 SQL Server 从实例上运行
ALTER AVAILABILITY GROUP [<availability_group_name>] JOIN
GO
ALTER AVAILABILITY GROUP [<availability_group_name>] GRANT CREATE ANY DATABASE
GO
- SQL Server 将在辅助服务器上自动创建数据库副本
如果数据库较大,则可能需要一些时间才能完成数据库同步。 如果数据库在为自动种子设定配置的可用性组中,你可以查询 sys.dm_hadr_automatic_seeding 系统视图来监视种子设定进度。 对于处于为自动种子设定配置的可用性组中的每个数据库,以下查询都返回一行。
SELECT start_time,
ag.name,
db.database_name,
current_state,
performed_seeding,
failure_state,
failure_state_desc
FROM sys.dm_hadr_automatic_seeding autos
JOIN sys.availability_databases_cluster db
ON autos.ag_db_id = db.group_database_id
JOIN sys.availability_groups ag
ON autos.ag_id = ag.group_id
3. 验证自动种子设定
如果创建成功,则将在从副本上自动创建具有下列任一状态的数据库:
- 已同步(从副本配置为同步模式,且数据已同步)。
- 正在同步(从副本配置为异步模式,或为同步模式但尚未与主副本完全同步)。
三、 其他主要管理操作
1. 在指定从实例上禁用自动种子设定
在从实例上运行
ALTER AVAILABILITY GROUP [<availability_group_name>]
DENY CREATE ANY DATABASE
GO
2. 在现有可用性组上启用自动种子设定
在主实例上运行
ALTER AVAILABILITY GROUP [<availability_group_name>]
MODIFY REPLICA ON '<secondary_node>'
WITH (SEEDING_MODE = AUTOMATIC)
GO
3. 全局禁用自动种子设定
在主实例上运行
ALTER AVAILABILITY GROUP [<availability_group_name>]
MODIFY REPLICA ON '<secondary_node>'
WITH (SEEDING_MODE = MANUAL)
GO
四、 监控与诊断自动种子设定
1. 使用系统动态管理视图
- sys.dm_hadr_automatic_seeding
在主副本上,查询 sys.dm_hadr_automatic_seeding 以检查自动种子设定过程的状态。 对于每个种子设定过程,该视图都将返回一行。 例如:
SELECT start_time,
completion_time,
is_source,
current_state,
failure_state,
failure_state_desc,
error_code
FROM sys.dm_hadr_automatic_seeding;
- sys.dm_hadr_physical_seeding_stats
在主副本上,查询 sys.dm_hadr_physical_seeding_stats 以查看当前运行的每个种子设定过程的物理统计信息。 种子设定正在运行时,以下查询将返回多行:
SELECT * FROM sys.dm_hadr_physical_seeding_stats;
- total_disk_io_wait_time_ms 列和 total_network_wait_time_ms 列可用于确定自动种子设定过程中的性能瓶颈 。 这两列还显示在 hadr_physical_seeding_progress 扩展事件中 。
- total_disk_io_wait_time_ms 表示在磁盘上等待时备份/还原线程所花费的时间。 该值从种子设定操作开始时逐渐累积。 如果磁盘还未准备好读取或写入备份流,则备份/还原线程转换为睡眠状态,并通过每秒唤醒一次来检查磁盘是否准备就绪。
- total_network_wait_time_ms 在主要副本和次要副本中具有不同的涵义。 在主要副本中,该计数器表示网络流控制时间。 在次要副本中,该计数器表示还原线程等待可用消息写入磁盘的时间。
2. 使用错误日志诊断
将数据库添加到为自动种子设定配置的可用性组时,SQL Server 将通过可用性组终结点执行 VDI 备份。 完成备份并同步次要副本后查看 SQL Server 错误日志了解相关信息。
可在 SQL Server 日志中看到开始和完成自动种子设定:
3. 使用扩展事件诊断
自动种子设定具有新的扩展事件,用于在初始化过程中跟踪状态更改、故障和性能统计信息。例如,此脚本会创建用于捕获自动种子设定相关事件的扩展事件会话:
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_physical_seeding_forwarder_state_change | 物理种子设定转发器端状态更改。 |
hadr_physical_seeding_forwarder_target_state_change | 物理种子设定转发器目标端状态更改。 |
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 | 在自动种子设定操作超时时发生。 |
参考