SharePoint 2016部分Timer Jobs无法执行求助:运行时间显示N/A
首先先解答你最关心的那个问题:部分Timer Jobs未关联Web应用是完全正常的。SharePoint里有不少场级系统Timer Job(比如配置缓存清理、用户配置文件同步这类),它们的作用范围是整个农场,不需要绑定到特定Web应用,所以显示N/A是合理的,不用把这个当成异常点。
接下来针对你已经做过基础排查后,再给你几个更深入的方向:
1. 深挖Timer Job的状态与定义完整性
你可以用PowerShell查更详细的Job信息,确认Job是否真的启用,以及有没有定义损坏:
Get-SPTimerJob | Where-Object {$_.LastRunTime -eq [DateTime]::MinValue} | Select-Object Name, DisplayName, Enabled, JobDefinitionId, Server
- 如果查到Job是禁用状态,直接启用:
Enable-SPTimerJob -Identity "<你的Job名称>" - 要是系统Job显示异常,建议对比同版本正常农场的Job列表,看看有没有缺失的定义。必要时可以用
Initialize-SPResourceSecurity重置资源安全设置来修复系统Job定义——注意:执行前一定要备份配置数据库
2. 查Timer服务日志和ULS日志找报错
别只看表面现象,日志里藏着关键信息:
- 去这个路径找Timer服务的日志:
C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\LOGS,筛选包含Timer Job或者对应Job名称的条目,重点找权限不足、数据库连接失败这类报错 - 用ULS Viewer分析日志,优先看Critical和Error级别的内容,尤其是和Job执行相关的未处理异常、程序集找不到这类信息
3. 把服务账号的权限查透
你已经检查过服务账号,但可以再细化:
- 确认SPTimerV4服务账号对配置数据库、所有内容数据库有
db_owner权限,同时要在SharePoint服务器的本地管理员组里 - 自定义Timer Job的话,检查部署的WSP对应的程序集是不是在GAC里,而且服务账号对程序集所在路径有读取权限
- 如果Job要访问外部资源(比如文件服务器、其他数据库),也要确认服务账号有对应访问权限
4. 重置Timer Job的调度计划
迁移可能把Job的调度给搞乱了,试试重新设置:
$job = Get-SPTimerJob -Identity "<你的Job名称>" # 举个例子:设置成每天凌晨2点执行 $schedule = New-SPTimerSchedule -Daily -At 02:00 $job.Schedule = $schedule $job.Update()
设置完重启SPTimerV4服务,看看能不能正常触发
5. 检查数据库一致性
迁移过程中容易导致配置数据库出现不一致,先检查内容数据库:
Test-SPContentDatabase -Name "<内容数据库名>" -WebApplication "<Web应用URL>"
配置数据库的话,可以用SQL Server的DBCC CHECKDB做检查——同样,执行前必须备份数据库
6. 自定义Timer Job的专属排查
- 看看自定义Job的代码里有没有依赖2010/2013旧API的部分,迁移到2016需要适配新的API
- 重新部署WSP时记得加
-Force参数,部署后回收对应的应用程序池:
Update-SPSolution -Identity "<你的解决方案名>.wsp" -LiteralPath "<WSP文件路径>" -GACDeployment -Force
- 检查Windows事件日志里有没有自定义Job抛出的未捕获异常,这很可能是Job终止的原因
极端情况的最后手段
如果上面所有方法都没用,可以试试重新注册所有系统Timer Job:
Get-SPFarm | Initialize-SPTimerJob
这个命令会重置农场里的所有Timer Job定义,一定要在非业务高峰操作,并且提前备份好配置数据库
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

