2012-07-24 65 views
9

我正在使用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

回答

23

在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

6

如果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

3
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

2

自動檢查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" 
) 
) 
4

最快,最簡單,最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?

0

這是我在PowerShell中使用

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

相關問題