जब नौकरी विफल होती है तो मुझे SQL सर्वर ईमेल त्रुटि विवरण कैसे दे सकता है?


14

SQL सर्वर आपको विफल होने पर ईमेल अलर्ट भेजने के लिए नौकरी कॉन्फ़िगर करने देता है। यह आपकी नौकरियों की निगरानी करने का एक सरल और प्रभावी तरीका है। हालांकि, इन अलर्टों में कोई विवरण शामिल नहीं है - बस एक सफलता या विफलता नोटिस।

यदि कोई नौकरी विफल हो जाती है, तो यह एक विशिष्ट अलर्ट ईमेल जैसा दिखेगा:

JOB RUN:        'DBA - Consistency Check Databases' was run on 8/14/2011 at 12:00:04 AM
DURATION:       0 hours, 0 minutes, 0 seconds
STATUS:         Failed
MESSAGES:       The job failed.  The Job was invoked by Schedule 2 (Nightly Before 
                Backup 12AM).  The last step to run was step 1 (Check Databases).

विफलता का कारण निर्धारित करने के लिए, आपको SQL सर्वर प्रबंधन स्टूडियो में उदाहरण के लिए नेविगेट करना होगा, नौकरी ढूंढनी होगी और इसके निष्पादन इतिहास को देखना होगा। एक बड़े वातावरण में लगातार ऐसा करना एक दर्द हो सकता है।

आदर्श अलर्ट ईमेल में विफलता का कारण शामिल होगा और आपको समाधान पर काम करने के लिए सीधे जाना होगा।

मैं इस समस्या के समाधान से परिचित हूं । क्या किसी को इसके साथ कोई अनुभव है? इसकी कमियां हैं:

  1. आपको हर काम के लिए एक नया कदम जोड़ना होगा, और
  2. आपको प्रार्थना करनी है कि कोई भी चेतावनी खरीद को गड़बड़ न करे, spDBA_job_notification

क्या कोई बेहतर समाधान लेकर आया है?

जवाबों:


10

कुछ आप कर सकते हैं कि सिर्फ एक विचार है, विचारों को फेंक ...

एक एकल नौकरी बनाएं जो समय-समय पर एमएसडीबी में नौकरी की तालिका की जांच करता है कि क्या कोई भी नौकरी विफल होने के रूप में दिखाई देती है, जो कि एक अच्छी टी-एसक्यूएल क्वेरी के साथ की जा सकती है । तब आप sysjobsteps तालिका में जा सकते हैं और देख सकते हैं कि क्या आउटपुट लॉग काम के लिए सेट है। एक संग्रहीत कार्यविधि है कि उस फ़ाइल को संलग्न करने के लिए एक ईमेल भेजें। आप बिल्कुल देख पाएंगे कि सर्वर को टच किए बिना शुरुआत से लेकर विफलता तक क्या काम किया।

फिर पॉवरशेल स्क्रिप्ट में त्रुटियों के लिए ईवेंट लॉग की जांच कर सकता है। यह आपको एक बहुत अच्छा सा फिल्टर करने की अनुमति देता है कि आप क्या संदेश प्रकार ढूंढ रहे हैं। आप समय-समय पर चलाने के लिए SQL एजेंट नौकरी के रूप में सेट कर सकते हैं। फिर पॉवरशेल लिपि में संदेश भेजने के लिए ईमेल cmdlet का उपयोग करें यदि यह एक मिल जाए।

दूर के विचारों को यहाँ लाया, बस कुछ के बारे में मैंने सोचा।


3

मुझे पूर्वोक्त विचार के साथ अनुभव है । यह अच्छा है, लेकिन शॉन ने कहा कि कुछ करना बेहतर होगा।

हमने जो किया वह नौकरी करने के लिए था जो हर 5 मिनट में चलता है और नौकरी की असफलताओं के बारे में MSDB तालिकाओं को स्कैन करता है। प्रत्येक काम के लिए जिसे हमें असफलता मिली है वह SP spDBA_job_notification चलाएगा जिसमें स्वयं की ID होगी, इसलिए SP त्रुटियों के लिए MSDB इतिहास के चरणों को स्कैन करेगा और उन सभी को ईमेल करेगा। एसपी प्रलेखन से: "संग्रहीत कार्यविधि उस नौकरी के लिए सबसे हाल के त्रुटि संदेश के लिए एमएसडीबी एजेंट तालिकाओं को क्वेरी करने के लिए नौकरी आईडी का उपयोग करती है।"

इसलिए सिर्फ हर काम को बदलने के बजाय, एक एकल बनाएं जो सभी करता है; ;-)

एक अन्य विचार यह है कि त्रुटियों या असफलता के मामले में विंडोज इवेंट व्यूअर को लिखने के लिए सभी नौकरियों को सेट करना है और वहां से विस्तारित proc xp_ReadErrorLog या एक स्वचालित उपकरण के साथ पढ़ना है , यदि आपके पास पहले से ही आपके नेटवर्क में है। उदाहरण के लिए, हम किसी भी सिस्टम के मुद्दों की जाँच करने के लिए HPOV का उपयोग करते हैं और सभी ईवेंट व्यूअर त्रुटियों (किसी भी कस्टम जॉब या प्रक्रिया की कोई आवश्यकता नहीं) के लिए एक सरल चेतावनी कॉन्फ़िगर कर सकते हैं।


2

इसे आजमाएं और TSQL में आवश्यकतानुसार अपने चर में प्लग करें। यहाँ कुंजी यह है कि इसे प्रत्येक व्यक्ति SQL एजेंट नौकरी के अंतिम चरण के रूप में रखा जाए, लेकिन इसके बाद के प्रत्येक चरण को NEXT STEP में जाने की आवश्यकता है, चाहे वह विफल हो या SUCCESS ... मेरे लिए अधिकांश भाग के लिए ठीक काम करता है लेकिन कृपया आपके द्वारा चलाए जा रहे किसी भी मुद्दे की रिपोर्ट करें। हम SQL Server 2008 R2 पर हैं, इसलिए यह वह जगह है जहां इसका उपयोग किया गया है जहां मैंने इसे वर्तमान में सेट किया है।

SELECT  step_name, message
FROM    msdb.dbo.sysjobhistory
WHERE   instance_id > COALESCE((SELECT MAX(instance_id) FROM msdb.dbo.sysjobhistory
                                WHERE job_id = $(ESCAPE_SQUOTE(JOBID)) AND step_id = 0), 0)
        AND job_id = $(ESCAPE_SQUOTE(JOBID))
        AND run_status <> 1 -- success

IF      @@ROWCOUNT <> 0
BEGIN
        RAISERROR('*** SQL Agent Job Prior Step Failure Occurred ***', 16, 1)

DECLARE @job_name NVARCHAR(256) = (SELECT name FROM msdb.dbo.sysjobs WHERE job_id = $(ESCAPE_SQUOTE(JOBID)))
DECLARE @email_profile NVARCHAR(256) = 'SQLServer Alerts'
DECLARE @emailrecipients NVARCHAR(500) = 'EmailAddr@email.com'
DECLARE @subject NVARCHAR(MAX) = 'SQL Server Agent Job Failure Report: ' + @@SERVERNAME
DECLARE @msgbodynontable NVARCHAR(MAX) = 'SQL Server Agent Job Failure Report For: "' + @job_name + '"'

--Dump report data to a temp table to be put into XML formatted HTML table to email out
SELECT sjh.[server]
    ,sj.NAME
    ,sjh.step_id
    ,sjh.[message]
    ,sjh.run_date
    ,sjh.run_time
INTO #TempJobFailRpt
FROM msdb..sysjobhistory sjh
INNER JOIN msdb..sysjobs sj ON (sj.job_id = sjh.job_id)
WHERE run_date = convert(INT, convert(VARCHAR(8), getdate(), 112))
    AND run_status != 4 -- Do not show status of 4 meaning in progress steps
    AND run_status != 1 -- Do not show status of 1 meaning success
    AND NAME = @job_name
ORDER BY run_date

IF EXISTS (
        SELECT *
        FROM #TempJobFailRpt
        )
BEGIN

-----Build report to HTML formatted email using FOR XML PATH
DECLARE @tableHTML NVARCHAR(MAX) = '
<html>
<body>
    <H1>' + @msgbodynontable + '</H1>
        <table border="1" style=
        "background-color: #C0C0C0; border-collapse: collapse">
        <caption style="font-weight: bold">
            ****** 
            Failure occurred in the SQL Agent job named: ''' + @job_name + ''' in at least one of the steps. 
            Below is the job failure history detail for ALL runs of this job today without needing to connect to SSMS to check.
            ******
        </caption>

<tr>
    <th style="width:25%; text-decoration: underline">SQL Instance</th>
    <th style="text-decoration: underline">Job Name</th>
    <th style="text-decoration: underline">Step</th>
    <th style="text-decoration: underline">Message Text</th>
    <th style="text-decoration: underline">Job Run Date</th>
    <th style="text-decoration: underline">Job Run Time</th>
</tr>' + CAST((
            SELECT td = [server]
                ,''
                ,td = NAME
                ,''
                ,td = step_id
                ,''
                ,td = [message]
                ,''
                ,td = run_date
                ,''
                ,td = run_time
            FROM #TempJobFailRpt a
            ORDER BY run_date
            FOR XML PATH('tr')
                ,TYPE
                ,ELEMENTS XSINIL
            ) AS NVARCHAR(MAX)) + '
    </table>
</body>
</html>';

EXEC msdb.dbo.sp_send_dbmail @profile_name = @email_profile
    ,@recipients = @emailrecipients
    ,@subject = @subject
    ,@body = @tableHTML
    ,@body_format = 'HTML'

--Drop Temp table
    DROP TABLE #TempJobFailRpt
END
ELSE
BEGIN
    PRINT '*** No Records Generated ***' 
    DROP TABLE #TempJobFailRpt
END
END

मुझे पता है कि यह एक पुराना धागा है, लेकिन @Crazy इवान द्वारा समाधान एक उपचार का काम करता है - मैं पुष्टि कर सकता हूं कि यह SQL Server 2012 पर काम करता है
माइकल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.