কাজটিকে প্রাথমিক প্রতিরূপে চালিত না করা হলে এটি সমাপ্ত করুন
এই ক্ষেত্রে, উভয় সার্ভারে প্রতিটি কাজের জন্য পদক্ষেপ 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
। প্রক্সি থেকে কর্মী কাজ শুরু করার ফলে এটি স্বয়ংক্রিয় করা সম্ভব করে। এটি করার জন্য, আমি উভয় মাস্টার ডিবিএসের সাথে নিম্নলিখিত পদ্ধতিটি যুক্ত করেছি:
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}'
এটি বর্তমান কাজের আইডি পেতে এখানে এবং এখানে প্রদর্শিত হিসাবে টোকেনগুলি ব্যবহার করে । প্রক্রিয়াটি এমএসডিবি থেকে বর্তমান কাজের নাম পায়, worker
এতে যুক্ত হয় এবং ব্যবহারকারীর কাজটি শুরু করে sp_start_job
।
যদিও এটি এখনও আদর্শ নয়, এটি কাজের লগগুলি আগের বিকল্পের চেয়ে আরও পরিপাটি এবং রক্ষণাবেক্ষণযোগ্য রাখে। এছাড়াও, আপনি সর্বদা সিসাদমিন ব্যবহারকারীর সাথে প্রক্সি কাজ চালিয়ে যেতে পারেন, তাই কোনও অতিরিক্ত অনুমতি যুক্ত করার প্রয়োজন নেই।