如何检查SQL Server代理是否正在运行

问题描述:

我正在使用SQL Server 2008 R2。我想找到一种方法来验证SQL Server代理是否正在运行。我怀疑代理没有运行,但我不知道如何检查。如何检查SQL Server代理是否正在运行

+1

你想检查手动?还是从SQL? – RedFilter 2012-07-24 14:19:33

+1

或代码...? – 2012-07-24 14:19:54

+0

如果可能的话,我更喜欢从SQL服务器管理工​​作室检查 – qinking126 2012-07-24 14:27:34

在Management Studio中,您可以通过查看对象资源管理器中的SQL Server代理节点来检查SQL Server代理是否正在运行。在下面的屏幕截图中,我的SQL Server 2012实例上的SQL Server代理正在运行(绿色箭头覆盖在SQL Server代理图标上),但SQL Server 2000代理已停止(红色x)。

enter image description here

您还可以查看控制面板 - >管理工具在>服务:

enter image description here

或者在Program Files文件> SQL Server>配置工具>配置管理器:

enter image description here

最后,你可以检查使用T-SQL状态:

DECLARE @agent NVARCHAR(512); 

SELECT @agent = COALESCE(N'SQLAgent$' + CONVERT(SYSNAME, SERVERPROPERTY('InstanceName')), 
    N'SQLServerAgent'); 

EXEC master.dbo.xp_servicecontrol 'QueryState', @agent; 
+0

在管理工作室,而不是箭头,我看到一个带有绿色边框的白色圆圈。这是什么意思 ?但是,在配置管理器中,我看到它正在运行(白色圆圈内的绿色箭头)。 – Steam 2014-01-09 21:15:38

+0

在其中一个服务器中,此脚本导致在对象'xp_servicecontrol',数据库'master',所有者'dbo'上拒绝错误 - EXECUTE权限。 – Steam 2014-01-09 21:26:25

+0

@blasto这不是脚本问题,这是一个权限问题。据推测,无论您使用什么脚本或UI方法,您都需要拥有正确的权限来查询服务的状态。 – 2014-01-09 21:30:23

如果SQL Server代理正在运行,绿色播放按钮将在SQL Server Management Studio中的SQL Server代理图标的右下角显示来。

要使用T-SQL执行下面的代码片段验证SQL Server代理的状态,对给定实例:

IF EXISTS ( SELECT 1 
      FROM master.dbo.sysprocesses 
      WHERE program_name = N'SQLAgent - Generic Refresher') 
BEGIN 
    SELECT @@SERVERNAME AS 'InstanceName', 1 AS 'SQLServerAgentRunning' 
END 
ELSE 
BEGIN 
    SELECT @@SERVERNAME AS 'InstanceName', 0 AS 'SQLServerAgentRunning' 
END 

源= Colin Stasiuk

+0

我注意到你可以停止代理来自管理工作室。但是,之后你不能从那里重新启动它。您可以从Windows服务重新启动。我想知道为什么它是这样的。 – Steam 2014-01-09 21:21:16

+0

这对我有效。我看到我的InstanceName为'1'。 Works on 2000,05,08R2 – Steam 2014-01-09 21:23:05

+1

^^^^^自SQL Server 2005以来,sysprocesses已被弃用,所以不,今天不应该直接使用该答案,除非您想稍后重新编写它 – Steam 2014-01-09 23:27:59

IF EXISTS (SELECT 1 FROM sysprocesses WHERE LEFT(program_name, 8) = 'SQLAgent') 
    PRINT 'Agent is running!' 
ELSE 
    PRINT 'Agent is not connected!'; 

让我知道如果这个作品否则试试这个

IF EXISTS ( SELECT 1 

      FROM master.dbo.sysprocesses 

      WHERE program_name = N'SQLAgent - Generic Refresher') 

BEGIN 

    SELECT @@SERVERNAME AS 'InstanceName', 1 AS 'SQLServerAgentRunning' 

END 

ELSE 

BEGIN 

    SELECT @@SERVERNAME AS 'InstanceName', 0 AS 'SQLServerAgentRunning' 

END 

参考:http://benchmarkitconsulting.com/colin-stasiuk/2009/07/20/check-sql-server-agent-status-on-all-sql-servers/

+0

为什么添加Colin's代码示例给你的答案,这是约翰萨姆森7分钟前的答案? – 2012-07-24 14:45:13

+0

不幸的是,我没有检查它。 – 2012-07-24 14:45:58

+1

但现在你知道,你可以将其删除。在两个不同的答案中使用完全相同的代码示例绝对没有价值。 – 2012-07-24 14:46:42

自动检查SQL Server代理是否正在使用此批处理文件运行。

如果它尚未运行,它将开始启动服务。

您需要为某些版本的MSSQL调整服务名称(SQLServerAgent)。

echo off 
echo Test SQL Server Agent Service 

for /F "tokens=3 delims=: " %%H in ('sc query "SQLServerAgent" ^| findstr "STATE"') do (
    if /I "%%H" NEQ "RUNNING" (
    echo service was stopped, starting service 
    rem put your optional errorlog or warning message here 
    net start "SQLServerAgent" 
) 
) 

最快,最简单,最directest以确定是否SQL Agent的方式运行,并且可以很容易地在SSMS来完成,在查询(因此它可以被自动化),没有查询已弃用的系统表(即sysprocesses)或EXECing xp_servicecontrol,是在SP1推出了SQL Server 2008 R2的DMV:

sys.dm_server_services

SELECT dss.[status], dss.[status_desc] 
FROM sys.dm_server_services dss 
WHERE dss.[servicename] LIKE N'SQL Server Agent (%'; 

返回:

status status_desc 
4  Running 

它只是需要VIEW SERVER STATE服务器的权限,但您已经需要它以便在对象资源管理器(在SSMS中)中查看它的状态。

而且,如果您不希望将VIEW SERVER STATE授予特定的登录,因为它允许获取太多其他信息,那么您在技术上根本不需要授予任何东西,至少不会授予实际用户。见我的回答DBA.StackExchange上类似的问题的详细信息(包括工作示例):

What minimum permissions do I need to provide to a user so that it can check the status of SQL Server Agent Service?

这是我在PowerShell中使用

Get-Service | Where-Object -like -value '*sql*agent*' -Property 'name'