【问题】性能计数器DMV 只有几行,甚至没有
select * from sys.dm_os_performance_counters
如下图,看右下角,只有57行,直接用安装介质 修复也不行;
【解决方案】
转自/参考官网:https://docs.microsoft.com/en-us/archive/blogs/pfelatam/sql-performance-counters-are-missing
有一次,当我使用通过性能监视器上的 SQL Server 计数器收集性能数据的工具提供服务时,当我尝试查看数据但没有任何信息时,我感到很惊讶。
他们我直接在性能监视器上检查了 SQL Server 计数器,但计数器不在列表中。这就是我决定写这篇博客的原因,以了解如果性能监视器上的 SQL Server 计数器消失该怎么办。
(1)通过介质修复sql server文件
恢复 SQL 计数器的正确且最简单的方法是通过添加/删除程序修复 SQL Server 二进制文件。
但是,这将需要 SQL 实例停机(如果您使用的是集群,则可以切换到另一个节点)
因此,还有另一种选择,您可以执行以下步骤来恢复此计数器:
(2)重载该数据库实例的性能计数器
首先,您需要打开一个具有管理权限的命令提示符控制台。
转到要修复的 SQL 实例上的目录 BINN(例如:C:Program FilesMicrosoft SQL ServerMSSQL10_50.MSSQLSERVERMSSQLBinn)
现在为了避免任何不一致,使用 unlodctr MSSQLSERVER 消除 SQL 计数器的任何剩余部分,对于命名实例,使用格式 MSSQL$NombreInstancia
现在要加载计数器,您应该使用以下命令
lodctr perf-MSSQLSERVERsqlctr.ini
# perf-MSSQL$NombreInstanciasqlctr.ini
如果您使用的是命名实例,您应该使用这种格式 perf-MSSQL$NombreInstanciasqlctr.ini,您可以执行该命令两次以检查计数器已添加。
注意:我尝试了 sqlctr.ini,但它不起作用。然后在我尝试 perf-mssqlserversqlctr.ini 之后,它起作用了。
现在您应该使用以下命令重新启动远程注册表和性能日志和警报服务:
net stop "Remote Registry" && net start "Remote Registry"
net stop "Performance Logs & Alerts" && net start " Performance Logs & Alerts "
# 这个也可以写成 net stop pla && net start pla
注意:如果 mssqlserver 的计数器:buffer cache hit ratio = 0,重启 mssql 服务,则该值将等于 100。
如果您使用前面的过程来恢复 SQL Server 群集上的 SQL 计数器,则应在两个节点上重建群集,当您重建计数器时,活动 SQL 实例必须位于节点上。
(3)通过注册表
如果执行上述步骤后 SQL Counters 没有出现,则需要查看注册表配置单元和注册表项(不建议在注册表级别进行任何更改,否则可能会导致操作系统不稳定。如果如果您选择进行这些更改,您应该有操作系统和注册表的备份,以便在必要时恢复它),以下注册表项应该存在并且具有有效的配置。
[HKEY_LOCAL_MACHINESystemCurrentControlSetServices<<service name>>Performance]
Library
Open
Collect
Close
PerfIniFile
您还应该检查 HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionPerflib 中是否有一个名为 Disable Performance Counters 的键,如果配置为 1,则应配置为 0。这应该允许您重建注册表计数器和帮助文件。
现在可能需要或不需要重建 SQL 和/或操作系统计数器,在 perfmon 上查找 SQL 计数器,如果它们不存在,则使用前面的步骤重建,然后使用以下命令重建所有操作系统计数器。
cd %systemroot%system32
/R
您应该考虑的另一个注意事项是在 Windows Server 64 位环境中执行 SQL Server 32 位时
我希望这篇文章对您有所帮助,请记住,我们的博客上有大量好文章可以帮助您解决许多 SQL Server 主题以及如何解决一些问题。下篇文章见!
(4)命令总结文档
默认实例为: MSSQLSERVER
例如:unlodctr MSSQLSERVER
如果是命名实例:MSSQLSERVER2
则:unlodctr MSSQL$MSSQLSERVER2