কোনও কাজ ব্যর্থ হয়ে গেলে কীভাবে এসকিউএল সার্ভার আমাকে ত্রুটির বিবরণ ইমেল করতে পারি?


14

এসকিউএল সার্ভার আপনাকে ব্যর্থ হলে ইমেল সতর্কতা প্রেরণের জন্য কোনও কাজ কনফিগার করতে দেয়। এটি আপনার কাজ নিরীক্ষণের একটি সহজ এবং কার্যকর উপায়। তবে এই সতর্কতাগুলিতে কোনও বিবরণ অন্তর্ভুক্ত নয় - কেবল একটি সাফল্য বা ব্যর্থতার বিজ্ঞপ্তি।

যদি কোনও কাজ ব্যর্থ হয় তবে সাধারণ সতর্কতা ইমেলটি এটির মতো দেখায়:

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).

ব্যর্থতার কারণ নির্ধারণ করতে, আপনাকে এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওতে উদাহরণটি নেভিগেট করতে হবে, কাজটি সন্ধান করতে হবে এবং এর কার্যকরকরণের ইতিহাসটি দেখতে হবে। একটি বৃহত পরিবেশে এটি নিয়মিত এটি করতে ব্যথা হতে পারে।

আদর্শ সতর্কতা ইমেলটি ব্যর্থতার কারণটি সামনে উপস্থিত করে আপনাকে সমাধানের জন্য সরাসরি কাজ করতে দেয়।

আমি এই সমস্যার সমাধানের সাথে পরিচিত । কারও সাথে এর কোন অভিজ্ঞতা আছে? এর ত্রুটিগুলি হ'ল:

  1. আপনার প্রতিটি কাজই আপনাকে নতুন পদক্ষেপ যুক্ত করতে হবে এবং
  2. আপনাকে প্রার্থনা করতে হবে যে কেউ যেন সতর্কতা অবলম্বন করতে না পারে, spDBA_job_notification

কেউ কি আরও ভাল সমাধান নিয়ে এসেছেন?

উত্তর:


10

আপনি যা কিছু করতে পারেন তা কেবল একটি চিন্তা, ধারণাগুলি ছড়িয়ে দেওয়া ...

একটি একক কাজ তৈরি করুন যা পর্যায়ক্রমে এমএসডিবিতে কাজের টেবিলটি পরীক্ষা করে দেখায় যে কোনও কাজ ব্যর্থ হিসাবে প্রদর্শিত হচ্ছে কিনা, এটি একটি ভাল টি-এসকিউএল কোয়েরি দিয়ে সম্পন্ন করা যেতে পারে । তারপরে আপনি সিসজবস্টেপস টেবিলে যেতে পারেন এবং দেখবেন যে কাজের জন্য আউটপুট লগ সেট করা আছে কিনা। একটি সঞ্চিত পদ্ধতিতে ফাইলটি সংযুক্ত করে একটি ইমেল প্রেরণ করুন। আপনি সার্ভার স্পর্শ না করে কাজটি শুরু থেকে ব্যর্থতা অবধি ঠিক কী করতে পারবেন তা দেখতে সক্ষম হবেন।

তারপরে পাওয়ারশেল স্ক্রিপ্টটিতে ত্রুটিগুলির জন্য ইভেন্টের লগটি পরীক্ষা করতে পারে। আপনি কী বার্তাগুলি ঠিক খুঁজছেন তা পেতে এটি আপনাকে বেশ ভাল বিট ফিল্টার করতে দেয়। আপনি এটি সময়ে সময়ে চালানোর জন্য এসকিউএল এজেন্ট কাজ হিসাবে সেট আপ করতে পারেন। তারপরে পাওয়ারশেল স্ক্রিপ্টে ইমেলটি সিএমডিলেট ব্যবহার করে যদি কোনও বার্তা পাওয়া যায় তবে তা খুঁজে পাওয়া যায়।

এখানে অনেকগুলি ধারণা পাওয়া গেছে, কেবলমাত্র আমি কিছু সম্পর্কে ভাবলাম thought


3

পূর্বোক্ত ধারণাটি নিয়ে আমার অভিজ্ঞতা আছে । এটি ভাল, তবে শন যেমন বলেছিল তেমন কিছু করা আরও ভাল ধারণা।

আমরা যা করেছি তা হ'ল একটি কাজ যা প্রতি 5 মিনিটে চলে এবং কাজের ব্যর্থতা সম্পর্কে এমএসডিবি টেবিলগুলি স্ক্যান করে। প্রতিটি কাজের ক্ষেত্রে যার ব্যর্থতা ছিল আমরা তার নিজস্ব আইডি দিয়ে এসপি এসপিডিবিএ_জব_নোটিকেশনটি চালাতাম , সুতরাং এসপি ত্রুটিগুলির জন্য এমএসডিবি ইতিহাসের পদক্ষেপগুলি স্ক্যান করবে এবং সেগুলি সমস্ত ইমেল করবে। এসপি ডকুমেন্টেশন থেকে: "সঞ্চিত পদ্ধতিটি সেই কাজের জন্য অতি সাম্প্রতিক ত্রুটি বার্তার জন্য এমএসডিবি এজেন্ট টেবিলগুলি অনুসন্ধান করতে জব আইডি ব্যবহার করে।"

সুতরাং কেবলমাত্র প্রতিটি কাজ পরিবর্তন করার পরিবর্তে, এমন একটি একক তৈরি করুন যা সমস্ত কাজ করে ;-)।

অন্য ধারণাটি হ'ল ত্রুটি / ব্যর্থতার ক্ষেত্রে উইন্ডোজ ইভেন্ট ভিউয়ারের কাছে লিখতে সমস্ত কাজ সেট করা এবং সেখান থেকে প্রসারিত প্রোপ xp_ReadErrorLog বা একটি স্বয়ংক্রিয় সরঞ্জাম দিয়ে পড়া, যদি আপনার নেটওয়ার্কটিতে ইতিমধ্যে এটি থাকে। উদাহরণস্বরূপ আমরা কোনও সিস্টেমের সমস্যাগুলি যাচাই করতে এইচপিওভি ব্যবহার করেছি এবং সমস্ত ইভেন্ট দর্শকের ত্রুটির জন্য কোনও সাধারণ সতর্কতা কনফিগার করতে পারি (কোনও কাস্টম কাজ বা পদ্ধতির প্রয়োজন নেই)।


2

এটি ব্যবহার করে দেখুন টিএসকিউএল-তে প্রয়োজনীয় হিসাবে আপনার ভেরিয়েবলগুলি প্লাগ ইন করুন। এখানে মূল কীটি হ'ল এটি প্রতিটি স্বতন্ত্র এসকিউএল এজেন্ট কাজের একেবারে শেষ ধাপ হিসাবে রাখে তবে উপরের প্রতিটি কাজের পদক্ষেপে এটি ব্যর্থ বা সাফল্য কিনা পরবর্তী পদক্ষেপে যেতে হবে ... বেশিরভাগ অংশের জন্যই আমার পক্ষে কাজ করে তবে দয়া করে দয়া করে আপনি যে কোনও সমস্যা চালিয়ে যাচ্ছেন তা রিপোর্ট করুন। আমরা এসকিউএল সার্ভার ২০০৮ আর 2 এ রয়েছি তাই এটি বর্তমানে এটি সেট আপ করার জায়গায় ব্যবহার করা হয়েছে।

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

আমি জানি এটি একটি পুরানো থ্রেড, তবে @ ক্রেজি ইভানের সমাধানটি একটি ট্রিট কাজ করে - আমি নিশ্চিত করতে পারি যে এটি এসকিউএল সার্ভারে কাজ করে 2012
মাইকেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.