如何编写基于dbachecks的PowerShell脚本对比指定表中服务器MaxMemory
基于dbachecks与dbatools的SQL Server MaxMemory对比脚本实现
我帮你把这个脚本补全并整理好了,正好实现从AMCB123实例的DBA数据库里取出指定分组的服务器,然后用dbachecks和dbatools来对比它们的MaxMemory配置。下面是完整的实现方案:
完整脚本代码
# 导入SQL运维必备模块 Import-Module dbatools Import-Module dbachecks # 定义中心数据库的连接信息 $centralServer = "AMCB123" $centralDb = "DBA" # 从中心数据库的Server_Group表(ID=1)读取目标服务器列表 $sconn = New-Object System.Data.SqlClient.SqlConnection("server=$centralServer;Trusted_Connection=true") $query = "SELECT DISTINCT servername FROM DBA.[dbo].[Server_Group] WHERE ID = 1;" $sconn.Open() $cmd = New-Object System.Data.SqlClient.SqlCommand($query, $sconn) $cmd.CommandTimeout = 0 # 取消查询超时限制,避免大列表读取失败 $dr = $cmd.ExecuteReader() # 将读取到的服务器名存入数组,方便后续批量处理 $targetServers = @() while ($dr.Read()) { $targetServers += $dr["servername"].ToString().Trim() } $sconn.Close() # ---------- 方式1:快速执行MaxMemory合规性检查 ---------- Write-Host "=== 开始执行MaxMemory合规性检查 ===" -ForegroundColor Cyan # 调用dbachecks的内置规则,基于最佳实践检查每台服务器的MaxMemory配置 Invoke-DbcCheck -Check MaxMemory -SqlInstance $targetServers -Show Summary # ---------- 方式2:获取详细配置值做对比分析 ---------- Write-Host "`n=== 获取所有服务器的MaxMemory具体配置详情 ===" -ForegroundColor Cyan # 用dbatools获取每台服务器的MaxMemory相关数值 $maxMemoryResults = Get-DbaMaxMemory -SqlInstance $targetServers # 格式化输出对比表格,包含当前配置、总内存、推荐值和合规状态 $maxMemoryResults | Select-Object SqlInstance, SqlMaxMB, TotalMB, RecommendedMB, Status | Format-Table -AutoSize
关键细节说明
- 服务器列表获取:用原生SqlClient直接连接中心数据库,确保精准提取Server_Group表中ID=1的所有服务器,避免重复或遗漏
- 两种对比方式:
- 合规性检查:
Invoke-DbcCheck会基于微软最佳实践规则,直接给出每台服务器的MaxMemory配置是否合规,适合快速审计整个服务器组的配置状态 - 数值对比:
Get-DbaMaxMemory返回更详细的数值,包括当前配置的MaxMemory(MB)、服务器总内存、推荐的最优值以及状态,方便你逐台分析差异
- 合规性检查:
- 稳定性优化:设置
CommandTimeout = 0避免读取大服务器列表时超时,同时用Trim()处理服务器名,避免因空格导致的连接失败
内容的提问来源于stack exchange,提问作者smd
相关产品推荐
相关产品推荐

