在 SQL Server 2012 中,我有一个 Job Agent Alert 设置如下:
EXEC msdb.dbo.sp_add_alert @name=N'Deadlock Alert',
@message_id=0,
@severity=0,
@enabled=1,
@delay_between_responses=0,
@include_event_description_in=1,
@category_name=N'[Uncategorized]',
@performance_condition=N'Locks|Number of Deadlocks/sec|_Total|>|0',
@job_id=N'00000000-0000-0000-0000-000000000000'
我有一个计划在每个工作日下午 5:30 运行的作业执行此步骤:
EXEC msdb.dbo.sp_update_alert @name = N`enter code here`'Deadlock Alert', @enabled = 0;
我有另一个在每个工作日的上午 8:00 重新启用警报。在许多情况下,这两项工作(和警报)都可以正常工作数月。但是周五下午 5:30 的工作在一个实例中失败,并显示以下消息:
指定的 object_name ('Locks') 不存在。[SQLSTATE 42000](错误 14262)指定的对象名称(“数据库”)不存在。[SQLSTATE 42000](错误 14262)。该步骤失败。
如果我直接为该警报执行 sp_update_alert 命令(启用设置为 0 或 1)。我收到此错误:
消息 14262,级别 16,状态 1,过程 sp_verify_performance_condition,第 50 行指定的对象名称(“锁”)不存在。
我尝试使用 SSMS UI 禁用警报并得到:
指定的 object_name ('Locks') 不存在。(Microsoft SQL 服务器,错误:14262)
这对作业在所有其他实例中仍在正常运行,没有错误。是什么导致 sp_update_alert 失败,这只是在一个实例中,而且是从星期五开始的?
[添加:]
启用和禁用作业还启用和禁用另一个警报,该警报查看 SQLServer:Databases|Data File(s) Size (KB)|tempdb 计数器,这些命令抛出错误“指定的对象名称(‘数据库’)不存在”。同样,仅在这一次。相同的作业和警报在同一台服务器上的另一个实例上仍然可以正常工作。
验证 SQL Server 代理帐户是否具有查询性能计数器 DMV 的必要权限(听起来您的代理帐户最近已更改)。根据文档:
所以:
还要确保作为该登录名(或使用 的任何登录名
VIEW SERVER STATE
,例如sa
),您可以看到从 DMV 返回的结果。我听说过很多情况,在 SQL Server 中性能计数器只是空着,这可以追溯到 SQL Server 2000 withsysperfinfo
. 一些消息来源建议将以下内容作为命令行的解决方案(然后重新启动):当然,Microsoft 关闭了大部分这些报告,因为无法重现(这并不让我感到惊讶,因为我没有直接看到这种症状,并且不知道如何重现该问题)。
在这些线程中还有一些建议,欢迎您尝试(这些已经存在很长时间了,我不打算在这里尝试总结和重复这些信息):