परिचय
डेटाबेस व्यवस्थापक के लिए यह जानना महत्वपूर्ण है कि कौन से कार्य और उन्हें कैसे पूरा किया गया है। इस प्रक्रिया को सरल बनाने के लिए, इसे मैन्युअल रूप से निष्पादित करने के बजाय इसे स्वचालित करना बेहतर है।
इस लेख में, मैं एक विशेष उदाहरण पर विश्लेषण करूंगा कि SQL सर्वर एजेंट के पूर्ण कार्यों के बारे में डेटा को स्वचालित रूप से कैसे एकत्र किया जाए।
समाधान
एल्गोरिथम:
- कार्यों का चयन करने के लिए एक उदाहरण बनाएं:
USE [DATABASE_NAME] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE view [srv].[vJobRunShortInfo] as SELECT sj.[job_id] as Job_GUID ,j.name as Job_Name ,case sj.[last_run_outcome] when 0 then 'Error' when 1 then 'Successful' when 3 then 'Canceled' else case when sj.[last_run_date] is not null and len(sj.[last_run_date])=8 then 'Inconsistent state' else NULL end end as LastFinishRunState ,sj.[last_run_outcome] as LastRunOutcome ,case when sj.[last_run_date] is not null and len(sj.[last_run_date])=8 then DATETIMEFROMPARTS( substring(cast(sj.[last_run_date] as nvarchar(255)),1,4), substring(cast(sj.[last_run_date] as nvarchar(255)),5,2), substring(cast(sj.[last_run_date] as nvarchar(255)),7,2), case when len(cast(sj.[last_run_time] as nvarchar(255)))>=5 then substring(cast(sj.[last_run_time] as nvarchar(255)),1,len(cast(sj.[last_run_time] as nvarchar(255)))-4) else 0 end, case when len(right(cast(sj.[last_run_time] as nvarchar(255)),4))>=4 then substring(right(cast(sj.[last_run_time] as nvarchar(255)),4),1,2) when len(right(cast(sj.[last_run_time] as nvarchar(255)),4))=3 then substring(right(cast(sj.[last_run_time] as nvarchar(255)),4),1,1) else 0 end, right(cast(sj.[last_run_duration] as nvarchar(255)),2), 0 ) else NULL end as LastDateTime ,case when len(cast(sj.[last_run_duration] as nvarchar(255)))>5 then substring(cast(sj.[last_run_duration] as nvarchar(255)),1,len(cast(sj.[last_run_duration] as nvarchar(255)))-4) when len(cast(sj.[last_run_duration] as nvarchar(255)))=5 then '0'+substring(cast(sj.[last_run_duration] as nvarchar(255)),1,len(cast(sj.[last_run_duration] as nvarchar(255)))-4) else '00' end +':' +case when len(cast(sj.[last_run_duration] as nvarchar(255)))>=4 then substring(right(cast(sj.[last_run_duration] as nvarchar(255)),4),1,2) when len(cast(sj.[last_run_duration] as nvarchar(255)))=3 then '0'+substring(right(cast(sj.[last_run_duration] as nvarchar(255)),4),1,1) else '00' end +':' +case when len(cast(sj.[last_run_duration] as nvarchar(255)))>=2 then substring(right(cast(sj.[last_run_duration] as nvarchar(255)),2),1,2) when len(cast(sj.[last_run_duration] as nvarchar(255)))=2 then '0'+substring(right(cast(sj.[last_run_duration] as nvarchar(255)),2),1,1) else '00' end as [LastRunDurationString] ,sj.last_run_duration as LastRunDurationInt ,sj.[last_outcome_message] as LastOutcomeMessage ,j.enabled as [Enabled] FROM [msdb].[dbo].[sysjobservers] as sj inner join msdb.dbo.sysjobs_view as j on j.job_id=sj.job_id; GO
ऐसा करने के लिए, sysjobservers और sysjobs_view उदाहरणों का उपयोग करें।
- चयनित डेटा स्टोर करने के लिए एक टेबल बनाएं:
USE [DATABASE_NAME] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [srv].[ShortInfoRunJobs]( [Job_GUID] [uniqueidentifier] NOT NULL, [Job_Name] [nvarchar](255) NOT NULL, [LastFinishRunState] [nvarchar](255) NULL, [LastDateTime] [datetime] NOT NULL, [LastRunDurationString] [nvarchar](255) NULL, [LastRunDurationInt] [int] NULL, [LastOutcomeMessage] [nvarchar](255) NULL, [LastRunOutcome] [tinyint] NOT NULL, [Server] [nvarchar](255) NOT NULL, [InsertUTCDate] [datetime] NOT NULL, [ID] [int] IDENTITY(1,1) NOT NULL, CONSTRAINT [PK_ShortInfoRunJobs] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO ALTER TABLE [srv].[ShortInfoRunJobs] ADD CONSTRAINT [DF_ShortInfoRunJobs_InsertUTCDate] DEFAULT (getutcdate()) FOR [InsertUTCDate] GO
के लिए डिफ़ॉल्ट (getutcdate ()) - SQL सर्वर एजेंट में एक कार्य बनाएं और उन कार्यों के बारे में जानकारी प्राप्त करें जो या तो लंबे समय से (30 सेकंड से अधिक) निष्पादित किए गए हैं या पूर्ण होने में विफल रहे हैं। आपको पिछले दो दिनों के लिए यह जानकारी एकत्र करने की आवश्यकता है:
USE [DATABASE_NAME]; GO truncate table [srv].[ShortInfoRunJobs]; INSERT INTO [srv].[ShortInfoRunJobs] ([Job_GUID] ,[Job_Name] ,[LastFinishRunState] ,[LastDateTime] ,[LastRunDurationString] ,[LastRunDurationInt] ,[LastOutcomeMessage] ,[LastRunOutcome] ,[Server]) SELECT [Job_GUID] ,[Job_Name] ,[LastFinishRunState] ,[LastDateTime] ,[LastRunDurationString] ,[LastRunDurationInt] ,[LastOutcomeMessage] ,LastRunOutcome ,@@SERVERNAME FROM [srv].[vJobRunShortInfo] where [Enabled]=1 and ([LastRunOutcome]=0 or [LastRunDurationInt]>=30) and LastDateTime>=DateAdd(day,-2,getdate()); GO
यहां आप सभी अनावश्यक कार्यों को हटाने के लिए एक फिल्टर सेट कर सकते हैं। उदाहरण के लिए, वे कार्य जो प्रतिकृति को संदर्भित करते हैं क्योंकि इसे पूरा होने में अधिक समय लगता है।
व्यवस्थापकों के ईमेल पर भेजने के लिए एक HTML-रिपोर्ट जेनरेट करें:
USE [DATABASE_NAME] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [srv].[GetHTMLTableShortInfoRunJobs] @body nvarchar(max) OUTPUT AS BEGIN /* generates an HTML-code for the tables of completed tasks */ SET NOCOUNT ON; SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; declare @tbl table ( Job_GUID uniqueidentifier ,Job_Name nvarchar(255) ,LastFinishRunState nvarchar(255) ,LastDateTime datetime ,LastRunDurationString nvarchar(255) ,LastOutcomeMessage nvarchar(max) ,[Server] nvarchar(255) ,ID int identity(1,1) ); declare @Job_GUID uniqueidentifier ,@Job_Name nvarchar(255) ,@LastFinishRunState nvarchar(255) ,@LastDateTime datetime ,@LastRunDurationString nvarchar(255) ,@LastOutcomeMessage nvarchar(max) ,@Server nvarchar(255) ,@ID int; insert into @tbl( Job_GUID ,Job_Name ,LastFinishRunState ,LastDateTime ,LastRunDurationString ,LastOutcomeMessage ,[Server] ) select Job_GUID ,Job_Name ,LastFinishRunState ,LastDateTime ,LastRunDurationString ,LastOutcomeMessage ,[Server] from srv.ShortInfoRunJobs --order by LastRunDurationInt desc; if(exists(select top(1) 1 from @tbl)) begin set @body='When analyzing these tasks execution, I have found out the tasks that either have failed with an error, or, it has taken more than 30 seconds for their execution :<br><br>'+'<TABLE BORDER=5>'; set @[email protected]+'<TR>'; set @[email protected]+'<TD>'; set @[email protected]+'№ p/p'; set @[email protected]+'</TD>'; set @[email protected]+'<TD>'; set @[email protected]+'GUID'; set @[email protected]+'</TD>'; set @[email protected]+'<TD>'; set @[email protected]+'TASK'; set @[email protected]+'</TD>'; set @[email protected]+'<TD>'; set @[email protected]+'STATUS'; set @[email protected]+'</TD>'; set @[email protected]+'<TD>'; set @[email protected]+'DATE AND TIME'; set @[email protected]+'</TD>'; set @[email protected]+'<TD>'; set @[email protected]+'DURATION'; set @[email protected]+'</TD>'; set @[email protected]+'<TD>'; set @[email protected]+'MESSAGE'; set @[email protected]+'</TD>'; set @[email protected]+'<TD>'; set @[email protected]+'SERVER'; set @[email protected]+'</TD>'; set @[email protected]+'</TR>'; while((select top 1 1 from @tbl)>0) begin set @[email protected]+'<TR>'; select top 1 @ID = [ID] ,@Job_GUID = Job_GUID ,@Job_Name = Job_Name ,@LastFinishRunState = LastFinishRunState ,@LastDateTime = LastDateTime ,@LastRunDurationString = LastRunDurationString ,@LastOutcomeMessage = LastOutcomeMessage ,@Server = [Server] from @tbl order by LastRunDurationInt desc; set @[email protected]+'<TD>'; set @[email protected]+cast(@ID as nvarchar(max)); set @[email protected]+'</TD>'; set @[email protected]+'<TD>'; set @[email protected]+cast(@Job_GUID as nvarchar(255)); set @[email protected]+'</TD>'; set @[email protected]+'<TD>'; set @[email protected]+coalesce(@Job_Name,''); set @[email protected]+'</TD>'; set @[email protected]+'<TD>'; set @[email protected]+coalesce(@LastFinishRunState,''); set @[email protected]+'</TD>'; set @[email protected]+'<TD>'; set @[email protected]+rep.GetDateFormat(@LastDateTime, default)+' '+rep.GetTimeFormat(@LastDateTime, default);--cast(@InsertDate as nvarchar(max)); set @[email protected]+'</TD>'; set @[email protected]+'<TD>'; set @[email protected]+coalesce(@LastRunDurationString,''); set @[email protected]+'</TD>'; set @[email protected]+'<TD>'; set @[email protected]+coalesce(@LastOutcomeMessage, ''); set @[email protected]+'</TD>'; set @[email protected]+'<TD>'; set @[email protected]+coalesce(@Server, ''); set @[email protected]+'</TD>'; delete from @tbl where [email protected]; set @[email protected]+'</TR>'; end set @[email protected]+'</TABLE>'; end else begin set @body='The tasks, that have failed with an error or that have been executed for more than 30 seconds, have not been found'; end set @[email protected]+'<br><br>For the detailed information, please refer to the table DATABASE_NAME.srv.ShortInfoRunJobs'; END GOदेखें।
यह संग्रहीत कार्यविधि पूर्ण किए गए कार्यों के बारे में एक HTML-रिपोर्ट उत्पन्न करती है जिसे 30 सेकंड के लिए निष्पादित किया गया है या जो पूरा होने में विफल रहा है।
परिणाम
इस लेख में, मैंने SQL सर्वर एजेंट में पूर्ण किए गए कार्यों के बारे में दैनिक स्वचालित डेटा संग्रह के कार्यान्वयन के एक विशेष उदाहरण की खोज की है। यह जानकारी उन कार्यों को निर्धारित करने में मदद करती है जिन्हें लंबे समय से निष्पादित किया गया है या त्रुटि के साथ पूरा किया गया है। यह एक प्रशासक को भविष्य में ऐसी गलतियों से बचने के लिए उपाय करने की अनुमति देता है। उदाहरण के लिए, कार्य को तेजी से चलाना या निर्दिष्ट कार्य के लिए अधिकतम समय निर्धारित करना संभव है।
यह समाधान बैकअप से संबंधित मुद्दों की निगरानी में भी मदद करता है। फिर भी, हम इस पर बाद में चर्चा करेंगे, क्योंकि दिन में एक बार महत्वपूर्ण कार्यों के बारे में सूचित करना पर्याप्त नहीं है। त्रुटि ठीक होने तक उनके बारे में तुरंत और नियमित रूप से ईमेल करना आवश्यक है।
यदि आपको कई सर्वरों से डेटा का चयन करने की आवश्यकता है, तो परिणामों को संयोजित करना और उन्हें `एक ईमेल के माध्यम से भेजना संभव है।
संदर्भ:
» sysjobs
» sysjobservers
आगे पढ़ना:
MS SQL सर्वर में डेटाबेस स्कीमा परिवर्तन का स्वचालित डेटा संग्रह
स्वचालित डेटा संग्रह:MS SQL सर्वर में डेटाबेस फ़ाइलें और तार्किक ड्राइव
MS SQL सर्वर में डेटाबेस मेल सूचनाओं को कॉन्फ़िगर करना