Sql-Server
檢查作業狀態作為日常任務
我最近一直在思考這個問題:關於如何檢查 SQL Server 代理作業是否正確執行是否有共識?
- 一些建議似乎是提醒操作員注意故障並解決這些問題,但這根本不考慮未執行的作業(例如,如果代理關閉了一段時間),而不是執行並失敗。
- 有人建議使用 Job Activity Monitor 並檢查計劃和狀態,這更好,但需要您連接到每台伺服器,這在大型房地產中可能很費力,並維護作業時間列表。
- 我們目前有每台伺服器的作業列表,並設置了一個操作員將郵件發送到單個 DBA 帳戶。每天,我們都會根據通知電子郵件檢查電子表格中的每個作業,檢查失敗或沒有通知。
我覺得必須有一個更好的解決方案,但我的Google搜尋並沒有提出任何問題。有沒有人有更好的解決方案來管理代理工作的狀態?
編輯 - 我還應該補充一點,我們 IDERA SQLDM 來監控一些伺服器,但沒有預算來查看我們所有的伺服器。此外,我們的 SCOM 實施掌握在我們的伺服器團隊手中,目前從中獲取資訊對我們來說並不容易。這使得獲取有關代理狀態的可靠資訊變得困難。
您有中央管理伺服器嗎?如果是這樣,您可以使用此查詢並針對所有伺服器上的所有 sql 實例執行它:
SELECT CONVERT(nvarchar(128), SERVERPROPERTY('Servername')) AS Server, msdb.dbo.sysjobs.job_id, msdb.dbo.sysjobs.name, msdb.dbo.sysjobs.enabled AS Job_Enabled, msdb.dbo.sysjobs.description, msdb.dbo.sysjobs.notify_level_eventlog, msdb.dbo.sysjobs.notify_level_email, msdb.dbo.sysjobs.notify_level_netsend, msdb.dbo.sysjobs.notify_level_page, msdb.dbo.sysjobs.notify_email_operator_id, msdb.dbo.sysjobs.date_created, msdb.dbo.syscategories.name AS Category_Name, msdb.dbo.sysjobschedules.next_run_date, msdb.dbo.sysjobschedules.next_run_time, msdb.dbo.sysjobservers.last_run_outcome, msdb.dbo.sysjobservers.last_outcome_message, msdb.dbo.sysjobservers.last_run_date, msdb.dbo.sysjobservers.last_run_time, msdb.dbo.sysjobservers.last_run_duration, msdb.dbo.sysoperators.name AS Notify_Operator, msdb.dbo.sysoperators.email_address, msdb.dbo.sysjobs.date_modified, GETDATE() AS Package_run_date, msdb.dbo.sysschedules.name AS Schedule_Name, msdb.dbo.sysschedules.enabled, msdb.dbo.sysschedules.freq_type, msdb.dbo.sysschedules.freq_interval, msdb.dbo.sysschedules.freq_subday_interval, msdb.dbo.sysschedules.freq_subday_type, msdb.dbo.sysschedules.freq_relative_interval, msdb.dbo.sysschedules.freq_recurrence_factor, msdb.dbo.sysschedules.active_start_date, msdb.dbo.sysschedules.active_end_date, msdb.dbo.sysschedules.active_start_time, msdb.dbo.sysschedules.active_end_time, msdb.dbo.sysschedules.date_created AS Date_Sched_Created, msdb.dbo.sysschedules.date_modified AS Date_Sched_Modified, msdb.dbo.sysschedules.version_number, msdb.dbo.sysjobs.version_number AS Job_Version FROM msdb.dbo.sysjobs INNER JOIN msdb.dbo.syscategories ON msdb.dbo.sysjobs.category_id = msdb.dbo.syscategories.category_id LEFT OUTER JOIN msdb.dbo.sysoperators ON msdb.dbo.sysjobs.notify_page_operator_id = msdb.dbo.sysoperators.id LEFT OUTER JOIN msdb.dbo.sysjobservers ON msdb.dbo.sysjobs.job_id = msdb.dbo.sysjobservers.job_id LEFT OUTER JOIN msdb.dbo.sysjobschedules ON msdb.dbo.sysjobschedules.job_id = msdb.dbo.sysjobs.job_id LEFT OUTER JOIN msdb.dbo.sysschedules ON msdb.dbo.sysjobschedules.schedule_id = msdb.dbo.sysschedules.schedule_id WHERE msdb.dbo.sysjobs.enabled = 1 AND msdb.dbo.sysjobservers.last_run_outcome = 0