यदि यह प्राथमिक प्रतिकृति पर निष्पादित नहीं है, तो नौकरी समाप्त करें
इस स्थिति के लिए, दोनों सर्वरों पर प्रत्येक कार्य को चरण 1 के रूप में निम्न दो कोड स्निपेट की आवश्यकता होती है:
समूह नाम से जांचें:
IF master.dbo.svf_AgReplicaState('my_group_name')=0
raiserror ('This is not the primary replica.',2,1)
डेटाबेस नाम से जांचें:
IF master.dbo.svf_AgReplicaState('my_db_name')=0
raiserror ('This is not the primary replica.',2,1)
यदि आप इस दूसरे का उपयोग करते हैं, तो सिस्टम डेटाबेस से सावधान रहें - हालांकि परिभाषा के अनुसार वे किसी भी उपलब्धता समूह का हिस्सा नहीं हो सकते हैं, इसलिए यह उन लोगों के लिए हमेशा विफल रहेगा।
ये दोनों व्यवस्थापक उपयोगकर्ताओं के लिए बॉक्स से बाहर काम करते हैं। गैर-व्यवस्थापक उपयोगकर्ताओं के लिए, आपको अतिरिक्त अनुमतियाँ डालनी होंगी, उनमें से एक यहाँ सुझाई गई है :
GRANT VIEW SERVER STATE TO [user];
GRANT VIEW ANY DEFINITION TO [user];
यदि आप इस पहले चरण पर सफलता की रिपोर्ट करने में सफलता की विफलता के लिए विफलता की कार्रवाई निर्धारित करते हैं , तो आपको मुख्य लॉग के बदले वे जॉब लॉग इन बदसूरत रेड क्रॉस के संकेत नहीं देंगे।
हमारे अनुभव से, यह आदर्श नहीं है। हमने पहली बार इस दृष्टिकोण को अपनाया था, लेकिन नौकरियों को खोजने के बारे में जल्दी से खो दिया ट्रैक जो वास्तव में एक समस्या थी, क्योंकि सभी माध्यमिक प्रतिकृति नौकरियों ने चेतावनी संदेशों के साथ नौकरी लॉग को बंद कर दिया था।
इसके बाद हम जो गए:
प्रॉक्सी नौकरियां
यदि आप इस अवधारणा को अपनाते हैं, तो आपको वास्तव में प्रति कार्य दो कार्य करने होंगे जो आप करना चाहते हैं। पहला "प्रॉक्सी जॉब" है जो यह जांचता है कि क्या इसे प्राथमिक प्रतिकृति पर निष्पादित किया जा रहा है। यदि ऐसा है, तो यह "कार्यकर्ता नौकरी" शुरू करता है, यदि नहीं, तो यह केवल चेतावनी या त्रुटि संदेशों के साथ लॉग को बंद किए बिना इनायत से समाप्त होता है।
जबकि मुझे व्यक्तिगत रूप से हर सर्वर पर प्रति कार्य दो नौकरियां होने का विचार पसंद नहीं है, मुझे लगता है कि यह निश्चित रूप से अधिक बनाए रखने योग्य है, और आपको नौकरी की सफलता की सफलता के लिए कदम की विफलता कार्रवाई को सेट करने की आवश्यकता नहीं है , जो थोड़ा सा है अजीब।
नौकरियों के लिए, हमने एक नामकरण योजना को अपनाया। प्रॉक्सी जॉब को ही कहा जाता है {put jobname here}
। कर्मी ने कार्य कहा जाता है {put jobname here} worker
। यह प्रॉक्सी से कार्यकर्ता की नौकरी को स्वचालित करना संभव बनाता है। ऐसा करने के लिए, मैंने निम्नलिखित प्रक्रिया को दोनों मास्टर dbs में जोड़ा:
CREATE procedure [dbo].[procStartWorkerJob](@jobId uniqueidentifier, @availabilityGroup sysname, @postfix sysname = ' worker') as
declare @name sysname
if dbo.svf_AgReplicaState(@availabilityGroup)=0
print 'This is not the primary replica.'
else begin
SELECT @name = name FROM msdb.dbo.sysjobs where job_id = @jobId
set @name = @name + @postfix
if exists(select name from msdb.dbo.sysjobs where name = @name)
exec msdb.dbo.sp_start_job @name
else begin
set @name = 'Job '''+@name+''' not found.'
raiserror (@name ,2,1)
end
end
GO
यह svf_AgReplicaState
ऊपर दिखाए गए फ़ंक्शन का उपयोग करता है , आप आसानी से बदल सकते हैं कि दूसरे फ़ंक्शन को कॉल करके डेटाबेस के नाम का उपयोग करके जांच करें।
प्रॉक्सी जॉब के एकमात्र चरण के भीतर, आप इसे इस तरह कहते हैं:
exec procStartWorkerJob $(ESCAPE_NONE(JOBID)), '{my_group_name}'
यह वर्तमान नौकरी की आईडी पर प्राप्त करने के लिए यहां और यहां दिखाए गए अनुसार टोकन का उपयोग करता है । प्रक्रिया फिर msdb से वर्तमान नौकरी का नाम प्राप्त करती है, worker
इसे संलग्न करती है और कार्यकर्ता नौकरी का उपयोग करके शुरू करती है sp_start_job
।
हालांकि यह अभी भी आदर्श नहीं है, लेकिन यह पिछले विकल्पों की तुलना में जॉब लॉग को अधिक सुव्यवस्थित और बनाए रखता है। इसके अलावा, आप हमेशा एक sysadmin उपयोगकर्ता के साथ प्रॉक्सी काम चला सकते हैं, इसलिए किसी भी अतिरिक्त अनुमतियों को जोड़ना आवश्यक नहीं है।