syspolicy_purge_history执行失败的问题(满足你的强迫症)

最新新搭了一个SQLServer群集实例,在查看SQLAgent执行计划的时候,总是有一个系统任务执行失败。

那么这个任务是干嘛的呢?会不会影响数据库正常使用呢?

官方解释是:This procedure runs periodically via SQL Agent (msdb.dbo.sp_syspolicy_create_purge_job creates a SQL Agent job to run it), and it cleans out the execution history for the Policy-based managemen.

就不具体翻译了,大体就是它会定期的清除基于策略管理的一些历史记录。

说白了就是清一下log,那正常情况下不会影响数据库的正常使用。

当然你可以把它停了,但是作为程序员要有工匠精神不是吗?关键我还有洁癖(容不得半点系统错误)。

那我们看看它为什么失败吧,上图!

 

 

 作业步骤在 PowerShell 脚本的行 1 中接收到错误。对应行为“(Get-Item SQLSERVER:\SQLPolicy\SQL-A-01\DEFAULT).EraseSystemHealthPhantomRecords()”。更正脚本并重新安排作业。PowerShell 返回的错误信息为“无法连接到服务器 。  在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接)  ”.  进程退出代码 -1。.  该步骤失败。

查看了官方文档,链接:https://support.microsoft.com/zh-cn/help/955726/the-syspolicy-purge-history-sql-server-agent-job-may-fail-in-sql-serve

说是在集群系统中会出现此问题,问题所在就是在执行PowerShell脚本的时候找不到服务器。给出的两个解决办法是:

方法 1︰ 编辑 syspolicy_purge_history 作业(推荐)

编辑步骤 3 中的syspolicy_purge_history作业。若要执行此操作,请执行以下步骤:

  1. 启动 SQL Server 管理 Studio。
  2. 展开SQL Server 代理,然后再展开作业
  3. Syspolicy_purge_history,用鼠标右键单击,然后单击属性
  4. 单击步骤
  5. 擦除虚拟系统运行状况记录,请单击,然后单击编辑
  6. 命令框中,使用群集实例的虚拟服务器名称替换计算机节点名称。
  7. 单击确定,然后单击关闭

方法 2︰ 重新创建 syspolicy_purge_history 作业

若要重新创建的syspolicy_purge_history作业,运行下面的事务处理 SQL 语句。

DECLARE @jobId uniqueidentifier
-- Obtain the current job identifier that is associated with the PurgeHistory
SELECT @jobId = CAST(current_value AS uniqueidentifier)
FROM msdb.dbo.syspolicy_configuration_internal
WHERE name = N'PurgeHistoryJobGuid'

-- Delete the job identifier association in the syspolicy configuration

DELETE FROM msdb.dbo.syspolicy_configuration_internal
WHERE name = N'PurgeHistoryJobGuid'

-- Delete the offending job
EXEC msdb.dbo.sp_delete_job @job_id = @jobId

-- Re-create the job and its association in the syspolicy configuration table
EXEC msdb.dbo.sp_syspolicy_create_purge_job

我的服务器有两个主机SQL-A-01和SQL-A-02,这两个做的群集。虽然上边写的不是很清楚,但是可以理解为这样,

上边报错的地方执行的脚本写的是SQLPolicy\SQL-A-01,这样的话在集群里是不能被识别的,需要用到集群里虚拟服务器名称。

我的虚拟服务器名称是:SQL-A,那就按照方案1的办法把第三步的Powershell脚本改成:

(Get-Item SQLSERVER:\SQLPolicy\SQL-A\DEFAULT).EraseSystemHealthPhantomRecords(),保存!

 

再次执行这个任务,成功!

 

这样再也不用备受报错的煎熬了。

分享给和我一样有偏执狂倾向的你吧,哈哈


简码笔记,让你的代码更加简约精炼。

转载请注明出处。

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

简码笔记

您的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值