WMI SQLSERVERAGENT_SQLAgentJobs 查询不 return 某些 SQL 2016 可用性组实例上的数据
WMI SQLSERVERAGENT_SQLAgentJobs queries don't return data on some SQL 2016 Availability Group instances
SQL 服务器代理有 performance objects and counters 用于监视作业。使用 Windows Performance Monitor 应用程序,我总能看到数据:
但是当我尝试在某些服务器上的 PowerShell 中使用 gwmi Win32_PerfFormattedData_SQLSERVERAGENT_SQLAgentJobs
时,没有实例 returned。使用 WBEMTest 和 wmic.exe 进行测试时的结果相同。
当我 运行 typeperf -qx
看到一堆 \SQLAgent:Jobs(_Total)* 指标时,我如何使用 WMI 查询从Win32_PerfFormattedData_SQLSERVERAGENT_SQLAgentJobs
或 Win32_PerfRawData_SQLSERVERAGENT_SQLAgentJobs
类?
更新: 嗯...这可能只是查询 SQL Server 2016 CU1 或 SP1 CU2 可用性组实例时的一个问题,尽管它再次适用于一些服务器而不是其他服务器。似乎在应用更新后停止工作,甚至在重新启动系统后计数器也没有 return 任何实例。我还无法在独立实例上复制该问题,因为它们总是 return 预期数据:
PS C:\> gwmi Win32_PerfRawData_SQLSERVERAGENT_SQLAgentJobs | ft -AutoSize Name,Successfuljobs,FailedJobs,Activejobs
Name Successfuljobs FailedJobs Activejobs
---- -------------- ---------- ----------
Others 0 0 0
Alerts 0 0 0
Schedules 20 106 0
_Total 20 106 0
另请注意,这些计数器在 sys.dm_os_performance_counters 视图中不可用。
根据教程,这应该非常简单 here
基本上,如果您想使用 Powershell 进行查询以获取那些特定的 WMI classes,您需要像这样查询它们:
“如果您已经知道 WMI class 的名称,则可以使用它立即获取信息。例如,通常用于检索有关某项信息的 WMI classes 之一电脑是 Win32_OperatingSystem.
PS> Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2 -ComputerName .
SystemDirectory : C:\WINDOWS\system32
Organization : Global Network Solutions
BuildNumber : 2600
RegisteredUser : Oliver W. Jones
SerialNumber : 12345-678-9012345-67890
Version : 5.1.2600
虽然我们展示了所有的参数,但是命令可以用更简洁的方式表达。连接到本地系统时不需要 ComputerName 参数。我们展示它是为了演示最一般的情况,并提醒您有关参数的信息。命名空间默认为 root/cimv2,也可以省略。最后,大多数 cmdlet 允许您省略常用参数的名称。对于 Get-WmiObject,如果没有为第一个参数指定名称,Windows PowerShell 会将其视为 Class 参数。这意味着可以通过键入以下命令发出最后一条命令:
Get-WmiObject Win32_OperatingSystem
Win32_OperatingSystem class 的属性比此处显示的要多得多。您可以使用 Get-Member 查看所有属性。 WMI class 的属性像其他对象属性一样自动可用:
PS> Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2 -ComputerName . | Get-Member -MemberType Property
TypeName: System.Management.ManagementObject#root\cimv2\Win32_OperatingSyste
m
Name MemberType Definition
---- ---------- ----------
__CLASS Property System.String __CLASS {...
...
BootDevice Property System.String BootDevic...
BuildNumber Property System.String BuildNumb...
...
进一步详细检索:
"如果您想要 Win32_OperatingSystem class 中包含的默认情况下不显示的信息,您可以使用 Format cmdlet 来显示它。例如,如果您想要显示可用内存数据,类型:
PS> Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2 -ComputerName . | Format-Table -Property TotalVirtualMemorySize,TotalVisibleMemorySize,FreePhysicalMemory,FreeVirtualMemory,FreeSpaceInPagingFiles
TotalVirtualMemorySize TotalVisibleMem FreePhysicalMem FreeVirtualMemo FreeSpaceInPagi
ory ry ngFiles
--------------- --------------- --------------- --------------- ---------------
2097024 785904 305808 2056724 1558232
备注
通配符与 Format-Table 中的 属性 个名称一起使用,因此最终的管道元素可以简化为 Format-Table -属性 TotalV*,Free*
如果您通过键入以下内容将其格式化为列表,则内存数据可能更具可读性:
PS> Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2 -ComputerName . | Format-List TotalVirtualMemorySize,TotalVisibleMemorySize,FreePhysicalMemory,FreeVirtualMemory,FreeSpaceInPagingFiles
TotalVirtualMemorySize : 2097024
TotalVisibleMemorySize : 785904
FreePhysicalMemory : 301876
FreeVirtualMemory : 2056724
FreeSpaceInPagingFiles : 1556644
我认为问题可能与该服务器上的远程用户授权和 Powershell 授权有关。
检查您是否使用相同的默认 SQL_AGENT 用户登录,并检查该用户是否具有所需的授权级别,如 Windows 策略 and/or [=19 中所定义=] 安全策略。
祝你好运。
因此,在第二次重新启动服务器后,WMI 查询似乎现在可以正常工作了。我相信 CU 和 SP 更新可以包括对 WMI 提供程序的更改,这些更改在系统重新启动之前不会更新。更新有时会说它们不需要重新启动,但如果 WMI 查询在更新后停止工作,则重新启动服务器可能会解决问题。
SQL 服务器代理有 performance objects and counters 用于监视作业。使用 Windows Performance Monitor 应用程序,我总能看到数据:
但是当我尝试在某些服务器上的 PowerShell 中使用 gwmi Win32_PerfFormattedData_SQLSERVERAGENT_SQLAgentJobs
时,没有实例 returned。使用 WBEMTest 和 wmic.exe 进行测试时的结果相同。
当我 运行 typeperf -qx
看到一堆 \SQLAgent:Jobs(_Total)* 指标时,我如何使用 WMI 查询从Win32_PerfFormattedData_SQLSERVERAGENT_SQLAgentJobs
或 Win32_PerfRawData_SQLSERVERAGENT_SQLAgentJobs
类?
更新: 嗯...这可能只是查询 SQL Server 2016 CU1 或 SP1 CU2 可用性组实例时的一个问题,尽管它再次适用于一些服务器而不是其他服务器。似乎在应用更新后停止工作,甚至在重新启动系统后计数器也没有 return 任何实例。我还无法在独立实例上复制该问题,因为它们总是 return 预期数据:
PS C:\> gwmi Win32_PerfRawData_SQLSERVERAGENT_SQLAgentJobs | ft -AutoSize Name,Successfuljobs,FailedJobs,Activejobs
Name Successfuljobs FailedJobs Activejobs
---- -------------- ---------- ----------
Others 0 0 0
Alerts 0 0 0
Schedules 20 106 0
_Total 20 106 0
另请注意,这些计数器在 sys.dm_os_performance_counters 视图中不可用。
根据教程,这应该非常简单 here
基本上,如果您想使用 Powershell 进行查询以获取那些特定的 WMI classes,您需要像这样查询它们:
“如果您已经知道 WMI class 的名称,则可以使用它立即获取信息。例如,通常用于检索有关某项信息的 WMI classes 之一电脑是 Win32_OperatingSystem.
PS> Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2 -ComputerName .
SystemDirectory : C:\WINDOWS\system32
Organization : Global Network Solutions
BuildNumber : 2600
RegisteredUser : Oliver W. Jones
SerialNumber : 12345-678-9012345-67890
Version : 5.1.2600
虽然我们展示了所有的参数,但是命令可以用更简洁的方式表达。连接到本地系统时不需要 ComputerName 参数。我们展示它是为了演示最一般的情况,并提醒您有关参数的信息。命名空间默认为 root/cimv2,也可以省略。最后,大多数 cmdlet 允许您省略常用参数的名称。对于 Get-WmiObject,如果没有为第一个参数指定名称,Windows PowerShell 会将其视为 Class 参数。这意味着可以通过键入以下命令发出最后一条命令:
Get-WmiObject Win32_OperatingSystem
Win32_OperatingSystem class 的属性比此处显示的要多得多。您可以使用 Get-Member 查看所有属性。 WMI class 的属性像其他对象属性一样自动可用:
PS> Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2 -ComputerName . | Get-Member -MemberType Property
TypeName: System.Management.ManagementObject#root\cimv2\Win32_OperatingSyste
m
Name MemberType Definition
---- ---------- ----------
__CLASS Property System.String __CLASS {...
...
BootDevice Property System.String BootDevic...
BuildNumber Property System.String BuildNumb...
...
进一步详细检索:
"如果您想要 Win32_OperatingSystem class 中包含的默认情况下不显示的信息,您可以使用 Format cmdlet 来显示它。例如,如果您想要显示可用内存数据,类型:
PS> Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2 -ComputerName . | Format-Table -Property TotalVirtualMemorySize,TotalVisibleMemorySize,FreePhysicalMemory,FreeVirtualMemory,FreeSpaceInPagingFiles
TotalVirtualMemorySize TotalVisibleMem FreePhysicalMem FreeVirtualMemo FreeSpaceInPagi
ory ry ngFiles
--------------- --------------- --------------- --------------- ---------------
2097024 785904 305808 2056724 1558232
备注
通配符与 Format-Table 中的 属性 个名称一起使用,因此最终的管道元素可以简化为 Format-Table -属性 TotalV*,Free* 如果您通过键入以下内容将其格式化为列表,则内存数据可能更具可读性:
PS> Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2 -ComputerName . | Format-List TotalVirtualMemorySize,TotalVisibleMemorySize,FreePhysicalMemory,FreeVirtualMemory,FreeSpaceInPagingFiles
TotalVirtualMemorySize : 2097024
TotalVisibleMemorySize : 785904
FreePhysicalMemory : 301876
FreeVirtualMemory : 2056724
FreeSpaceInPagingFiles : 1556644
我认为问题可能与该服务器上的远程用户授权和 Powershell 授权有关。
检查您是否使用相同的默认 SQL_AGENT 用户登录,并检查该用户是否具有所需的授权级别,如 Windows 策略 and/or [=19 中所定义=] 安全策略。
祝你好运。
因此,在第二次重新启动服务器后,WMI 查询似乎现在可以正常工作了。我相信 CU 和 SP 更新可以包括对 WMI 提供程序的更改,这些更改在系统重新启动之前不会更新。更新有时会说它们不需要重新启动,但如果 WMI 查询在更新后停止工作,则重新启动服务器可能会解决问题。