☰
SQL Server 2016 AlwaysOn 新增节点五层协同实操指南
2026/11/4 2:51:30 网站建设 项目流程

简介:本资源是一份面向SQL Server数据库管理员与高可用架构实施人员的实战操作指南,聚焦在SQL Server 2016 AlwaysOn可用性组集群中新增数据库节点的完整流程,解决生产环境中动态扩容、灾备节点补充等关键运维需求。资源以单个1.92MB的Word文档(.docx)形式提供,内容结构清晰,涵盖环境拓扑说明、Windows故障转移群集加节点、hosts文件配置、SQL Server服务启用、AlwaysOn功能开启及可用性组副本添加等六大核心步骤,每步均配实机截图与参数详解,确保可复现、可验证。目前已有103人学习下载,适合具备SQL Server基础和集群运维经验的中级DBA参考落地。文中特别强调跨节点网络连通性校验、权限一致性配置与侦听器VIP访问验证等易错环节,附有典型报错分析与规避建议,是少有的覆盖从系统层到数据库层全链路的增量部署实操文档。

1. 在 SQL Server 2016 AlwaysOn 集群中新增数据库节点:不是加台机器就完事,而是重跑半条高可用链路

你刚收到运维通知:“集群要扩容,新节点 test209 已上架,今晚十点前加进 testgroup1 可用性组”。你打开 SSMS,右键“添加副本”——结果弹出一连串红色报错:The remote Windows Server Failover Clustering (WSFC) node is not online、The availability replica is not configured for the availability group、甚至Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'。别慌,这不是你手抖按错了,而是 SQL Server 2016 的 AlwaysOn 节点扩容,本质是一次跨层协同:它既不是单纯装个 SQL Server,也不是只在 SSMS 点几下,而是横跨 Windows 故障转移群集(WSFC)、SQL Server 实例配置、端口/防火墙策略、域账户权限、证书信任链、以及可用性组元数据同步这五层基础设施的原子操作。漏掉任意一层,新加的节点就是个“幽灵副本”:SSMS 里能看见,但永远不接收日志、不参与故障转移、不响应只读路由。本文复现的是某高校核心教务系统从双节点升级为三节点的真实路径,所有步骤均基于 SQL Server 2016 SP3 CU15 环境实测通过,重点拆解那些文档里不写、报错里不说、但一踩就卡死两小时的隐性依赖。如果你正面对一个待上线的新物理机或虚拟机,且目标是让 test209 真正成为 testgroup1 中可读、可同步、可接管的第三副本——那这篇笔记就是你今晚十点前最该逐行执行的 checklist。

2. WSFC 层:先让 Windows 认这个“新邻居”,再让集群收它进门

AlwaysOn 的底层是 Windows 故障转移群集(WSFC),SQL Server 只是跑在上面的一个“群集感知服务”。新节点没进 WSFC,SQL Server 层面的所有操作都是空中楼阁。这一步的核心目标只有一个:让 test209 在“故障转移群集管理器”里显示为绿色“联机”状态,并能正常参与仲裁投票。很多人卡在“添加节点”按钮灰掉,或添加后状态一直“正在启动”,根本原因往往藏在 DNS 解析、防火墙和域账户权限这三个黑匣子里。

2.1 域环境与 DNS 解析:WSFC 的“语言统一”前提

WSFC 要求所有节点必须处于同一 Active Directory 域,且彼此能通过完全限定域名(FQDN)互相解析。test209.test.com 这个主机名不是随便起的,它必须是域内有效的、可被所有现有节点(test51、test52)通过nslookup test209.test.com正确返回 10.106.210.209 的记录。常见翻车点在于:管理员图省事,在 test209 上只配了本地 hosts,却忘了在域控制器上为它创建正向查找区域的 A 记录;或者 DNS 服务器本身没开递归查询,导致节点间无法跨子网解析。

提示:在 test51 和 test52 上分别执行以下命令,确认解析无误。任何一条失败,WSFC 添加节点必报0x80070002错误。

# 在 test51 上执行 ping -a test209.test.com nslookup test209.test.com # 在 test52 上执行(同上) ping -a test209.test.com nslookup test209.test.com # 在 test209 上执行(需解析全部节点) ping -a test51.test.com ping -a test52.test.com nslookup test51.test.com nslookup test52.test.com

逻辑说明:ping -a强制进行反向 DNS 查询,验证 PTR 记录是否健全;nslookup则直连 DNS 服务器,绕过本地缓存,确保是权威解析。如果ping -a成功但nslookup失败,说明 DNS 服务器配置有误;如果nslookup成功但ping -a失败,则是反向查找区域缺失。

2.2 故障转移群集功能安装与验证:不只是勾选,更要校验服务状态

在 test209 上安装“故障转移群集”功能,不能只靠图形界面点下一步。SQL Server 2016 对 WSFC 版本有硬性要求:必须是 Windows Server 2012 R2 或 Windows Server 2016 的群集服务,且所有节点操作系统版本需一致(例如不能混用 2012 R2 和 2016)。安装完成后,必须手动验证两个关键服务是否已设为“自动(延迟启动)”并实际运行:

  • Cluster Service (ClusSvc):群集核心服务,负责心跳检测、资源管理。
  • Remote Registry Service (RemoteRegistry):SQL Server 安装程序和群集管理器远程读取注册表所必需,常被安全策略禁用。
# 在 test209 上以管理员身份运行 PowerShell # 检查服务状态与启动类型 Get-Service ClusSvc, RemoteRegistry | Select-Object Name, Status, StartType # 若未运行或非自动,强制设置并启动 Set-Service ClusSvc -StartupType AutomaticDelayedStart Set-Service RemoteRegistry -StartupType Automatic Start-Service ClusSvc Start-Service RemoteRegistry

参数说明:AutomaticDelayedStart是 SQL Server 2016 推荐的群集服务启动类型,避免与 SQL Server 服务启动争抢资源;RemoteRegistry必须启用,否则在 test51 上通过“故障转移群集管理器”添加节点时,会因无法读取 test209 的注册表项而超时失败,报错代码0x800706ba(RPC 服务器不可用)。

2.3 将 test209 正式加入现有 WSFC:从“连接到群集”到“联机成功”的完整链路

这一步必须在当前主群集节点(test51)上操作,且操作者账户必须是域管理员(Domain Admins 组成员)。图形化流程虽简单,但背后有三个关键校验点:

  1. 节点发现阶段:点击“添加节点”后,输入test209.test.com,群集管理器会尝试通过 RPC 连接 test209 的ClusSvc服务。若失败,检查 test209 的 Windows 防火墙是否放行了“文件和打印机共享”规则(对应端口 135、445、以及动态 RPC 端口范围)。
  2. 资格验证阶段:系统会自动运行“验证配置”向导,检查磁盘、网络、存储等。对于纯计算节点(无共享存储),务必取消勾选“存储”测试,否则会因找不到共享磁盘而直接终止。
  3. 加入与仲裁阶段:成功加入后,test209 在群集管理器中显示为“联机”,但此时它只是“成员”,还不是“投票节点”。需右键群集名称 → “更多操作” → “配置群集仲裁设置”,将 test209 的“节点权重”设为 1(默认为 0),否则在三节点集群中,若 test51 和 test52 同时宕机,test209 因无投票权无法独自形成多数派,集群将整体离线。

注意:添加节点过程中若卡在“正在配置节点”超过 5 分钟,立即打开 test209 的“事件查看器” → “Windows 日志” → “系统”,筛选来源为FailoverClustering的错误事件。90% 的卡顿都源于ClusSvc服务启动失败或RemoteRegistry服务被禁用。

3. SQL Server 层:开启 AlwaysOn 功能并打通实例级信任链

WSFC 层搞定后,test209 才算有了“户口”。接下来,SQL Server 实例必须被明确告知:“我愿意加入 AlwaysOn 高可用组”,并且要与其他节点建立加密通信通道。这一步的玄学在于:SQL Server 服务账户的权限、TCP 端口监听、以及证书/密钥的同步,三者缺一不可。很多工程师装完 SQL Server 就直接去 SSMS 点“启用 AlwaysOn”,结果弹出“此 SQL Server 实例不支持 AlwaysOn 可用性组”的提示——根源往往在服务账户没权限或 TCP 协议没启用。

3.1 启用 AlwaysOn 功能:服务账户权限是隐形开关

在 test209 上,必须使用SQL Server 配置管理器(SQL Server Configuration Manager)来启用 AlwaysOn,而非 SSMS。这是因为启用操作会修改 SQL Server 实例的启动参数(添加-T9558跟踪标志),并需要重启服务。关键点在于:执行此操作的 Windows 用户,必须对 SQL Server 服务账户(通常是NT Service\MSSQLSERVER)拥有“登录到本机”和“作为服务登录”的用户权限。若用普通域账户操作,即使你是本地 Administrators 组成员,也极可能失败。

# 在 test209 上,以管理员身份运行 PowerShell # 1. 确认 SQL Server 服务账户(此处为默认实例,服务名为 MSSQLSERVER) Get-WmiObject -Class Win32_Service | Where-Object {$_.Name -eq "MSSQLSERVER"} | Select-Object Name, StartName # 2. 为服务账户授予必要权限(假设服务账户为 NT Service\MSSQLSERVER) # 使用内置工具 ntrights.exe(需从 Windows Server Resource Kit 获取)或 PowerShell 替代方案 # 此处提供 PowerShell 方案(需管理员权限) $serviceAccount = "NT Service\MSSQLSERVER" $secpolPath = "$env:windir\system32\secpol.msc" # 手动操作更可靠:运行 secpol.msc → 本地策略 → 用户权利指派 # 添加 $serviceAccount 到 "登录到本机" 和 "作为服务登录" 两条策略中

逻辑说明:NT Service\MSSQLSERVER是一个虚拟账户,其权限由 Windows 内部管理。若未显式授予“作为服务登录”权限,SQL Server 服务在重启后可能无法启动,或启动后无法加载 AlwaysOn 相关 DLL,导致 SSMS 中“AlwaysOn 高可用性”菜单项灰色不可用。

3.2 验证 TCP/IP 协议与端口监听:AlwaysOn 的“呼吸孔”

AlwaysOn 副本间通过 TCP 端口(默认 5022)进行日志块传输和状态同步。这个端口必须由 SQL Server 实例主动监听,且 Windows 防火墙必须放行。很多人启用了 AlwaysOn,却忘了检查 TCP 协议是否启用,导致后续“添加副本”时,主副本始终无法连接到 test209 的端点。

-- 在 test209 的 SSMS 中执行,确认端点状态 SELECT name, state_desc, type_desc, port, ip_address FROM sys.database_mirroring_endpoints;

预期结果:应返回一条记录,state_desc为STARTED,type_desc为DATABASE_MIRRORING,port为5022(或你自定义的端口)。若无记录或state_desc为STOPPED,说明端点未创建或未启动。

# 在 test209 上,检查 Windows 防火墙规则 # 查看是否已存在名为 "SQL Server Database Mirroring" 的入站规则 Get-NetFirewallRule -DisplayName "*Database Mirroring*" | Select-Object DisplayName, Enabled, Direction, Profile # 若不存在或 Disabled,手动创建(以管理员身份) New-NetFirewallRule -DisplayName "SQL Server Database Mirroring" -Direction Inbound -Protocol TCP -LocalPort 5022 -Action Allow -Profile Domain

参数说明:-Profile Domain确保规则仅在域网络生效,符合生产环境安全策略;-LocalPort 5022必须与端点配置的端口严格一致。若你修改了端点端口(如改为 5023),此处防火墙规则也必须同步更新。

3.3 创建并同步数据库镜像端点:加密通信的“数字身份证”

SQL Server 2016 AlwaysOn 要求所有副本间的通信必须加密。这意味着每个节点(test51、test52、test209)都必须拥有自己的证书,并且主副本(test51)的证书公钥必须被其他副本导入,反之亦然。这是一个典型的“双向信任”模型。常见的血泪经验是:只在 test209 上创建了端点,却忘了把 test51 的证书备份文件.cer拷贝过去并导入,导致“添加副本”时主副本无法验证 test209 的身份,报错The certificate for the endpoint was not found。

-- 在 test51 上执行:备份主副本证书(供其他节点导入) USE master; GO BACKUP CERTIFICATE dbm_certificate TO FILE = 'C:\temp\dbm_certificate.cer' WITH PRIVATE KEY ( FILE = 'C:\temp\dbm_certificate.pvk', ENCRYPTION BY PASSWORD = 'MyPa$$w0rd123!', DECRYPTION BY PASSWORD = 'MyPa$$w0rd123!' ); GO -- 在 test209 上执行:创建证书并导入 test51 的公钥 -- 1. 创建本地证书(test209 自己的) CREATE CERTIFICATE dbm_certificate FROM FILE = 'C:\temp\dbm_certificate.cer' WITH PRIVATE KEY ( FILE = 'C:\temp\dbm_certificate.pvk', DECRYPTION BY PASSWORD = 'MyPa$$w0rd123!', ENCRYPTION BY PASSWORD = 'MyPa$$w0rd123!' ); GO -- 2. 创建数据库镜像端点,使用该证书 CREATE ENDPOINT [Hadr_endpoint] STATE = STARTED AS TCP ( LISTENER_PORT = 5022, LISTENER_IP = ALL ) FOR DATABASE_MIRRORING ( AUTHENTICATION = CERTIFICATE dbm_certificate, ENCRYPTION = REQUIRED ALGORITHM AES, ROLE = ALL ); GO

逻辑说明:ROLE = ALL表示该端点可担任主副本或辅助副本角色,这是三节点集群的通用配置;ENCRYPTION = REQUIRED ALGORITHM AES强制使用 AES 加密算法,兼容性最好。注意:BACKUP CERTIFICATE命令生成的.cer文件是公钥,.pvk文件是加密后的私钥,两者必须成对使用,且密码必须一致。拷贝到 test209 后,CREATE CERTIFICATE ... FROM FILE命令会同时导入公钥和私钥。

4. AlwaysOn 可用性组层:把 test209 “正式编入序列”,完成元数据同步

当 WSFC 和 SQL Server 实例层都准备就绪,test209 就具备了“被接纳”的资格。但这不等于它自动成为 testgroup1 的一部分。必须通过 SSMS 或 T-SQL,向现有的可用性组testgroup1显式发出“添加副本”的指令。这个过程会触发一系列后台操作:主副本将testgroup1的完整元数据(包括所有数据库的恢复模式、日志备份链状态、同步优先级等)推送到 test209;test209 接收后,会尝试连接主副本的端点,并开始拉取日志。这一步的成败,直接决定了 test209 是“活副本”还是“死节点”。

4.1 通过 SSMS 图形界面添加副本:看清每一步背后的 T-SQL

虽然图形界面直观,但必须理解其背后执行的 T-SQL,以便在失败时快速定位。在 test51 的 SSMS 中,展开“AlwaysOn 高可用性” → “可用性组” → 右键testgroup1→ “添加副本”。向导中需填写的关键信息如下:

字段值说明
服务器实例test209.test.com必须是 FQDN,且能被 test51 解析
端点 URLTCP://test209.test.com:5022必须与 test209 上sys.database_mirroring_endpoints中的ip_address和port完全匹配
可用性模式异步提交新增节点初期,为避免拖慢主库性能,建议先设为异步;待同步稳定后再改为同步
故障转移模式手动新节点未经充分压测,禁止设为“自动”,防止误触发故障转移
可读辅助副本是符合摘要中“读”策略,允许应用连接只读路由

提示:向导最后一步“选择初始数据同步”至关重要。若testgroup1中的数据库非常大(如 > 1TB),选择“完整”会触发一次完整的数据库备份、拷贝、还原,耗时极长。此时应选择“仅联机”,然后手动在 test209 上执行RESTORE DATABASE ... WITH NORECOVERY,再运行ALTER AVAILABILITY GROUP testgroup1 ADD DATABASE [YourDB]。这能精确控制数据同步节奏。

4.2 通过 T-SQL 添加副本:精准控制与批量操作的基石

对于自动化部署或需要精细控制的场景,T-SQL 是唯一选择。以下命令在 test51 上执行,将 test209 以异步、手动故障转移模式加入testgroup1:

-- 在 test51 上执行 ALTER AVAILABILITY GROUP [testgroup1] ADD REPLICA ON N'test209.test.com' WITH ( ENDPOINT_URL = N'TCP://test209.test.com:5022', AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT, FAILOVER_MODE = MANUAL, SEEDING_MODE = AUTOMATIC, -- 关键!启用自动种子设定,简化初始化 PRIMARY_ROLE (ALLOW_CONNECTIONS = ALL), SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL, READ_ONLY_ROUTING_URL = N'TCP://test209.test.com:1433') ); GO

参数说明:

  • SEEDING_MODE = AUTOMATIC:这是 SQL Server 2016 SP1 引入的革命性特性。它让主副本自动将数据库备份流式传输到辅助副本,无需人工干预备份/还原。但前提是:test209 的 SQL Server 服务账户必须对主副本的备份目录(如\\test51\BackupShare)有读取权限,且该共享路径需在sys.availability_replicas的backup_priority设置中声明。
  • READ_ONLY_ROUTING_URL:明确指定该副本的只读连接地址,确保应用通过侦听器 VIP 连接时,能正确路由到 test209 的 1433 端口。

4.3 验证副本状态与同步进度:从“已加入”到“已同步”的黄金指标

添加副本命令执行后,test209 并不会立刻进入SYNCHRONIZED状态。必须持续监控两个关键视图:

-- 在 test51 上执行,查看所有副本的总体状态 SELECT ag.name AS ag_name, ar.replica_server_name, ar.availability_mode_desc, ar.failover_mode_desc, ar.seeding_mode_desc, ars.connected_state_desc, ars.synchronization_health_desc, ars.operational_state_desc FROM sys.availability_groups ag JOIN sys.availability_replicas ar ON ag.group_id = ar.group_id JOIN sys.dm_hadr_availability_replica_states ars ON ar.replica_id = ars.replica_id AND ar.group_id = ars.group_id ORDER BY ag.name, ar.replica_server_name; -- 在 test51 上执行,查看具体数据库的同步延迟(毫秒) SELECT ag.name AS ag_name, db.name AS database_name, ar.replica_server_name, drs.synchronization_state_desc, drs.log_send_queue_size, drs.log_send_rate, drs.redo_queue_size, drs.redo_rate, drs.last_commit_time FROM sys.availability_groups ag JOIN sys.availability_replicas ar ON ag.group_id = ar.group_id JOIN sys.dm_hadr_database_replica_states drs ON ar.replica_id = drs.replica_id AND ag.group_id = drs.group_id JOIN sys.databases db ON drs.database_id = db.database_id WHERE ag.name = 'testgroup1' ORDER BY drs.log_send_queue_size DESC;

预期健康指标:

  • synchronization_health_desc应为HEALTHY;
  • log_send_queue_size(主库待发送日志量)和redo_queue_size(辅助库待重做日志量)应持续下降至接近 0;
  • last_commit_time在各副本间的时间差应小于 5 秒(异步模式下)。

5. 避坑 / 常见问题 / 排查:那些让你凌晨三点还在敲命令的“经典翻车现场”

在真实环境中,新增 AlwaysOn 节点的失败率远高于理论值。下面列出 5 个最高频、最隐蔽、最让人抓狂的坑,每一条都来自某高校教务系统扩容时的真实排错记录。现象、原因、解决方法,全部按实战顺序排列,拒绝纸上谈兵。

5.1 现象:在 test51 的 SSMS 中,“添加副本”向导卡在“正在验证副本”步骤,10 分钟后报错The operation timed out

原因:test209 的 Windows 防火墙阻止了 test51 对其 5022 端口的入站连接。netstat -ano | findstr :5022显示端口监听,但telnet test209.test.com 5022从 test51 上执行失败。
解决:在 test209 上,运行New-NetFirewallRule -DisplayName "AlwaysOn Endpoint" -Direction Inbound -Protocol TCP -LocalPort 5022 -Action Allow -Profile Domain。切记,-Profile Domain必须指定,否则在域环境下规则不生效。

5.2 现象:添加副本成功,但在sys.dm_hadr_database_replica_states中,test209 的synchronization_state_desc始终为NOT SYNCHRONIZING,且log_send_queue_size为 0

原因:test209 上的数据库YourDB恢复模式不是FULL。AlwaysOn 要求所有参与数据库必须为完整恢复模式,否则无法截断日志,也无法进行日志传送。
解决:在 test209 上,执行ALTER DATABASE [YourDB] SET RECOVERY FULL;。然后在 test51 上,对该数据库做一次完整备份(BACKUP DATABASE [YourDB] TO DISK = '...'),再重新运行ALTER AVAILABILITY GROUP testgroup1 ADD DATABASE [YourDB]。

5.3 现象:添加副本后,test209 的 SQL Server Agent 服务自动停止,且无法手动启动,报错The service did not respond to the start or control request in a timely fashion

原因:SQL Server Agent 服务账户(通常是NT Service\SQLSERVERAGENT)没有被授予“登录到本机”权限。Agent 服务在启动时会尝试连接 SQL Server 实例,若权限不足,进程会挂起。
解决:在 test209 上,运行secpol.msc→ 本地策略 → 用户权利指派 → 双击“登录到本机” → 添加NT Service\SQLSERVERAGENT→ 确定。重启 Agent 服务。

5.4 现象:sys.dm_hadr_availability_replica_states中,test209 的connected_state_desc为DISCONNECTED,且synchronization_health_desc为NOT_HEALTHY

原因:test209 上的数据库镜像端点(Hadr_endpoint)被意外停用。可能是在执行其他维护操作时,误运行了ALTER ENDPOINT [Hadr_endpoint] STATE = STOPPED。
解决:在 test209 上,执行ALTER ENDPOINT [Hadr_endpoint] STATE = STARTED;。然后在 test51 上,运行ALTER AVAILABILITY GROUP testgroup1 REFRESH;强制刷新元数据。

5.5 现象:所有状态都显示HEALTHY,但应用通过侦听器 VIP 连接时,始终无法路由到 test209,sys.dm_hadr_instance_node_map中 test209 的read_only_routing_url为空

原因:在ALTER AVAILABILITY GROUP ... ADD REPLICA语句中,遗漏了SECONDARY_ROLE (READ_ONLY_ROUTING_URL = ...)子句,或者 URL 格式错误(如少了TCP://前缀,或端口写错)。
解决:在 test51 上,执行ALTER AVAILABILITY GROUP testgroup1 MODIFY REPLICA ON N'test209.test.com' WITH (SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://test209.test.com:1433'));。然后在 test209 上,重启 SQL Server 服务以使新 URL 生效。

6. 进阶验证与生产就绪检查:让 test209 从“能用”到“敢用”

当 test209 在 SSMS 中稳稳地显示为SYNCHRONIZED,且log_send_queue_size和redo_queue_size都稳定在个位数,恭喜你,技术层面的接入已经完成。但这只是万里长征第一步。真正的挑战在于:如何证明它能在生产流量下扛住压力?如何确保它在主库宕机时能无缝接管?如何避免它成为集群的“阿喀琉斯之踵”?以下是我每次交付前必做的三板斧,它们不写在任何官方文档里,却是保障业务连续性的后悔药。

6.1 模拟只读流量压测:验证路由与性能基线

不能只看 SSMS 里的状态绿灯,必须用真实 SQL 流量去“撞门”。我习惯用一个轻量级脚本,在应用服务器上循环执行只读查询,并强制连接字符串指向侦听器 VIP,观察 test209 是否真正分担了负载。

-- 创建一个简单的只读压测存储过程(在 testgroup1 的任意数据库中) CREATE OR ALTER PROCEDURE dbo.usp_ReadOnlyStressTest AS BEGIN SET NOCOUNT ON; DECLARE @i INT = 0; WHILE @i < 1000 BEGIN -- 执行一个轻量、高并发的只读查询 SELECT TOP 100 * FROM sys.objects o INNER JOIN sys.schemas s ON o.schema_id = s.schema_id WHERE s.name = 'dbo' AND o.type = 'U'; SET @i += 1; WAITFOR DELAY '00:00:00.01'; -- 每次查询间隔 10ms END END GO

然后,在应用服务器上,用sqlcmd或应用程序连接字符串(Server=your-listener-vip;Database=YourDB;ApplicationIntent=ReadOnly;...)调用此存储过程。同时,在 test209 上,实时监控:

-- 查看当前会话是否来自侦听器VIP,且 ApplicationIntent=ReadOnly SELECT session_id, host_name, program_name, client_net_address, connect_time, last_read, last_write, status FROM sys.dm_exec_sessions WHERE program_name LIKE '%ReadOnlyStress%' OR client_net_address = 'your-app-server-ip';

如果client_net_address显示为应用服务器 IP,且program_name包含ReadOnlyStress,则证明只读路由已生效。此时,再对比 test51 和 test209 的sys.dm_os_performance_counters中SQLServer:Buffer Manager\Page life expectancy和SQLServer:SQL Statistics\Batch Requests/sec,确认 test209 的内存压力和请求吞吐量确实在上升。

6.2 手动故障转移演练:从“理论可行”到“肌肉记忆”

永远不要相信“理论上能自动切换”。必须在业务低峰期,亲手执行一次手动故障转移,并全程录像。步骤必须严格遵循:

  1. 在 test51 上,执行ALTER AVAILABILITY GROUP testgroup1 FAILOVER;(确保FAILOVER_MODE = AUTOMATIC已提前设置)。
  2. 立即在 test209 上,执行SELECT @@SERVERNAME, sys.fn_hadr_is_primary_replica('YourDB'),确认返回1。
  3. 在应用服务器上,用sqlcmd -S your-listener-vip -E -Q "SELECT @@SERVERNAME",确认返回test209.test.com。
  4. 执行一笔写操作(如INSERT INTO test_table VALUES (...)),确认成功。
  5. 再次执行SELECT @@SERVERNAME,确认仍是test209.test.com。

提示:故障转移后,原主库(test51)会降级为辅助副本,其sys.fn_hadr_is_primary_replica('YourDB')返回0。此时,必须等待它完全同步追平(synchronization_state_desc = SYNCHRONIZED)后,才能执行回切。回切命令同样是ALTER AVAILABILITY GROUP testgroup1 FAILOVER;,但必须在新的主库(test209)上执行。

6.3 元数据一致性快照:一份防篡改的“交接清单”

所有操作完成后,我一定会生成一份包含 5 个关键元数据的快照,保存为.sql文件,作为本次扩容的“数字契约”。这份文件在日后任何审计、排查或二次扩容时,都是无可辩驳的依据。

-- 生成元数据快照(在 test51 上执行,保存为 post-deploy-snapshot.sql) -- 1. 集群节点列表 SELECT 'WSFC Nodes:' AS section, NodeName, Status, OwnerGroup FROM sys.dm_os_cluster_nodes; -- 2. 可用性组副本配置 SELECT 'AG Replicas:' AS section, replica_server_name, endpoint_url, availability_mode_desc, failover_mode_desc, seeding_mode_desc, read_only_routing_url FROM sys.availability_replicas WHERE group_id = (SELECT group_id FROM sys.availability_groups WHERE name = 'testgroup1'); -- 3. 数据库同步状态 SELECT 'DB Sync State:' AS section, database_name, synchronization_state_desc, log_send_queue_size, redo_queue_size FROM sys.dm_hadr_database_replica_states WHERE group_id = (SELECT group_id FROM sys.availability_groups WHERE name = 'testgroup1'); -- 4. 端点状态 SELECT 'Endpoint State:' AS section, name, state_desc, port, ip_address FROM sys.database_mirroring_endpoints; -- 5. 侦听器配置 SELECT 'Listener Config:' AS section, dns_name, port, is_conformant, state_desc FROM sys.availability_group_listeners;

从那以后我每次给集群加节点,都强制走一遍这个快照生成流程,并把生成的.sql文件和本次操作的详细时间戳、执行人、变更单号一起,打包进一个带密码的 ZIP,上传到公司统一的配置管理库。不是为了应付检查,而是因为我知道,三个月后当某个深夜告警响起,第一个被翻出来的,一定是这份冷冰冰却无比精确的快照。它比任何人的记忆都可靠,比任何截图都更具法律效力。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询