适用范围:SQL Server
更改 SQL Server 中现有的 Always On 可用性组。 大多数 ALTER AVAILABILITY GROUP 参数仅在当前主副本上受支持。 但是,辅助副本仅支持 <
语法
ALTER AVAILABILITY GROUP group_name
{
SET ( <set_option_spec> )
| ADD DATABASE database_name
| REMOVE DATABASE database_name
| ADD REPLICA ON <add_replica_spec>
| MODIFY REPLICA ON <modify_replica_spec>
| REMOVE REPLICA ON <server_instance>
| JOIN
| JOIN AVAILABILITY GROUP ON <add_availability_group_spec> [ , ...2 ]
| MODIFY AVAILABILITY GROUP ON <modify_availability_group_spec> [ , ...2 ]
| GRANT CREATE ANY DATABASE
| DENY CREATE ANY DATABASE
| FAILOVER
| FORCE_FAILOVER_ALLOW_DATA_LOSS
| ADD LISTENER 'dns_name' ( <add_listener_option> )
| MODIFY LISTENER 'dns_name' ( <modify_listener_option> )
| RESTART LISTENER 'dns_name'
| REMOVE LISTENER 'dns_name'
| OFFLINE
}
[ ; ]
<set_option_spec> ::=
AUTOMATED_BACKUP_PREFERENCE = { PRIMARY | SECONDARY_ONLY | SECONDARY | NONE }
| FAILURE_CONDITION_LEVEL = { 1 | 2 | 3 | 4 | 5 }
| HEALTH_CHECK_TIMEOUT = milliseconds
| DB_FAILOVER = { ON | OFF }
| DTC_SUPPORT = { PER_DB | NONE }
| REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT = { integer }
| ROLE = SECONDARY
| CLUSTER_CONNECTION_OPTIONS = 'key_value_pairs> [ ;... ] '
<server_instance> ::=
{ 'system_name [ \instance_name ] ' | 'FCI_network_name [ \instance_name ] ' }
<add_replica_spec>::=
<server_instance> WITH
(
ENDPOINT_URL = 'TCP://system-address:port' ,
AVAILABILITY_MODE = { SYNCHRONOUS_COMMIT | ASYNCHRONOUS_COMMIT | CONFIGURATION_ONLY } ,
FAILOVER_MODE = { AUTOMATIC | MANUAL }
[ , <add_replica_option> [ , ...n ] ]
)
<add_replica_option>::=
SEEDING_MODE = { AUTOMATIC | MANUAL }
| BACKUP_PRIORITY = n
| SECONDARY_ROLE ( {
[ ALLOW_CONNECTIONS = { NO | READ_ONLY | ALL } ]
[ , ] [ READ_ONLY_ROUTING_URL = 'TCP://system-address:port' ]
} )
| PRIMARY_ROLE ( {
[ ALLOW_CONNECTIONS = { READ_WRITE | ALL } ]
[ , ] [ READ_ONLY_ROUTING_LIST = { ( '<server_instance>' [ , ...n ] ) | NONE } ]
[ , ] [ READ_WRITE_ROUTING_URL = 'TCP://system-address:port' ]
} )
| SESSION_TIMEOUT = integer
<modify_replica_spec>::=
<server_instance> WITH
(
ENDPOINT_URL = 'TCP://system-address:port'
| AVAILABILITY_MODE = { SYNCHRONOUS_COMMIT | ASYNCHRONOUS_COMMIT }
| FAILOVER_MODE = { AUTOMATIC | MANUAL }
| SEEDING_MODE = { AUTOMATIC | MANUAL }
| BACKUP_PRIORITY = n
| SECONDARY_ROLE ( {
[ ALLOW_CONNECTIONS = { NO | READ_ONLY | ALL } ]
| [ READ_ONLY_ROUTING_URL = { 'TCP://system-address:port' | NONE } ]
} )
| PRIMARY_ROLE ( {
[ ALLOW_CONNECTIONS = { READ_WRITE | ALL } ]
| [ READ_ONLY_ROUTING_LIST = { ( '<server_instance>' [ , ...n ] ) | NONE } ]
| [ READ_WRITE_ROUTING_URL = { 'TCP://system-address:port' | NONE } ]
} )
| SESSION_TIMEOUT = seconds
)
<add_availability_group_spec>::=
<ag_name> WITH
(
LISTENER_URL = 'TCP://system-address:port' ,
AVAILABILITY_MODE = { SYNCHRONOUS_COMMIT | ASYNCHRONOUS_COMMIT } ,
FAILOVER_MODE = MANUAL ,
SEEDING_MODE = { AUTOMATIC | MANUAL }
)
<modify_availability_group_spec>::=
<ag_name> WITH
(
LISTENER = 'TCP://system-address:port'
| AVAILABILITY_MODE = { SYNCHRONOUS_COMMIT | ASYNCHRONOUS_COMMIT }
| SEEDING_MODE = { AUTOMATIC | MANUAL }
)
<add_listener_option> ::=
{
WITH DHCP [ ON ( <network_subnet_option> ) ]
| WITH IP ( { ( <ip_address_option> ) } [ , ...n ] ) [ , PORT = listener_port ]
}
<network_subnet_option> ::=
'ipv4_address' , 'ipv4_mask'
<ip_address_option> ::=
{
'four_part_ipv4_address' , 'four_part_ipv4_mask'
| 'ipv6_address'
}
<modify_listener_option>::=
{
ADD IP ( <ip_address_option> )
| PORT = listener_port
| REMOVE IP ( 'ipv4_address' | 'ipv6_address')
}
参数
group_name
指定新可用性组的名称。 group_name 必须是一个有效的 SQL Server 标识符,并且它在 WSFC 群集的所有可用性组中必须是唯一的。
AUTOMATED_BACKUP_PREFERENCE = { PRIMARY |SECONDARY_ONLY|SECONDARY |NONE }
指定在选择执行备份的位置时备份作业如何评估主副本的首选项。 您可以编写给定备份作业的脚本,以便纳入自动备份首选项。 理解 SQL Server 不强制使用首选备份位置十分重要,因为它对即席备份没有影响。
仅在主要副本上受支持。
这些值如下所示:
主要
指定备份始终发生在主副本上。 如果需要备份功能(例如创建差异备份),则此选项非常有用,这些备份在辅助副本上运行时不受支持。
重要
如果计划使用日志传送为可用性组准备任何辅助数据库,请将自动备份首选项设置为 Primary ,直到准备好并加入可用性组的所有辅助数据库为止。
SECONDARY_ONLY
指定主副本上永远不会发生备份。 如果主副本是联机的唯一副本,则不会进行备份。
二 次
指定在次要副本上执行备份,但主副本是联机的唯一副本时除外。 在这种情况下,备份发生在主副本上。 此选项为默认行为。
无
指定您希望在选择要执行备份的副本时备份作业将忽略可用性副本的角色。 请注意,备份作业可能评估其他因素,例如每个可用性副本的备份优先级及其操作状态和已连接状态。
重要
没有设置 AUTOMATED_BACKUP_PREFERENCE 的强制实施。 此首选项的解释取决于将脚本编写到给定可用性组中数据库的备份作业中的逻辑(如果有)。 自动备份首选项设置对临时备份没有影响。 有关详细信息,请参阅 在 AlwaysOn 可用性组的次要副本上配置备份。
注意
若要查看现有可用性组的自动备份首选项,请选择automated_backup_preferencesys.availability_groups目录视图的或automated_backup_preference_desc列。 此外, 可以使用sys.fn_hadr_backup_is_preferred_replica 来确定首选备份副本。 此函数始终返回 1 至少一个副本,即使如此 AUTOMATED_BACKUP_PREFERENCE = NONE。
FAILURE_CONDITION_LEVEL = { 1 | 2 | 3 | 4 | 5 }
指定为此可用性组触发自动故障转移的失败条件。
FAILURE_CONDITION_LEVEL 在组级别设置,但仅与为同步提交可用性模式配置的可用性副本相关(AVAILABILITY_MODE = SYNCHRONOUS_COMMIT)。 此外,仅当主要副本和辅助副本都配置为自动故障转移模式(FAILOVER_MODE = AUTOMATIC)并且辅助副本当前与主副本同步时,故障条件才会触发自动故障转移。
仅在主要副本上受支持。
失败条件级别的范围 (1-5) 是从最少限制的级别 1 到最多限制的级别 5。 给定的条件级别包含所有限制较少的级别。 因此,最严格的条件级别 5 包含四个限制较少的级别 (1-4),级别 4 包含级别 1-3,依此类推。 下表描述了对应于每个级别的故障条件。
| 级别 | 失败条件 |
|---|---|
| 1 | 指定在发生以下任一情况时自动故障转移启动: SQL Server 服务停止。 连接到 WSFC 群集的可用性组的租约过期,因为不会 ACK 从服务器实例接收。 有关详细信息,请参阅工作原理:SQL Server Always On 租约超时。 |
| 2 | 指定在发生以下任一情况时自动故障转移启动: SQL Server 的实例不连接到群集,并且超出了可用性组的用户指定的 HEALTH_CHECK_TIMEOUT 阈值。可用性副本处于失败状态。 |
| 3 | 指定自动故障转移在关键 SQL Server 内部错误(例如孤立的旋转锁、严重的写入访问冲突或过多的转储)上启动。 此选项为默认行为。 |
| 4 | 指定自动故障转移在中等 SQL Server 内部错误时启动,例如 SQL Server 内部资源池中的永久性内存不足条件。 |
| 5 | 指定自动故障转移在任何限定的故障条件下启动,包括: SQL 引擎的工作线程耗尽。 检测到无法解决的死锁。 |
注意
SQL Server 实例对客户端请求的响应不足与可用性组无关。
定义FAILURE_CONDITION_LEVEL给定组的灵活故障转移策略和HEALTH_CHECK_TIMEOUT值。 此灵活的故障转移策略向您提供对必须导致自动故障转移的条件的精确控制。 有关详细信息,请参阅 为 AlwaysOn 可用性组配置灵活的自动故障转移策略。
HEALTH_CHECK_TIMEOUT
=
毫秒
指定 sp_server_diagnostics 系统存储过程在 WSFC 群集假定服务器实例缓慢或不响应之前返回服务器运行状况信息的等待时间(以毫秒为单位)。 在组级别设置 HEALTH_CHECK_TIMEOUT ,但仅与为具有自动故障转移的同步提交可用性模式配置的可用性副本相关(AVAILABILITY_MODE = SYNCHRONOUS_COMMIT)。 此外,仅当主要副本和辅助副本都配置为自动故障转移模式(FAILOVER_MODE = AUTOMATIC)并且辅助副本当前与主副本同步时,运行状况检查超时才会触发自动故障转移。
默认值 HEALTH_CHECK_TIMEOUT 为 30,000 毫秒(30 秒)。 最小值为 15,000 毫秒(15 秒),最大值为 4,294,967,295 毫秒。
仅在主要副本上受支持。
重要
sp_server_diagnostics 不会在数据库级别执行运行状况检查。
DB_FAILOVER = { ON |OFF }
指定主要副本上的数据库脱机时要执行的响应。 设置为 OFF时,只有实例的运行状况会触发自动故障转移。
有关此设置的详细信息,请参阅 可用性组数据库级别运行状况检测故障转移选项。
DTC_SUPPORT = { PER_DB |NONE }
指定是否为此可用性组启用分布式事务。 分布式事务仅适用于 SQL Server 2016 (13.x) 及以上版本中的可用性组数据库,而跨数据库事务仅适用于 SQL Server 2016 (13.x) SP2 及以上版本。
PER_DB 创建支持这些事务的可用性组,并自动将涉及可用性组中数据库的跨数据库事务提升为分布式事务。
NONE 可防止跨数据库事务自动提升到分布式事务,并且不会在 DTC 中将数据库注册到稳定的 RMID。 使用 NONE 设置时,不会阻止分布式事务,但在某些情况下,数据库故障转移和自动恢复可能无法成功。 有关详细信息,请参阅 事务 - 可用性组和数据库镜像。
注意
SQL Server 2016 (13.x) Service Pack 2 中引入了对更改 DTC_SUPPORT 可用性组设置的支持。 此选项不能与早期版本一起使用。 若要在早期版本的 SQL Server 中更改此设置,必须 DROP 再次和 CREATE 可用性组。
重要
每个分布式事务的 DTC 不超过 32 个登记。 由于可用性组中的每个数据库分别使用 DTC 登记,如果事务涉及 32 个以上的数据库,则当 SQL Server 尝试登记第 33 个数据库时,可能会收到以下错误:
Enlist operation failed: 0x8004d101(XACT_E_TOOMANY_ENLISTMENTS). SQL Server could not register with Microsoft Distributed Transaction Coordinator (MS DTC) as a resource manager for this transaction. The transaction may have been stopped by the client or the resource manager.
有关 SQL Server 中分布式事务的更多详细信息,请参阅 分布式事务。
REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT
在 SQL Server 2017 (14.x) 中引入。 设置需要在主要副本提交事务之前提交的最小数量的同步次要副本。 保证 SQL Server 事务等待至事务日志在最小数量的次要副本上更新为止。
- 默认值:0。 提供与 SQL Server 2016 (13.x) 相同的行为。
- 最小值:0。
- 最大值:副本数减去 1。
REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT 与同步提交模式下的副本相关。 当副本处于同步提交模式时,对主要副本的写入操作会等待至将同步副本上的写入提交到副本数据库事务日志为止。 如果承载辅助同步副本的 SQL Server 停止响应,则承载主副本的 SQL Server 会将辅助副本 NOT SYNCHRONIZED 标记为并继续。 当无响应数据库重新联机时,它处于“未同步”状态,副本被标记为不正常,直到主数据库可以再次同步它。 此设置保证主副本在提交每个事务的最小副本数之前不会继续。 如果副本的最小数目不可用,则在主副本上提交会失败。 对于群集类型 EXTERNAL,可用性组添加到群集资源时,设置会更改。 请参阅可用性组配置的高可用性和数据保护。
从 SQL Server 2022(16.x)开始,可以在分布式可用性组上设置 REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT 。 不支持此设置 CREATE AVAILABILITY GROUP。 可用于 ALTER AVAILABILITY GROUP 设置 REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT。 例如:
ALTER AVAILABILITY GROUP [<name>]
SET (REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT = <integer>);
角色
唯一有效的参数是 SECONDARY,此选项 SET 仅在分布式可用性组中有效。 使用它对 分布式可用性组进行故障转移。
CLUSTER_CONNECTION_OPTIONS
适用于:SQL Server 2025(17.x)及更高版本
CLUSTER_CONNECTION_OPTIONS使用子句强制实施 TLS 1.3 加密,以便在 Windows Server 故障转移群集与可用性组副本之间进行通信。 将选项指定为键值对的列表,用分号分隔。 使用键值对为可用性组配置连接字符串加密。
若要恢复为默认加密,请将子 CLUSTER_CONNECTION_OPTIONS 句设置为空字符串。 SQL Server 2025(17.x)默认为 Encrypt=Mandatory,连接 TrustServerCertificate=Yes 可用性组副本和监听器。
有关详细信息,请查看使用严格加密和 TDS 8.0连接到可用性组。
下表描述了可在子句中使用的 CLUSTER_CONNECTION_OPTIONS 键值对:
| Key | 支持的值 | Description |
|---|---|---|
Encrypt |
Mandatory、Strict、Optional |
指定如何强制加密可用性组。 如果服务器不支持加密,连接将失败。 如果将加密设置为 Mandatory“是”, TrustServerCertificate 则必须设置为“是”。 如果将加密 Strict设置为, TrustServerCertificate 则忽略。注意:此键值对是必需的。 |
HostNameInCertificate |
副本名称或 AG 侦听器名称 | 指定用于加密的证书中的副本名称或可用性组侦听器名称。 此值必须与证书的 使用者可选名称 中的值匹配。 如果证书中列出了服务器名称,则可以省略 HostNameInCertificate 密钥值对。 如果证书中未列出服务器名称,则必须使用服务器名称指定 HostNameInCertificate 密钥值对。注意:此键值对是可选的。 |
TrustServerCertificate |
Yes、No |
设置为指定 yes 驱动程序不会验证服务器 TLS/SSL 证书。 如果 no,驱动程序将验证证书。 有关详细信息,请查看 TDS 8.0。注意:此键值对是可选的。 |
ServerCertificate |
证书的路径 | 如果不想使用 HostNameInCertificate,可以将路径传递给证书。 群集服务帐户必须具有从给定位置读取证书的权限。注意:此键值对是可选的。 |
CLUSTER_CONNECTION_OPTIONS |
空字符串 ('') |
清除现有配置并还原为默认加密设置 Encrypt=Mandatory 和 TrustServerCertificate=Yes。 |
检查 示例 ,了解如何使用 CLUSTER_CONNECTION_OPTIONS 子句。
ADD DATABASE database_name
指定要添加到可用性组的一个或多个用户数据库的列表。 这些数据库必须位于托管当前主要副本的 SQL Server 实例上。 您可以为一个可用性组指定多个数据库,但每个数据库只能属于一个可用性组。 有关可用性组可以支持的数据库类型的信息,请参阅 AlwaysOn 可用性组的先决条件、限制和建议。 若要了解哪些本地数据库已属于可用性组,请参阅 sys.databases 目录视图中的replica_id列。
仅在主要副本上受支持。
注意
创建可用性组后,需要连接到托管辅助副本的每个服务器实例。 然后准备每个辅助数据库并将其加入可用性组。 有关详细信息,请参阅启动 Always On 辅助数据库的数据移动 (SQL Server)。
REMOVE DATABASE database_name
从可用性组中删除指定的主数据库和相应的辅助数据库。 仅在主要副本上受支持。
有关从可用性组中删除可用性数据库后建议的步骤的信息,请参阅 从 AlwaysOn 可用性组中删除主数据库。
添加副本
指定一到八个 SQL Server 实例以在可用性组中承载次要副本。 每个副本都由其服务器实例地址指定,后跟子 WITH (...) 句。
仅在主要副本上受支持。
您需要将每个新的辅助副本联接到可用性组。 有关详细信息,请参阅本节后面的选项说明 JOIN 。
<server_instance>
指定作为副本主机的 SQL Server 实例的地址。 地址格式取决于实例是默认实例还是命名实例,以及实例是独立实例还是故障转移群集实例(FCI)。 语法如下所示:
{ 'system_name[\instance_name]' | 'FCI_network_name[\instance_name]' }
此地址由以下部分组成:
system_name
SQL Server 目标实例所在的计算机系统的 NetBIOS 名称。 此计算机必须是一个 WSFC 节点。
FCI_network_name
用于访问 SQL Server 故障转移群集的网络名称。 如果服务器实例作为 SQL Server 故障转移伙伴参与,请使用此名称。 在 FCI 服务器实例上执行 SELECT @@SERVERNAME 将返回其整个“FCI_network_name[\instance_name]”字符串(即完整副本名称)。
有关详细信息,请参阅 @@SERVERNAME。
instance_name
system_name或FCI_network_name主机且已启用 Always On 的 SQL Server 实例的名称。 对于默认服务器实例, instance_name 是可选的。 此实例名不区分大小写。 在独立服务器实例上,此值名称与执行 SELECT @@SERVERNAME返回的值相同。
\
仅在指定 instance_name时使用的分隔符,以便将其与 system_name 或 FCI_network_name区分开。
有关 WSFC 节点和服务器实例的先决条件的信息,请参阅 AlwaysOn 可用性组的先决条件、限制和建议。
ENDPOINT_URL = '*TCP:// system-address:*port'
指定托管要添加或修改的可用性副本的 SQL Server 实例上的 数据库镜像终结点 的 URL 路径。
ENDPOINT_URL 在 ADD REPLICA ON 子句中是必需的,子句中 MODIFY REPLICA ON 是可选的。 有关详细信息,请参阅 “指定终结点 URL - 添加或修改可用性副本”。
“TCP:// system-address:port”
指定一个 URL,它用于指定端点 URL 或只读路由 URL。 URL 参数如下所示:
system-address
明确标识目标计算机系统的字符串,例如系统名称、完全限定的域名或 IP 地址。
港口
与服务器实例的镜像终结点(用于 ENDPOINT_URL 选项)或服务器实例的数据库引擎使用的端口号(对于 READ_ONLY_ROUTING_URL 选项)关联的端口号。
AVAILABILITY_MODE = { SYNCHRONOUS_COMMIT |ASYNCHRONOUS_COMMIT |CONFIGURATION_ONLY }
指定主副本是否等待次要副本确认将日志记录的强化(写入)确认到磁盘,然后主副本才能在给定的主数据库上提交事务。 针对同一主副本上不同数据库的事务可以单独提交。
SYNCHRONOUS_COMMIT
指定主副本等待提交事务,直到在此次要副本(同步提交模式)上强化它们为止。 最多可以指定 SYNCHRONOUS_COMMIT 三个副本,包括主副本。
ASYNCHRONOUS_COMMIT
指定主副本无需等待此辅助副本对日志进行硬编码(同步提交可用性模式)即可提交事务。 最多可以指定 ASYNCHRONOUS_COMMIT 五个可用性副本,包括主副本。
CONFIGURATION_ONLY
指定主副本将可用性组配置元数据同步提交到此副本上的 master 数据库。 副本不包含用户数据。 此选项:
可以在任何版本的 SQL Server 上承载,包括 Express Edition。
要求副本的数据镜像终结点
CONFIGURATION_ONLY为类型WITNESS。无法更改。
当
CLUSTER_TYPE = WSFC时无效。有关详细信息,请参阅可用性组配置的高可用性和数据保护。
AVAILABILITY_MODE 在 ADD REPLICA ON 子句中是必需的,子句中 MODIFY REPLICA ON 是可选的。 有关详细信息,请参阅 Always On 可用性组的可用性模式之间的差异。
FAILOVER_MODE = { AUTOMATIC |MANUAL }
指定要定义的可用性副本的故障转移模式。
自动
启用自动故障转移。
AUTOMATIC 仅当同时指定 AVAILABILITY_MODE = SYNCHRONOUS_COMMIT时,才支持 。 可以指定 AUTOMATIC 三个可用性副本,包括主要副本。
注意
- 在 SQL Server 2016(13.x)之前,只能有两个自动故障转移副本,包括主要副本。
- SQL Server 故障转移群集实例(FCI)不支持可用性组自动故障转移,因此 FCI 主机只能为手动故障转移配置任何可用性副本。
手动
允许数据库管理员手动故障转移或强制手动故障转移(“强制故障转移”)。
必须在子句中ADD REPLICA ON指定FAILOVER_MODE。 可以选择在 MODIFY REPLICA ON 子句中指定它。 存在两种类型的手动故障转移:手动故障转移而不丢失数据,以及强制故障转移(可能丢失数据)。 不同的条件支持这些类型。 有关详细信息,请参阅故障转移和故障转移模式(Always On 可用性组)。
SEEDING_MODE = { AUTOMATIC |MANUAL }
指定最初设定次要副本种子的方式。
自动
启用直接种子设定。 此方法通过网络设定次要副本的种子。 此方法不需要在副本上备份和还原主数据库的副本。
注意
若要进行直接种子设定,必须通过ALTER AVAILABILITY GROUPGRANT CREATE ANY DATABASE调用选项来允许在每个次要副本上创建数据库。
手动
指定手动种子设定(默认)。 此方法要求在主要副本上创建数据库的备份,并在次要副本上手动还原该备份。
BACKUP_PRIORITY = n
指定相对于同一可用性组中的其他副本,在此副本上执行备份的优先级。 该值是范围 0..100 中的整数。 这些值将具有以下含义:
1..100指示可以选择可用性副本来执行备份。 1 表示最低优先级,100 表示最高优先级。 如果BACKUP_PRIORITY = 1为执行备份,则仅当当前没有更高的优先级可用性副本可用时,才选择可用性副本。0指示从不选择此可用性副本来执行备份。 例如,对于不希望备份故障转移到的远程可用性副本,此选项非常有用。
有关详细信息,请参阅卸载可用性组次要副本的受支持备份。
SECONDARY_ROLE (... )
指定当此可用性副本当前拥有辅助角色时(每当它是辅助副本时)生效的角色特定的设置。 在括号内指定一个或两个辅助角色选项。 如果指定两个选项,则使用以逗号分隔的列表。
辅助角色选项如下所示:
ALLOW_CONNECTIONS = { NO |READ_ONLY |ALL }
指定执行辅助角色(充当辅助副本)的给定可用性副本的数据库是否可以接受来自客户端的连接,其中之一:
是
不允许与此副本的辅助数据库的用户连接。 它们不可用于读取访问。 此选项为默认行为。
只读
仅允许连接到应用程序意向属性设置为 ReadOnly的辅助副本中的数据库。 有关此属性的详细信息,请参阅 Using Connection String Keywords with SQL Server Native Client。
都
允许针对辅助副本中的数据库的所有连接进行只读访问。
有关详细信息,请参阅卸载对 Always On 可用性组的次要副本的只读工作负荷。
READ_ONLY_ROUTING_URL = { '*TCP:// system-address:*port' |NONE }
指定用于将读取意向连接请求路由到此可用性副本的 URL。 此 URL 是 SQL Server 数据库引擎侦听的位置。 通常,SQL Server 数据库引擎的默认实例侦听 TCP 端口 1433。
从 SQL Server 2025(17.x)开始,你可以指定NONEREAD_ONLY_ROUTING_URL目标来恢复可用性副本指定的只读路由,并根据默认行为路由流量。
对于命名实例,请查询portsys.dm_tcp_listener_states动态管理视图的列type_desc以获取端口号。 服务器实例使用 Transact-SQL 侦听器 (type_desc='TSQL')。
有关计算可用性副本的只读路由 URL 的详细信息,请参阅计算 Always On 的 read_only_routing_url。
注意
对于 SQL Server 的命名实例,请将 Transact-SQL 侦听器配置为使用特定端口。 有关详细信息,请参阅将 SQL Server 配置为侦听特定 TCP 端口。
PRIMARY_ROLE (... )
指定如果此可用性副本当前拥有主角色(每当其为主副本时),该设置将生效。 在括号内指定一个或两个主角色选项。 如果指定两个选项,则使用以逗号分隔的列表。
主角色选项如下所示:
ALLOW_CONNECTIONS = { READ_WRITE |ALL }
指定执行主角色(充当主副本)的给定可用性副本的数据库可从客户端接受的连接类型,其中一种:
READ_WRITE
不允许将 Application Intent 连接属性设置为 ReadOnly 的连接。 如果 Application Intent 属性设置为 ReadWrite 或未设置应用程序意向连接属性,则允许连接。 有关 Application Intent 连接属性的详细信息,请参阅 Using Connection String Keywords with SQL Server Native Client。
都
主副本中的数据库允许所有连接。 此选项为默认行为。
READ_ONLY_ROUTING_LIST = { ('<server_instance>' [ , ...n ] | |NONE }
指定一个以逗号分隔的服务器实例列表,这些实例承载在以辅助角色运行时满足以下要求的此可用性组的可用性副本:
配置为允许所有连接或只读连接(请参阅
ALLOW_CONNECTIONS本文前面所述的选项的参数SECONDARY_ROLE)。定义其只读路由 URL(请参阅
READ_ONLY_ROUTING_URL本文前面所述的选项的参数SECONDARY_ROLE)。
值 READ_ONLY_ROUTING_LIST 如下所示:
<server_instance>
指定 SQL Server 实例的地址,该实例是辅助角色下运行时作为可读辅助副本的可用性副本的主机。
使用以逗号分隔的列表指定可能承载可读辅助副本的所有服务器实例。 只读路由遵循在列表中指定服务器实例的顺序。 如果在副本的只读路由列表中包含副本的宿主服务器实例,通常将此服务器实例放在列表末尾比较好,这样在一个辅助副本可用时读意向连接将访问它。
从 SQL Server 2016 (13.x) 开始,可在可读次要副本间实现读意向请求的负载均衡。 可通过将副本放入只读路由列表中的一组嵌套括号中来指定。 有关详细信息和示例,请参阅在只读副本间配置负载均衡。
无
指定当此可用性副本是主要副本时,不支持只读路由。 此选项为默认行为。 使用 MODIFY REPLICA ON时,此值将禁用现有列表(如果有)。
{ READ_WRITE_ROUTING_URL = '*TCP:// system-address:*port' |NONE }
适用于:SQL Server 2019 (15.x) 及更高版本
指定服务器实例,这些实例承载在以主角色运行时满足以下要求的此可用性组的可用性副本:
- 副本规格
PRIMARY_ROLE包括READ_WRITE_ROUTING_URL。 - 连接字符串为 ReadWrite,通过将 ApplicationIntent 定义为 ReadWrite 或不设置 ApplicationIntent 并使默认值 (ReadWrite) 生效来实现。
从 SQL Server 2025(17.x)开始,你可以指定NONEREAD_WRITE_ROUTING_URL目标来回退可用性副本指定的读写路由,并根据默认行为路由流量。
有关详细信息,请参阅次要副本到主要副本读/写连接重定向(AlwaysOn 可用性组)。
SESSION_TIMEOUT = 秒
以秒为单位指定会话超时期限。 如果未指定此选项,则默认时间段为 10 秒。 最小值为 5 秒。
重要
将超时期限保留为 10 秒或更大。
有关会话超时期限的详细信息,请参阅 什么是 AlwaysOn 可用性组?
修改副本
修改可用性组的任何副本。 要修改的副本列表包含每个副本的服务器实例地址和子 WITH (...) 句。
仅在主要副本上受支持。
REMOVE REPLICA ON(删除副本开启)
从可用性组中删除指定的辅助副本。 无法从可用性组中删除当前主副本。 删除副本时,它将停止接收数据。 副本的辅助数据库将从可用性组中删除,并进入 RESTORING 状态。
仅在主要副本上受支持。
注意
如果在副本不可用或失败时删除副本,则当副本重新联机时,它会发现它不再属于可用性组。
加入
导致本地服务器实例承载指定可用性组中的辅助副本。
仅在尚未加入可用性组的辅助副本上受支持。
有关详细信息,请参阅 将辅助副本加入 AlwaysOn 可用性组。
故障转移
启动可用性组的手动故障转移,而不会丢失到连接到的辅助副本。 承载主副本的副本是 故障转移目标。 故障转移目标接管主角色并恢复其每个数据库的副本,使其联机作为新的主数据库。 以前的主副本同时转换为辅助角色,并且其数据库将成为辅助数据库且立即挂起。 这些角色可能会通过一系列故障来回切换。
仅支持同步提交辅助副本的故障转移,该副本当前与主副本同步。 对于要同步的辅助副本,主副本还必须在同步提交模式下运行。
对于可用性组中的两个 SQL Server 实例,您可以在主副本或辅助副本上发出故障转移命令。 对于通过 托管实例链接复制的实例,必须在主副本上发出故障转移命令。
注意
- 对于可用性组,故障转移命令在故障转移目标接受该命令后立即返回。 但是,在可用性组完成故障转移后,数据库恢复以异步方式进行。
- 对于 托管实例链接故障转移,故障转移命令在成功故障转移后返回,其中源和目标交换机角色或故障转移命令在故障转移前置条件检查失败后失败。
- 不能将故障转移命令用于两个 SQL Server 实例之间 分布式可用性组 的计划内故障转移。
有关执行计划内手动故障转移的限制、先决条件和建议的信息,请参阅 执行 AlwaysOn 可用性组(SQL Server)的计划内手动故障转移。
FORCE_FAILOVER_ALLOW_DATA_LOSS
注意
仅启动强制故障转移作为灾难恢复措施,因为它可能会导致数据丢失。 仅当主副本不可用时,才应执行强制故障转移,准备接受潜在的数据丢失,并且必须立即将服务还原到可用性组。
仅在角色处于 SECONDARY 或 RESOLVING 状态的副本上受支持。 输入故障转移命令的副本是 故障转移目标。
强制将可用性组故障转移到故障转移目标(可能会丢失数据)。 故障转移目标接管主角色并恢复其每个数据库的副本,使其联机作为新的主数据库。 在剩余的任何辅助副本上,在手动恢复前每个辅助数据库都处于挂起状态。 当以前的主副本可用时,它将切换到辅助角色,其数据库将变为挂起的辅助数据库。
对于通过 托管实例链接复制的实例,必须在次要副本(故障转移目标)上发出 FORCE_FAILOVER_ALLOW_DATA_LOSS 命令。
注意
故障转移目标接受命令后立即返回故障转移命令。 但是,在可用性组完成故障转移后,数据库恢复以异步方式进行。
有关强制故障转移的限制、先决条件和建议以及强制故障转移对可用性组中前主数据库的影响的信息,请参阅 执行 AlwaysOn 可用性组(SQL Server)的强制手动故障转移。
添加侦听器“dns_name”( <add_listener_option> )
为此可用性组定义新的可用性组侦听器。 仅在主要副本上受支持。
重要
在创建第一个侦听器之前,请阅读 “为 AlwaysOn 可用性组配置侦听器”。
为给定的可用性组创建侦听器后,请执行以下步骤:
- 请求您的网络管理员将该侦听器的 IP 地址保留为专用。
- 将该侦听器的 DNS 主机名提供给应用程序开发人员,以便在请求与此可用性组的客户端连接时用于连接字符串中。
dns_name
指定可用性组侦听器的 DNS 主机名。 在域和 NetBIOS 中,侦听器的 DNS 名称必须唯一。
dns_name 为字符串值。 该名称只能包含字母数字字符、破折号 (-) 和连字符 (_),顺序不分先后。 DNS 主机名不区分大小写。 最大长度为 63 个字符。
指定有意义的字符串。 例如,对于名为 AG1的可用性组,有意义的 DNS 主机名将是 ag1-listener。
重要
NetBIOS 仅识别前 dns_name15 个字符。 如果两个 WSFC 群集由同一 Active Directory 控制,并且尝试在两个群集中创建可用性组侦听器,且名称超过 15 个字符且前缀相同,则会收到错误报告虚拟网络名称资源无法联机。 有关 DNS 名称的前缀命名规则的信息,请参阅 分配域名。
加入可用性组
联接到分布式可用性组。 创建分布式可用性组时,在其中创建的群集上的可用性组是主要可用性组。 联接分布式可用性组的可用性组为次要可用性组。
<ag_name>
指定构成一半分布式可用性组的可用性组名称。
LISTENER = '*TCP:// system-address:*port'
指定与可用性组关联的侦听器的 URL 路径。
该 LISTENER 子句是必需的。
“*TCP:// system-address:*port”
指定与可用性组关联的侦听器的 URL。 URL 参数如下所示:
system-address
明确标识侦听器的字符串,例如系统名称、完全限定的域名或 IP 地址。
港口
与可用性组的镜像终结点关联的端口号。 这不是侦听器的端口。
AVAILABILITY_MODE = { SYNCHRONOUS_COMMIT |ASYNCHRONOUS_COMMIT }
指定主副本是否等待辅助可用性组确认将日志记录的强化(写入)确认到磁盘,然后主副本才能在给定的主数据库上提交事务。
SYNCHRONOUS_COMMIT
指定主副本等待提交事务,直到它收到确认事务在辅助可用性组上强化事务。 最多可以指定 SYNCHRONOUS_COMMIT 两个可用性组,包括主要可用性组。
ASYNCHRONOUS_COMMIT
指定主要副本无需等待该次要可用性组对日志进行硬编码即可提交事务。 最多可以指定 ASYNCHRONOUS_COMMIT 两个可用性组,包括主要可用性组。
该 AVAILABILITY_MODE 子句是必需的。
FAILOVER_MODE = { 手动 }
指定分布式可用性组的故障转移模式。
手动
允许数据库管理员执行的手动故障转移或强制手动故障转移(通常称为“强制故障转移”)。
不支持自动故障转移到辅助可用性组。
SEEDING_MODE = { AUTOMATIC |MANUAL }
指定最初设定次要可用性组种子的方式。
自动
启用自动种子设定。 此方法通过网络设定次要可用性组种子。 此方法不需要在辅助可用性组的副本上备份和还原主数据库的副本。
手动
指定手动设定种子。 此方法要求在主副本上创建数据库的备份,并在辅助可用性组的副本上手动还原该备份。
修改可用性组
修改分布式可用性组的任意可用性组设置。 要修改的可用性组列表包含每个可用性组的可用性组名称和子 WITH (...) 句。
重要
必须在主要可用性组和辅助可用性组实例上运行此命令。
授予 CREATE ANY DATABASE
允许可用性组代表主要副本创建数据库,该副本支持直接种子设定(SEEDING_MODE = AUTOMATIC)。 在该辅助副本加入可用性组后,对支持直接种子设定的每个次要副本运行此参数。 需要 CREATE ANY DATABASE 权限。
拒绝创建任何数据库
删除可用性组代表主要副本创建数据库的功能。
<add_listener_option>
ADD LISTENER 使用以下选项之一:
WITH DHCP [ ON { ('four_part_ipv4_address','four_part_ipv4_mask') } ]
指定可用性组侦听器使用动态主机配置协议 (DHCP)。 (可选)使用 ON 子句标识创建此侦听器的网络。 DHCP 仅限于一个子网,该子网用于托管可用性组中可用性副本的每个服务器实例。
重要
请勿在生产环境中使用 DHCP。 如果停机且 DHCP IP 租约过期,则注册与侦听器 DNS 名称关联的新 DHCP 网络 IP 地址并影响客户端连接需要额外的时间。 但是,DHCP 适合用于设置开发和测试环境以验证可用性组的基本功能并适合与应用程序集成。
例如:
WITH DHCP ON ('10.120.19.0','255.255.254.0')
WITH IP ( { ('four_part_ipv4_address','four_part_ipv4_mask') |('ipv6_address') }[ , ...n ] [ , PORT = listener_port ]
可用性组侦听器不使用 DHCP,而是使用一个或多个静态 IP 地址。 若要跨多个子网创建一个可用性组,每个子网均需要一个侦听器配置中的静态 IP 地址。 对于某一给定子网,静态 IP 地址可以是 IPv4 地址或 IPv6 地址。 请联系网络管理员,获取托管新可用性组可用性副本的每个子网的静态 IP 地址。
例如:
WITH IP ( ('10.120.19.155','255.255.254.0') )
ipv4_address
可用性组侦听器的 IPv4 四部分地址。 例如,10.120.19.155。
ipv4_mask
可用性组侦听器的 IPv4 四部分掩码。 例如,255.255.254.0。
ipv6_address
可用性组侦听器的 IPv6 地址。 例如,2001::4898:23:1002:20f:1fff:feff:b3a3。
端口 = listener_port
要由子句指定的可用性组侦听器WITH IP使用的端口号(listener_port)。
PORT 是可选的。
支持默认端口号 1433。 但是,可以选择其他端口号。
例如: WITH IP ( ('2001::4898:23:1002:20f:1fff:feff:b3a3') ) , PORT = 7777
MODIFY 侦听器“dns_name”( <modify_listener_option> )
修改此可用性组的现有可用性组侦听器。 仅在主要副本上受支持。
<modify_listener_option>
MODIFY LISTENER 使用以下选项之一:
ADD IP { ('four_part_ipv4_address','four_part_ipv4_mask') |('ipv6_address') }
将指定的 IP 地址添加到由 dns_name 指定的可用性组侦听器。
端口 = listener_port
请参阅本节前面对此参数的说明。
REMOVE IP { ('four_part_ipv4_address') |('ipv6_address') }
适用于:SQL Server 2025(17.x)及更高版本
从指定的可用性组侦听器中删除指定的 IP 地址。
重启侦听器“dns_name”
重启与指定 DNS 名称关联的侦听器。 仅在主要副本上受支持。
删除侦听器“dns_name”
删除与指定 DNS 名称关联的侦听器。 仅在主要副本上受支持。
离线
使联机的可用性组脱机。 同步提交数据库不会丢失数据。
当可用性组脱机时,其数据库对客户端不可用,并且无法使可用性组重新联机。 因此,只有在将可用性组资源迁移到新的 WSFC 群集时,才能在 AlwaysOn 可用性组的跨群集迁移期间使用 OFFLINE 此选项。
有关详细信息,请参阅使可用性组脱机 (SQL Server)。
先决条件和限制
有关可用性副本及其主机服务器实例和计算机上的先决条件和限制的信息,请参阅 AlwaysOn 可用性组的先决条件、限制和建议。
有关对 Transact-SQL 语句的限制 AVAILABILITY GROUP 的信息,请参阅 AlwaysOn 可用性组的Transact-SQL 语句。
权限
你需要 ALTER AVAILABILITY GROUP 对可用性组、 CONTROL AVAILABILITY GROUP 权限、 ALTER ANY AVAILABILITY GROUP 权限或 CONTROL SERVER 权限具有权限。 还需要 ALTER ANY DATABASE 权限。
示例
答: 将辅助副本联接到可用性组
以下示例将连接到 AccountsAG 可用性组的辅助副本联接到该副本。
ALTER AVAILABILITY GROUP AccountsAG JOIN;
GO
B. 强制故障转移可用性组
以下示例强制 AccountsAG 可用性组故障转移到连接到的次要副本。
ALTER AVAILABILITY GROUP AccountsAG FORCE_FAILOVER_ALLOW_DATA_LOSS;
GO
C. 强制加密与可用性组的连接
本部分中的示例 强制加密 与 AccountsAG 可用性组的连接。
如果服务器名称显示在任一 方法定义的每个证书中,则可以省略该 HostNameInCertificate 选项:
ALTER AVAILABILITY GROUP [AccountsAG]
SET (
CLUSTER_CONNECTION_OPTIONS = 'Encrypt=Strict')
如果遵循 方法 1 但未在证书中将服务器名称列为 使用者可选名称 ,则必须在选项的 “使用者可选名称 ”中 HostNameInCertificate 指定显示的值:
ALTER AVAILABILITY GROUP [AccountsAG]
SET (
CLUSTER_CONNECTION_OPTIONS = 'Encrypt=Strict;HostNameInCertificate=<Subject Alternative Name>')
如果遵循 了方法 1 并想要使用 ServerCertificate 属性,而不是为以下项提供值 HostNameInCertificate:
ALTER AVAILABILITY GROUP [AccountsAG]
SET (
CLUSTER_CONNECTION_OPTIONS = 'Encrypt=Strict;ServerCertificate=C:\Users\admin\SqlAGCertificate.cer')