এসকিউএল সার্ভার এজেন্ট কাজ এবং উপলভ্যতা গোষ্ঠী


37

আমি এসকিউএল সার্ভার 2012 প্রাপ্যতা গ্রুপগুলিতে নির্ধারিত এসকিউএল সার্ভার এজেন্ট কাজের সাথে সম্পর্কিত সর্বোত্তম অনুশীলনের সন্ধান করছি। সম্ভবত আমি কিছু মিস করেছি, তবে বর্তমান অবস্থায় আমি অনুভব করি যে এসকিউএল সার্ভার এজেন্ট সত্যিই এই দুর্দান্ত এসকিউএল ২০১২ বৈশিষ্ট্যের সাথে সংহত নয়।

নোড সুইচ সম্পর্কে আমি কীভাবে একটি নির্ধারিত এসকিউএল এজেন্ট কাজটি করতে পারি? উদাহরণস্বরূপ আমার প্রাথমিক নোডে একটি কাজ চলছে যা প্রতি ঘন্টায় ডেটা লোড করে। এখন যদি প্রাথমিকটি নীচে চলে যায় তবে আমি এখন মাধ্যমিকের কাজটি কীভাবে সক্রিয় করতে পারি যা এখন প্রাথমিক হয়ে যায়?

আমি যদি সর্বদা মাধ্যমিকটিতে কাজটি নির্ধারণ করি তবে এটি ব্যর্থ হয় কারণ তখন মাধ্যমিকটি কেবল পঠনযোগ্য।


উত্তর:


40

আপনার এসকিউএল সার্ভার এজেন্ট কাজের মধ্যে, যদি বর্তমান দৃষ্টান্তটি আপনার প্রাপ্যতা গোষ্ঠীর জন্য সন্ধান করছেন সেই বিশেষ ভূমিকাটি সরবরাহ করছে কিনা তা পরীক্ষা করার জন্য কিছু শর্তযুক্ত যুক্তি রাখুন:

if (select
        ars.role_desc
    from sys.dm_hadr_availability_replica_states ars
    inner join sys.availability_groups ag
    on ars.group_id = ag.group_id
    where ag.name = 'YourAvailabilityGroupName'
    and ars.is_local = 1) = 'PRIMARY'
begin
    -- this server is the primary replica, do something here
end
else
begin
    -- this server is not the primary replica, (optional) do something here
end

এইগুলি হ'ল স্থানীয় প্রতিরূপের বর্তমান ভূমিকাটি টানতে পারে, এবং যদি এটি PRIMARYভূমিকায় থাকে তবে আপনি যে কাজটি করতে চান তা যদি এটি প্রাথমিক প্রতিরূপ হয় তবে আপনি তা করতে পারেন। ELSEব্লক ঐচ্ছিক, কিন্তু এটা সম্ভব যুক্তিবিজ্ঞান হ্যান্ডেলিংয়ের জন্য, যদি আপনার স্থানীয় প্রতিরূপ প্রাথমিক নয় আছে।

অবশ্যই, 'YourAvailabilityGroupName'উপরের ক্যোয়ারীতে আপনার প্রকৃত প্রাপ্যতা গোষ্ঠীর নাম পরিবর্তন করুন।

ব্যর্থতা ক্লাস্টারের উদাহরণগুলির সাথে প্রাপ্যতা গোষ্ঠীগুলিকে বিভ্রান্ত করবেন না। উদাহরণটি প্রদত্ত প্রাপ্যতা গোষ্ঠীর প্রাথমিক বা গৌণ প্রতিরূপ কিনা এসকিউএল সার্ভার এজেন্ট জব ইত্যাদির মতো সার্ভার-স্তরীয় বস্তুগুলিকে প্রভাবিত করে না।


14

প্রতি চাকরির ভিত্তিতে এটি করার পরিবর্তে (চালিয়ে যাওয়ার সিদ্ধান্ত নেওয়ার আগে সার্ভারের অবস্থার জন্য প্রতিটি কাজ পরীক্ষা করা), সার্ভারটি কী অবস্থায় আছে তা পরীক্ষা করার জন্য আমি উভয় সার্ভারে চলমান একটি কাজ তৈরি করেছি।

  • যদি এটি প্রাথমিক হয়, তবে এজিতে ডেটাবেসকে লক্ষ্য করে একটি পদক্ষেপ রয়েছে এমন কোনও কাজ সক্ষম করুন।
  • সার্ভারটি যদি মাধ্যমিক হয় তবে এজি-তে কোনও ডাটাবেস লক্ষ্য করে কোনও কাজ অক্ষম করুন।

এই পদ্ধতির বিভিন্ন জিনিস সরবরাহ করে

  • এটি এমন সার্ভারগুলিতে কাজ করে যেখানে এজিতে কোনও ডাটাবেস নেই (বা ডিজিজের / এজি-র বাইরে মিক্স)
  • যে কোনও নতুন চাকরি তৈরি করতে পারে এবং ডিবি কোনও এজি-তে রয়েছে কিনা তা নিয়ে চিন্তা করতে হবে না (যদিও তাদের অন্যান্য কাজটি অন্য সার্ভারে যুক্ত করতে হবে)
  • প্রতিটি কাজকে একটি ব্যর্থতা ইমেল থাকতে দেয় যা কার্যকর থাকে (আপনার সমস্ত কাজের ক্ষেত্রেই ব্যর্থতার ইমেল রয়েছে?)
  • কোনও কাজের ইতিহাস দেখার সময়, আপনি আসলে দেখতে পেলেন যে কাজটি আসলে দৌড়েছে এবং কিছু করেছে (এটি প্রাথমিক) এটি সফলতার দীর্ঘ তালিকা না দেখে যা আসলে কিছুই চালায় না (মাধ্যমিকটিতে)

স্ক্রিপ্ট নীচের ক্ষেত্রে ডাটাবেস পরীক্ষা করে যদি এই ডাটাবেসটি একটি উপলভ্যতা গ্রুপে থাকে তবে স্ক্রিপ্টটি কিছু পদক্ষেপ নেবে

এই প্রোক প্রতিটি সার্ভারে প্রতি 15 মিনিটে কার্যকর করা হয়। (কাজটি কেন অক্ষম করা হয়েছে তা লোকদের জানাতে একটি মন্তব্য সংযোজন করার যুক্ত বোনাস রয়েছে)

/*
    This proc goes through all SQL Server agent jobs and finds any that refer to a database taking part in the availability Group 
    It will then enable/disable the job dependant on whether the server is the primary replica or not   
        Primary Replica = enable job
    It will also add a comment to the job indicating the job was updated by this proc
*/
CREATE PROCEDURE dbo.sp_HADRAgentJobFailover (@AGname varchar(200) = 'AG01' )
AS 

DECLARE @SQL NVARCHAR(MAX)

;WITH DBinAG AS (  -- This finds all databases in the AG and determines whether Jobs targeting these DB's should be turned on (which is the same for all db's in the AG)
SELECT  distinct
        runJobs = CASE WHEN role_desc = 'Primary' THEN 1 ELSE 0 END   --If this is the primary, then yes we want to run the jobs
        ,dbname = db.name
        ,JobDescription = CASE WHEN hars.role_desc = 'Primary'  -- Add the reason for the changing the state to the Jobs description
                THEN '~~~ [Enabled] using automated process (DBA_tools.dbo.sp_HADRAgentJobFailover) looking for jobs running against Primary Replica AG ~~~ '
                ELSE '~~~ [Diabled] using Automated process (DBA_tools.dbo.sp_HADRAgentJobFailover) because the job cant run on READ-ONLY Replica AG~~~ ' END 
FROM sys.dm_hadr_availability_replica_states hars
INNER JOIN sys.availability_groups ag ON ag.group_id = hars.group_id
INNER JOIN sys.Databases db ON  db.replica_id = hars.replica_id
WHERE is_local = 1
AND ag.Name = @AGname
) 

SELECT @SQL = (
SELECT DISTINCT N'exec msdb..sp_update_job @job_name = ''' + j.name + ''', @enabled = ' + CAST(d.runJobs AS VARCHAR) 
                + ',@description = ''' 
                + CASE WHEN j.description = 'No description available.' THEN JobDescription -- if there is no description just add our JobDescription
                       WHEN PATINDEX('%~~~%~~~',j.description) = 0 THEN j.description + '    ' + JobDescription  -- If our JobDescription is NOT there, add it
                       WHEN PATINDEX('%~~~%~~~',j.description) > 0 THEN SUBSTRING(j.description,1,CHARINDEX('~~~',j.description)-1) + d.JobDescription  --Replace our part of the job description with what we are doing.
                       ELSE d.JobDescription  -- Should never reach here...
                    END 
                + ''';'
FROM msdb.dbo.sysjobs j
INNER JOIN msdb.dbo.sysjobsteps s
INNER JOIN DBinAG d ON d.DbName =s.database_name     
ON j.job_id = s.job_id
WHERE j.enabled != d.runJobs   -- Ensure we only actually update the job, if it needs to change
FOR XML PATH ('')
)
PRINT REPLACE(@SQL,';',CHAR(10))
EXEC sys.sp_executesql @SQL

এটি বোকা প্রমাণ নয়, তবে রাতারাতি বোঝা এবং প্রতি ঘন্টার কাজের জন্য এটি কাজটি করে।

এই প্রক্রিয়াটি একটি তফসিল চালানোর চেয়ে আরও ভাল, পরিবর্তে সতর্কতা 1480 (এজি ভূমিকা পরিবর্তন সতর্কতা) এর প্রতিক্রিয়া হিসাবে এটি চালান।


9

আমি এটি সম্পাদন করার জন্য দুটি ধারণা সম্পর্কে সচেতন।

পূর্বশর্ত: টমাস স্ট্রিংজারের উত্তরের ভিত্তিতে আমি আমাদের দুটি সার্ভারের মাস্টার ডিবিতে দুটি ফাংশন তৈরি করেছি:

CREATE FUNCTION [dbo].[svf_AgReplicaState](@availability_group_name sysname)
RETURNS bit
AS
BEGIN

if EXISTS(
    SELECT        ag.name
    FROM            sys.dm_hadr_availability_replica_states AS ars INNER JOIN
                             sys.availability_groups AS ag ON ars.group_id = ag.group_id
    WHERE        (ars.is_local = 1) AND (ars.role_desc = 'PRIMARY') AND (ag.name = @availability_group_name))

    RETURN 1

RETURN 0

END
GO

CREATE FUNCTION [dbo].[svf_DbReplicaState](@database_name sysname)
RETURNS bit
AS
BEGIN

IF EXISTS(
    SELECT        adc.database_name
    FROM            sys.dm_hadr_availability_replica_states AS ars INNER JOIN
                             sys.availability_databases_cluster AS adc ON ars.group_id = adc.group_id
    WHERE        (ars.is_local = 1) AND (ars.role_desc = 'PRIMARY') AND (adc.database_name = @database_name))

    RETURN 1
RETURN 0

END

GO


  1. কাজটিকে প্রাথমিক প্রতিরূপে চালিত না করা হলে এটি সমাপ্ত করুন

    এই ক্ষেত্রে, উভয় সার্ভারে প্রতিটি কাজের জন্য পদক্ষেপ 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];
    

    যদি আপনি এই প্রথম পদক্ষেপে সাফল্যের রিপোর্টিংয়ের ব্যর্থতার ক্রিয়াটি সেট করে থাকেন তবে আপনি চাকরীর লগকে কুৎসিত রেড ক্রস চিহ্নগুলিতে পূর্ণ পাবেন না, মূল কাজের জন্য তারা পরিবর্তে হলুদ সতর্কতার লক্ষণগুলিতে পরিণত হবে।

    আমাদের অভিজ্ঞতা থেকে, এটি আদর্শ নয়। আমরা প্রথমে এই পদ্ধতিটি অবলম্বন করেছি, তবে আসলেই কোনও সমস্যা ছিল এমন চাকরি সন্ধানের বিষয়ে দ্রুত ট্র্যাক হারিয়েছি কারণ সমস্ত মাধ্যমিক প্রতিরূপ কাজ সতর্কতা বার্তাগুলির সাথে চাকরির লগকে বিশৃঙ্খলা করে।

    আমরা তারপরে যা যা তা হ'ল:

  2. প্রক্সি কাজ

    আপনি যদি এই ধারণাটি অবলম্বন করেন তবে আপনাকে কার্য সম্পাদন করতে চান প্রতি কার্যত দুটি কাজ তৈরি করতে হবে। প্রথমটি হ'ল "প্রক্সি কাজ" যা প্রাথমিক প্রতিরূপে এটি কার্যকর করা হচ্ছে কিনা তা পরীক্ষা করে। যদি তা হয় তবে এটি "কর্মী কাজ" শুরু করে, যদি তা না হয় তবে সতর্কতা বা ত্রুটি বার্তাগুলির সাহায্যে লগটি ছড়িয়ে দেওয়া ছাড়াই এটি দুর্দান্তভাবে শেষ হয়।

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

    চাকরীর জন্য, আমরা একটি নামকরণ প্রকল্পটি গ্রহণ করেছি। প্রক্সি কাজের সবেমাত্র বলা হয় {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

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


3

যদি ডেটা লোড প্রক্রিয়াটি কোনও সাধারণ ক্যোয়ারী বা পদ্ধতি কল হয় তবে আপনি উভয় নোডে কাজ তৈরি করতে পারেন এবং ডেটা লোড প্রক্রিয়া চালানোর আগে এটির প্রাথমিক নোডটি ডাটাবেসের আপডেটযোগ্যতা সম্পত্তি ভিত্তিক কিনা তা নির্ধারণ করতে দিন:

IF (SELECT CONVERT(sysname,DatabasePropertyEx(DB_NAME(),'Updateability'))) != 'READ_ONLY'
BEGIN

-- Data Load code goes under here

END

1

একটি নতুন জব স্টেপ তৈরি করা সর্বদা ভাল যা এটি প্রাথমিক প্রতিলিপি কিনা তা যাচাই করে তা যদি চাকরীর মৃত্যুদন্ড কার্যকর করে চালিয়ে যায় তবে অন্যথায় যদি এটি মাধ্যমিক প্রতিলিপি হয় তবে কাজ বন্ধ করুন। কাজটি ব্যর্থ করবেন না অন্যথায় এটি অপ্রয়োজনীয় বিজ্ঞপ্তিগুলি প্রেরণ করতে থাকবে। পরিবর্তে কাজটি বন্ধ করুন যাতে এটি বাতিল হয়ে যায় এবং যখনই এই মাধ্যমিকের প্রতিরূপে কার্যকর করা হয় তখন কোনও বিজ্ঞপ্তি প্রেরণ করা হয় না।

নির্দিষ্ট কাজের জন্য প্রথম পদক্ষেপ যুক্ত করার জন্য স্ক্রিপ্টের নীচে।

স্ক্রিপ্টটি কার্যকর করার জন্য নোট:

  • 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' জব_আইডি দিয়ে প্রতিস্থাপন করুন
  • জব_নামের সাথে 'YYYYYYYYYYYYYYYYYYYYYYYYY' প্রতিস্থাপন করুন
  • যদি একাধিক উপলভ্যতা গোষ্ঠী থাকে তবে ভেরিয়েবল @AGNameToCheck_IfMoreThanSingleAG এজি নামটি সেট করুন যাতে এজিটির প্রতিরূপ অবস্থার জন্য যাচাই করা উচিত।

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

            USE [msdb]
            GO
            EXEC msdb.dbo.sp_add_jobstep @job_id=N'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', @step_name=N'CheckForSecondaryReplica', 
                    @step_id=1, 
                    @cmdexec_success_code=0, 
                    @on_success_action=3, 
                    @on_fail_action=2, 
                    @retry_attempts=0, 
                    @retry_interval=0, 
                    @os_run_priority=0, @subsystem=N'TSQL', 
                    @command=N'
            DECLARE @AGNameToCheck_IfMoreThanSingleAG VARCHAR(100)
            SET @AGNameToCheck_IfMoreThanSingleAG = ''AGName_IfMoreThanOneAG'' -- If there are Multiple AGs, then a single server can have Primary of one AG and Secondary of other. So Job creator has to define as to which AG needs to verified before the job is automatically run on Primary.
    
            DECLARE @NumberofAGs INT
            SELECT @NumberofAGs = COUNT(group_id) FROM sys.availability_groups ags
    
    
            IF(@NumberofAGs < 2)
                IF EXISTS(Select * FROM sys.dm_hadr_availability_replica_states hars WHERE role_desc = ''Secondary'' AND hars.is_local = 1)                 
                                    EXEC msdb.dbo.sp_stop_job N''YYYYYYYYYYYYYYYYYYYYYYYYYY'' ;
                                    --RAISERROR(''This is a Secondary Replica'',16,1)
    
            IF(@NumberofAGs >= 2)
                IF EXISTS(SELECT 1 FROM sys.availability_groups WHERE name = @AGNameToCheck_IfMoreThanSingleAG)
                BEGIN
                            IF EXISTS(Select * from  sys.availability_groups ag
                                            JOIN sys.dm_hadr_availability_replica_states hars
                                                        ON ag.group_id = hars.group_id
                                                        Where role_desc = ''Secondary''
                                                        AND hars.is_local = 1
                                                        AND ag.name = @AGNameToCheck_IfMoreThanSingleAG)
                            BEGIN
                                    EXEC msdb.dbo.sp_stop_job N''YYYYYYYYYYYYYYYYYYYYYYYYYY'' ;
                                    --RAISERROR(''This is a Secondary Replica'',16,1)
                            END
                END
                ELSE
                            BEGIN
                                    RAISERROR(''The Defined AG in the Variable is not a part of this Server. Please Check!!!!!!!!!!!'',16,1)
                            END', 
                    @database_name=N'master', 
                    @flags=0
            GO
    

0

আরেকটি উপায় হ'ল প্রতিটি কাজের একটি পদক্ষেপ sertোকানো যা নিম্নলিখিত কোড সহ প্রথমে চালানো উচিত:

IF (SELECT ars.role_desc
    FROM sys.dm_hadr_availability_replica_states ars
    INNER JOIN sys.availability_groups ag
    ON ars.group_id = ag.group_id
    AND ars.is_local = 1) <> 'PRIMARY'
BEGIN
   --We're on the secondary node, throw an error
   THROW 50001, 'Unable to execute job on secondary node',1
END

সাফল্যের পরবর্তী পদক্ষেপটি অবিরত করতে এবং একটি ব্যর্থতায় সাফল্যের রিপোর্টিংয়ের কাজটি ছেড়ে দিতে এই পদক্ষেপটি সেট করুন।

বিদ্যমান পদক্ষেপে অতিরিক্ত যুক্তি যুক্ত করার পরিবর্তে একটি অতিরিক্ত পদক্ষেপ যুক্ত করা আমার কাছে আরও পরিষ্কার মনে হয়েছে find


0

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

   IF master.dbo.fn_hadr_database_is_primary_replica('Admin') = 1
    BEGIN 
        -- do whatever you were going to do in the Primary:
        PRINT 'Doing stuff in the Primary Replica';
    END
ELSE 
    BEGIN 
        -- we're not in the Primary - exit gracefully:
        PRINT 'This is not the primary replica - exiting with success';
    END

আপনি যদি এটি ব্যবহারকারীর ডাটাবেস রক্ষণাবেক্ষণের জন্য ব্যবহার করতে চান তবে আমি এটি ব্যবহার করি:

/*Below evaluates all user databases in the instance and gives stubs to do work; must change to get anything other than print statements*/
declare @dbname varchar(1000)
declare @sql nvarchar(4000)

declare AllUserDatabases cursor for
    select [name] from master.sys.databases
    where database_id > 4 --this excludes all sysdbs; if all but tempdb is desired, change to <> 2
    and [state] = 0

open AllUserDatabases
fetch AllUserDatabases into @dbname

while (@@FETCH_STATUS = 0)
    begin
    --PRINT @dbname
        set @sql = '
            IF master.sys.fn_hadr_is_primary_replica(''' + @dbname + ''') = 1
                BEGIN 
                    -- do whatever you are going to do in the Primary:
                    PRINT ''Doing stuff in the Primary Replica''
                END
            ELSE 
                BEGIN 
                    -- not in the Primary - exit gracefully:
                    PRINT ''This is not the primary replica - exiting with success''
                END             
        '
        exec sp_executesql @sql
        fetch AllUserDatabases into @dbname
    end
close AllUserDatabases
deallocate AllUserDatabases

আমি আশা করি এটি একটি সহায়ক টিপ!


0

আমি এটি ব্যবহার:

if (select primary_replica from sys.dm_hadr_availability_group_states) = @@SERVERNAME begin
... paste your t-sql here ...

end
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.