Sql-Server

SQL 代理作業狀態的集中報告

  • August 31, 2022

我們需要為組織中的所有 sql 伺服器設計某種報告 SQL 代理作業狀態的狀態。

我可以通過直接在 msdb 中為該實例查詢 dmvs 來做到這一點,但它一次僅適用於一台伺服器。這意味著如果我創建一個 SSRS 報告,我可以根據實例名稱進行過濾。

但是,我們要求所有 sql 實例,大約 50 個應該顯示在一個公共儲存庫下,我們可以從中看到狀態。例如,如果想在給定時間查看多少台伺服器,我們可以看到作業失敗。

我不確定這與直接查詢相比有多實時,但知道如何實現這一點或我可以使用或定制的任何現有解決方案嗎?

謝謝

嗯,從純粹的 SQL Server 角度來看,您有兩個實際上是實時的選項:

  1. 您選擇一個伺服器作為查詢的集中點,並在其上為您關心的每個其他 SQL Server設置一個連結伺服器。然後,您可以通過單個伺服器實例/單個連接字元串從其他伺服器查詢您需要的任何內容。
  2. 在 SSRS 中,您在報告項目中為要報告的每個 SQL Server 實例設置一個數據源。然後,您可以設置UNION每個數據源的結果的數據集,以供您的報告使用。

老實說,這兩種選擇對我來說都太過分了。或者,您可以安排自己的 SQL 作業或在每台伺服器上設置某種形式的複制(這似乎更加過分,也許不要這樣做)以您的業務可以容忍的頻率將數據同步到單個伺服器。或者您可以編寫自己的應用程序服務來為您執行此操作。

我可能傾向於創建 SQL 作業或自己設置連結伺服器。

正如京東建議的那樣,如果沒有任何限製或政策,可以使用以下程式碼:

set nocount on;
declare @servers table (srv sysname)
declare @jobs table (srv sysname,jobname sysname,rundatetime datetime,run_status int,message_text nvarchar(1024))
declare @cmd1 nvarchar(512)
declare @cmd2 nvarchar(512)
declare @sql sysname

insert into @servers (srv)
select 'SQL1' union all
select 'SQL2' union all
select 'SQL3' 

set @cmd1='select * from OPENROWSET(''SQLNCLI'', ''Server=%s;Trusted_Connection=yes;'', ''select @@servername [sql], j.name, msdb.dbo.agent_datetime(run_date, run_time) [RunDateTime], jh.run_status, jh.message from msdb..sysjobhistory jh join msdb..sysjobs j on j.job_id=jh.job_id where jh.step_id=0 and jh.run_date=convert(int,convert(varchar(10),getdate(),112))'')'

while exists (select top 1 1 from @servers)
   begin

       select top 1 @sql=srv 
       from @servers

       print @sql

       set @cmd2=FORMATMESSAGE(@cmd1,@sql)

       insert into @jobs (srv,jobname,rundatetime,run_status,message_text)
       exec (@cmd2)

       delete @servers 
       where srv=@sql

   end

select * from @jobs 

此程式碼查詢 msdb sysjobs 表並從三台伺服器 SQL1、SQL2、SQL3 獲取今天的作業執行統計資訊。該查詢只是一個範例,可以根據您的需要進行修改和增強。

樣本輸出: 腳本的輸出

引用自:https://dba.stackexchange.com/questions/316207