SQL Server 2016 AlwaysOn 新增节点五层协同实操指南 简介本资源是一份面向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 故障转移群集WSFCSQL Server 只是跑在上面的一个“群集感知服务”。新节点没进 WSFCSQL 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 的注册表项而超时失败报错代码0x800706baRPC 服务器不可用。2.3 将 test209 正式加入现有 WSFC从“连接到群集”到“联机成功”的完整链路这一步必须在当前主群集节点test51上操作且操作者账户必须是域管理员Domain Admins 组成员。图形化流程虽简单但背后有三个关键校验点节点发现阶段点击“添加节点”后输入test209.test.com群集管理器会尝试通过 RPC 连接 test209 的ClusSvc服务。若失败检查 test209 的 Windows 防火墙是否放行了“文件和打印机共享”规则对应端口 135、445、以及动态 RPC 端口范围。资格验证阶段系统会自动运行“验证配置”向导检查磁盘、网络、存储等。对于纯计算节点无共享存储务必取消勾选“存储”测试否则会因找不到共享磁盘而直接终止。加入与仲裁阶段成功加入后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为STARTEDtype_desc为DATABASE_MIRRORINGport为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的完整元数据包括所有数据库的恢复模式、日志备份链状态、同步优先级等推送到 test209test209 接收后会尝试连接主副本的端点并开始拉取日志。这一步的成败直接决定了 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 Ntest209.test.com WITH ( ENDPOINT_URL NTCP://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 NTCP://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应为HEALTHYlog_send_queue_size主库待发送日志量和redo_queue_size辅助库待重做日志量应持续下降至接近 0last_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 连接时始终无法路由到 test209sys.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 Ntest209.test.com WITH (SECONDARY_ROLE (READ_ONLY_ROUTING_URL NTCP://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或应用程序连接字符串Serveryour-listener-vip;DatabaseYourDB;ApplicationIntentReadOnly;...调用此存储过程。同时在 test209 上实时监控-- 查看当前会话是否来自侦听器VIP且 ApplicationIntentReadOnly 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 手动故障转移演练从“理论可行”到“肌肉记忆”永远不要相信“理论上能自动切换”。必须在业务低峰期亲手执行一次手动故障转移并全程录像。步骤必须严格遵循在 test51 上执行ALTER AVAILABILITY GROUP testgroup1 FAILOVER;确保FAILOVER_MODE AUTOMATIC已提前设置。立即在 test209 上执行SELECT SERVERNAME, sys.fn_hadr_is_primary_replica(YourDB)确认返回1。在应用服务器上用sqlcmd -S your-listener-vip -E -Q SELECT SERVERNAME确认返回test209.test.com。执行一笔写操作如INSERT INTO test_table VALUES (...)确认成功。再次执行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上传到公司统一的配置管理库。不是为了应付检查而是因为我知道三个月后当某个深夜告警响起第一个被翻出来的一定是这份冷冰冰却无比精确的快照。它比任何人的记忆都可靠比任何截图都更具法律效力。希望帮到你。本文还有配套的精品资源点击获取