描述

我们有一台数据库服务器windows 2012 r2 上有安装sql server 2012 和sql server 2016双实例,后续又把sql 2016的服务全部停用,即只保留sql 2012 的服务在用。在例行检查数据库的job 运行情况时发现syspolicy_purge_history该自带的job一直是失败的,错误一直停留在step 3,首先先了解一下该job的官方文档说明,发现虽然跟实际在用的业务功能没有什么关联,但还是觉得有必要修复。

操作步骤

a.查看job的具体报错提示
消息
已以用户 XXXXXXXXX 的身份执行。 作业步骤在 PowerShell 脚本的行 1 中接收到错误。对应行为“import-module SQLPS -DisableNameChecking”。更正脚本并重新安排作业。PowerShell 返回的错误信息为“未能加载文件或程序集“file:///C:\Program Files (x86)\Microsoft SQL Server\130\Tools\PowerShell\Modules\SQLPS\Microsoft.SqlServer.Management.PSSnapins.dll”或它的某一个依赖项。生成此程序集的运行时比当前加载的运行时新,无法加载此程序集。 ”. 进程退出代码 -1。. 该步骤失败。
查看该step 3 代码如下:
if ('$(ESCAPE_SQUOTE(INST))' -eq 'MSSQLSERVER') {$a = '\DEFAULT'} ELSE {$a = ''};
(Get-Item SQLSERVER:\SQLPolicy\$(ESCAPE_NONE(SRVR))$a).EraseSystemHealthPhantomRecords()
其中对ESCAPE_比较困惑,感觉不像是powershell ,查看帮助才知道是sql server agent 的tonkens.
b.在powershell 运行Import-Moduls 语句
还是一样无法加载该文件,那么升级到powhershell 5 能否解决该问题,因涉及到安装可能会重启服务器不确定因素,慎重起见该方案非首先选。竟然是无法加载该文件,那么直接使用sql 2012 对应的文件是不是就可以了,顺着这个思路,那么问题就变成了如何让step 3这步执行的默认去sql 2012的路径找。
c.修改环境变量
默认的内容
%ProgramFiles%\WindowsPowerShell\Modules;%SystemRoot%\system32\WindowsPowerShell\v1.0\Modules;C:\Program Files (x86)\Microsoft SQL Server\130\Tools\PowerShell\Modules\;C:\Program Files (x86)\Microsoft SQL Server\110\Tools\PowerShell\Modules\
修改为
%ProgramFiles%\WindowsPowerShell\Modules;%SystemRoot%\system32\WindowsPowerShell\v1.0\Modules;C:\Program Files (x86)\Microsoft SQL Server\110\Tools\PowerShell\Modules\;C:\Program Files (x86)\Microsoft SQL Server\130\Tools\PowerShell\Modules\
即把sql 2016和sql 2012 的路径调换一下。
d.重新执行job验证
 

后记

后续遇到类似的syspolicy_purge_history的step3执行失败的案例A如下:
日期        2019/6/15 8:01:25
日志 作业历史记录 (syspolicy_purge_history) 步骤 ID 3
服务器 D*********
作业名称 syspolicy_purge_history
步骤名称 Erase Phantom System Health Records.
持续时间 00:00:00
SQL 严重性 0
SQL 消息 ID 0
已通过电子邮件通知的操作员
已通过网络发送通知的操作员
已通过寻呼通知的操作员
重试次数 0 消息
无法开始执行步骤 3 (原因: PowerShell 子系统加载失败 [有关详细信息,请参阅 SQLAGENT.OUT 文件];该作业已挂起). 该步骤失败。

对应的SQLAGENT.OUT 文件部分内容如下:

2019-06-14 16:04:12 - ! [] 无法加载子系统“PowerShell”(原因: 系统找不到指定的路径。)
2019-06-14 16:04:12 - ? [] SQLSERVERAGENT 在 Windows NT 服务控制下启动
2019-06-14 16:04:12 - + [] 没有为代理通知启用数据库邮件。
2019-06-14 16:04:12 - + [] 尚未定义空闲 CPU 条件 - OnIdle 作业计划将不起任何作用
2019-06-15 08:01:25 - ! [LOG] 未能加载 PowerShell 子系统,所以不能运行作业“syspolicy_purge_history”(0x8CEE075FE296DF4DA6B50C671B32C757)的步骤 3。该作业已挂起。
2019-06-16 22:13:31 - + [] 运行作业 syspolicy_purge_history 的请求(来自 计划 8 (syspolicy_purge_history_schedule))被拒绝,因为该作业已挂起
2019-06-17 07:40:44 - + [] 运行作业 syspolicy_purge_history 的请求(来自 计划 8 (syspolicy_purge_history_schedule))被拒绝,因为该作业已挂起
2019-06-18 07:51:42 - + [] 运行作业 syspolicy_purge_history 的请求(来自 计划 8 (syspolicy_purge_history_schedule))被拒绝,因为该作业已挂起
2019-06-19 07:41:52 - + [] 运行作业 syspolicy_purge_history 的请求(来自 计划 8 (syspolicy_purge_history_schedule))被拒绝,因为该作业已挂起
2019-06-20 07:47:37 - + [] 运行作业 syspolicy_purge_history 的请求(来自 计划 8 (syspolicy_purge_history_schedule))被拒绝,因为该作业已挂起

解决步骤

第一步:查询文件路径
--step 1
SELECT * FROM msdb.dbo.syssubsystems WHERE start_entry_point ='PowerShellStart'

第二步:核实该路径是否有效
第三步:查询sqlps.exe文件路径,如没有需其他服务器上拷贝同版本的文件。
第四步:修改路径
Use msdb
go sp_configure 'allow updates', 1 RECONFIGURE WITH OVERRIDE

UPDATE msdb.dbo.syssubsystems SET agent_exe='D:\Program Files\Microsoft SQL Server\130\Tools\Binn\SQLPS.exe' WHERE start_entry_point ='PowerShellStart'

SELECT * FROM msdb.dbo.syssubsystems WHERE start_entry_point ='PowerShellStart'

Use msdb

go

sp_configure 'allow updates', 0

RECONFIGURE WITH OVERRIDE

第五步:重启一下sql server 代理服务

第六步: 重新执行syspolicy_purge_history
发现还是挂起,当前使用的sql server 2016 ,重新查询路径发现又恢复成原始的路径,竟然走不通,那把文件直接拷贝到对应的路径下试试。重新按上述步骤走一遍;
发现还是失败,直接在路径中打开这个SQLPS.exe文件,发现如下错误

import-module : 未能加载指定的模块“SQLPS”,因为在任何模块目录中都没有找到有效模块文件。
所在位置 行:1 字符: 1
+ import-module SQLPS
+ ~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ResourceUnavailable: (SQLPS:String) [Import-Module], FileNotFoundException
+ FullyQualifiedErrorId : Modules_ModuleNotFound,Microsoft.PowerShell.Commands.ImportModuleCommand

对比其他服务器发现Tools文件夹下缺失PowerShell文件夹,从其他同版本的服务器拷贝一个过来,如下:

重复上述步骤再执行job
问题终于解决;
案例B
日期  2019/6/19 17:43:07
日志 作业历史记录 (syspolicy_purge_history) 步骤 ID 3
服务器 S*****
作业名称 syspolicy_purge_history
步骤名称 Erase Phantom System Health Records.
持续时间 00:00:30
SQL 严重性 0
SQL 消息 ID 0
已通过电子邮件通知的操作员
已通过网络发送通知的操作员
已通过寻呼通知的操作员
重试次数 0 消息
已以用户 HDJT\sprsql 的身份执行。 作业步骤在 PowerShell 脚本的行 1 中接收到错误。对应行为“set-executionpolicy RemoteSigned -scope process -Force”。更正脚本并重新安排作业。PowerShell 返回的错误信息为“安全性错误。 ”. 进程退出代码 -1。. 该步骤失败。
这个是sql server 2012版本;

官方的解决方法如下


SQL Server 2008年或 SQL Server 2008 R2 在无法启动 SQL PowerShell RemoteSigned策略。在 SQL Server 2008年中,因此,作业不会失败。作为一种安全措施,SQL Server 2012年启动 SQL PowerShell RemoteSigned策略中。这将导致作业失败,前面的问题发生。

不受限制的明确建议不要从安全角度因为这意味着没有限制。PowerShell 脚本运行成功时MachinePolicy设置为在域控制器中的RemoteSigned从 SQL 2012 年启动时,这就是原因。

要解决此问题,请使用下列方法之一︰

  • 不要设置域控制器 GPO 的计算机策略。如果未定义,这意味着下一个级别策略 (示例中, UserPolicy,然后流程,然后为CurrentUser,和上一次LocalMachine) 将优先。
  • 在 Active Directory 用户和计算机中创建新组织单位 (OU) 并将链接组策略的 OU。然后启用 RemoteSigned 策略。若要执行此操作,请执行以下步骤:
    1. 转到Active Directory 用户和计算机。
    2. 用鼠标右键单击您的域->新建->组织单位创建新的组织单位。
    3. 在运行,键入gpmc.msc ,然后用鼠标右键单击组策略对象->新建以创建新的 GPO。
    4. 用鼠标右键单击新创建的 GPO->编辑。它会打开一个新窗口。
    5. 转到计算机配置->策略->管理模板-> Windows 组件-> Windows PowerShell -> 双击打开脚本执行
    6. 设置为允许本地脚本和远程签名的脚本的执行策略
    7. 单击应用,然后单击确定。
    8. 转到Active Directory 用户和计算机,然后单击计算机。在域中找到计算机的列表。右键单击您希望移动在新创建的组织单位中的计算机。以这种方式,可以将单个或一组计算机移动到一个组织单位。
    9. 转到组策略管理用鼠标右键单击新创建的组织单位、 单击链接现有的 GPO、 选择新创建的 GPO,然后单击确定。
    10. 通过运行此命令继续更新域控制器和客户端计算机上的策略。
       gpupdate /force
    11. 验证计算机策略的组织单位和客户端组件,它应该RemoteSigned。

参考

 
 
 
 
 
 

syspolicy_purge_history作业故障排除的更多相关文章

  1. 第十篇 Replication:故障排除

    本篇文章是SQL Server Replication系列的第十篇,详细内容请参考原文. 复制故障排除是一项艰巨的任务.在任何复制设置中,都涉及到很多移动部件,而可用的工具并不总是很容易识别问题.Th ...

  2. 【译】第十篇 Replication:故障排除

    本篇文章是SQL Server Replication系列的第十篇,详细内容请参考原文. 复制故障排除是一项艰巨的任务.在任何复制设置中,都涉及到很多移动部件,而可用的工具并不总是很容易识别问题.Th ...

  3. spark——故障排除

    故障排除一:控制reduce端缓冲大小以避免OOM 在Shuffle过程,reduce端task并不是等到map端task将其数据全部写入磁盘后再去拉取,而是map端写一点数据,reduce端task ...

  4. 学习笔记:CentOS7学习之十八:Linux系统启动原理及故障排除

    目录 学习笔记:CentOS7学习之十八:Linux系统启动原理及故障排除 18.1 centos6系统启动过程及相关配置文件 18.1.1 centos6系统启动过程 18.1.2 centos6启 ...

  5. spark 性能优化 数据倾斜 故障排除

    版本:V2.0 第一章       Spark 性能调优 1.1      常规性能调优 1.1.1   常规性能调优一:最优资源配置 Spark性能调优的第一步,就是为任务分配更多的资源,在一定范围 ...

  6. Longhorn 云原生容器分布式存储 - 故障排除指南

    内容来源于官方 Longhorn 1.1.2 英文技术手册. 系列 Longhorn 是什么? Longhorn 云原生容器分布式存储 - 设计架构和概念 Longhorn 云原生容器分布式存储 - ...

  7. 理解 OpenStack + Ceph (7): Ceph 的基本操作和常见故障排除方法

    本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 ...

  8. 细化如何安装LNMP + Zabbix 监控安装文档以及故障排除

    1.LNMP所需安装包: 上传如下软件包到/soft目录中 mysql- (centos6. 64位自带)也可根据版本自行挑选,前提你了解这个版本 pcre-8.36.tar.gz nginx-.ta ...

  9. 《DevOps故障排除:Linux服务器运维最佳实践》读书笔记

    首先,这本书是Linux.CN赠送的,多谢啦~ http://linux.cn/thread-12733-1-1.html http://linux.cn/thread-12754-1-1.html ...

随机推荐

  1. Java将字符串格式时间转化成Date格式

    可以通过 new 一个 SimpleDateFormat 对象,通过对象调用parse方法实现 示例代码: String time = "2019-07-23"; SimpleDa ...

  2. JAVA-如何打包成jar包

    主线:编译 - 打包 - 运行 准备工作: 1. 手动打可直接执行的jar包 1) 先使用javac编译java文件,得到class文件 2) 新建文件,名字任起,比如可以叫manifest,内容如下 ...

  3. Gym - 101170B British Menu SCC点数目不超过5的最长路

    题意其实就是给你一个有向图 但是每个SCC里面的点数目不超过5 求最长路 首先暴力把每个SCC里的每个点的最长路跑出来 然后拓扑排序dp 然后因为tarjan 搜索树出来的SCC是拓扑排好序的 可以直 ...

  4. ubuntu下log4cxx安装使用

    需要安装log4cxx,安装的过程中可是充满了坎坷...最大的问题是在make log4cxx时,总是报undefined XML什么什么的错误,查了一下也没解决了,然后把apr-utils删了重新装 ...

  5. js技术javascript 该重视

    当下,js大有挤压php java asp.net之类后端语言的趋势,直接js html5 socket与后端python c c++ 等通信 更不用提二维 三维计算展示 方面 医院呼叫 报警  处理 ...

  6. mysql大数据解决方案--分表分库(0)

    引言 对于一个大型的互联网应用,海量数据的存储和访问成为了系统设计的瓶颈问题,对于系统的稳定性和扩展性造成了极大的问题.通过数据切分来提高网站性能,横向扩展数据层已经成为架构研发人员首选的方式. •水 ...

  7. Educational Codeforces Round 73 (Rated for Div. 2) A. 2048 Game

    链接: https://codeforces.com/contest/1221/problem/A 题意: You are playing a variation of game 2048. Init ...

  8. 题解 noip2019模拟赛Day1T3

    题面 运河计划 问题描述 水运在人类的交通运输史中一直扮演着重要的角色.借助河流.的便利,人们得以把大量的货物输送到天南海北不仅仅是自然界现成的河流,人工开凿的运河(如苏伊士运河.巴拿马运河.我国的京 ...

  9. 作为新手对于初次接触matlab的一些感受。

    使用matlab时的个人感受:1.建立一个matlab的M文件函数function xxx=aaa(b,c,d) 其中返回值为xxx,函数名为aaa,函数变量为b,c,d 要将其写在一个M文件之中,并 ...

  10. python 处理 json 四个函数dumps、loads、dump、load的区别

    1 .json.dumps() 函数是将一个 Python 数据类型列表(可以理解为字典)进行json格式的编码(转换成字符串,用于传播)eg, dict = {"age": &q ...