Sql-Server
SQL 代理作業狀態的集中報告
我們需要為組織中的所有 sql 伺服器設計某種報告 SQL 代理作業狀態的狀態。
我可以通過直接在 msdb 中為該實例查詢 dmvs 來做到這一點,但它一次僅適用於一台伺服器。這意味著如果我創建一個 SSRS 報告,我可以根據實例名稱進行過濾。
但是,我們要求所有 sql 實例,大約 50 個應該顯示在一個公共儲存庫下,我們可以從中看到狀態。例如,如果想在給定時間查看多少台伺服器,我們可以看到作業失敗。
我不確定這與直接查詢相比有多實時,但知道如何實現這一點或我可以使用或定制的任何現有解決方案嗎?
謝謝
嗯,從純粹的 SQL Server 角度來看,您有兩個實際上是實時的選項:
- 您選擇一個伺服器作為查詢的集中點,並在其上為您關心的每個其他 SQL Server設置一個連結伺服器。然後,您可以通過單個伺服器實例/單個連接字元串從其他伺服器查詢您需要的任何內容。
- 在 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 獲取今天的作業執行統計資訊。該查詢只是一個範例,可以根據您的需要進行修改和增強。