এসকিউএল এজেন্ট কিভাবে এবং কখন পরবর্তী_রুন_ তারিখ / পরবর্তী_রুন_টাইমের মান আপডেট করে?


13

আমি এমএসডিবি ডাটাবেসে sp_add_jobschedule proc ব্যবহার করে একটি এসকিউএল এজেন্ট কাজের নতুন শিডিউল যুক্ত করার জন্য টি-এসকিউএল কোডে কাজ করছি। যখন আমি একটি নতুন সময়সূচি যুক্ত করি (সাধারণত নির্দিষ্ট তারিখ / সময়টিতে একবার রান) এবং তত্ক্ষণাত্ সিসজবস্চিডুলস এবং সিসচেডিয়ুলের মানগুলি দেখি, আমি দেখতে পাচ্ছি যে নতুন শিডিয়ুলটি যুক্ত হয়েছে এবং আমার এসকিউএল এজেন্টের জন্য জব_আইডে আবদ্ধ কাজ। যাইহোক, পরবর্তী_রুন_ তারিখ এবং পরবর্তী_রুন_টাইমের মানগুলিতে 0 থাকে। আমি যখন ফিরে এসে 2 বা 3 মিনিটের মধ্যে আবার তাদের দিকে তাকাব তখনও তারা তাদের মধ্যে 0 টি প্রদর্শন করে। তবে আমি যখন আরও 5 বা 10 মিনিট পরে ফিরে আসি, এটি এখন সঠিকভাবে পরবর্তী নির্ধারিত রানের সাথে সম্পর্কিত তারিখ এবং সময় মানগুলি দেখায়।

সুতরাং আমার প্রশ্নগুলি হ'ল:

  • এই মানগুলি কতবার আপডেট হয়?
  • এই মানগুলি আপডেট করে এমন কোন প্রক্রিয়া?
  • যদি আমি একটি শিডিয়ুল যোগ করতে চাইতাম, বলুন, ভবিষ্যতে 1 মিনিট, তার মানে কি এই কাজটি পরের_রুন_সেট / সময়টি এখনও আপডেট হয়নি বলে চালানো হবে না?

একটি নতুন সময়সূচি যুক্ত করতে আমি যে কোডটি ব্যবহার করি তার উদাহরণ:

exec msdb.dbo.sp_add_jobschedule @job_id = @jobID
                    , @name = @JobName
                    , @enabled = 1
                    , @freq_type = 1
                    , @freq_interval = 0
                    , @freq_subday_type = 0
                    , @freq_subday_interval = 0
                    , @freq_relative_interval = 0
                    , @freq_recurrence_factor = 0
                    , @active_start_date = @ScheduleRunDate
                    , @active_end_date = 99991231
                    , @active_start_time = @ScheduleRunTime
                    , @active_end_time = 235959

যেখানে @ জবআইডিআইডি বাইনারি (16) যা কাজের জব_আইডিকে প্রশ্নবিদ্ধভাবে ধরে রাখে, @ শেকুলআরুনডেট এবং @ শেকুলআরুনটাইম যথাক্রমে তারিখ এবং সময় সহ INT হয়।


3
এটি একটি এসকিউএল এজেন্ট কাজের মাধ্যমে আপডেট করা হয়েছে। যা এসকিউএল এজেন্ট কাজের মাধ্যমে আপডেট হয়। পুনরাবৃত্তি unক্যবদ্ধ!
অ্যারন বারট্রান্ড

1
দুঃক্ষিত। কিছুক্ষণের মধ্যে আবার চেনাশোনা করার সুযোগ হয়নি।
বিবিলেক

উত্তর:


16

সংক্ষিপ্ত উত্তর

দেখে মনে হচ্ছে যে ডেটাগুলি msdb.dbo.sysjobschedulesএসকিউএল এজেন্টের একটি পটভূমি থ্রেড দ্বারা আপডেট করা হয়েছে SQLAgent - Schedule Saver, প্রতি 20 মিনিটে (বা কম বার xp_sqlagent_notifyবলা হয়েছে , যদি না ডাকা হয় এবং এর মধ্যে কোনও কাজ চালানো হয়নি) হিসাবে চিহ্নিত করা হয়।

আরো সঠিক তথ্য, এ টি দেখতে next_scheduled_run_dateমধ্যে msdb.dbo.sysjobactivity। কোনও সময় পরিবর্তন বা কোনও চাকরী চলে যাওয়ার সময় এটি রিয়েল-টাইমে আপডেট হয়। একটি যুক্ত বোনাস হিসাবে, sysjobactivityতথ্যগুলি সঠিক উপায়ে (ডেটটাইম কলাম হিসাবে) সঞ্চয় করে, সেই নির্বোধ আইএনটিগুলির তুলনায় এটি কাজ করা অনেক সহজ করে তোলে।

এটি সংক্ষিপ্ত উত্তর:

সিসজবস্কুলিউডস সত্য প্রতিফলিত করার আগে এটি 20 মিনিট পর্যন্ত হতে পারে ; তবে সিসজজ্যাকটিভিটি সর্বদা আপ টু ডেট থাকবে। আপনি যদি এই সম্পর্কে আরও অনেক বিশদ জানতে চান বা আমি কীভাবে এটি বের করেছিলাম ...


দীর্ঘ উত্তর

আপনি যদি মুহুর্তের জন্য খরগোশকে অনুসরণ করা যত্নবান হন, আপনি যখন ফোন করেন sp_add_jobschedule, ইভেন্টগুলির এই চেইনটি গতিতে সেট করা আছে:

msdb.dbo.sp_add_jobschedule == calls ==> msdb.dbo.sp_add_schedule
                                         msdb.dbo.sp_attach_schedule

msdb.dbo.sp_attach_schedule == calls ==> msdb.dbo.sp_sqlagent_notify

msdb.dbo.sp_sqlagent_notify == calls ==> msdb.dbo.xp_sqlagent_notify

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

exec sp_executesql N'DECLARE @nextScheduledRunDate DATETIME 
  SET @nextScheduledRunDate = msdb.dbo.agent_datetime(@P1, @P2) 
  UPDATE msdb.dbo.sysjobactivity 
    SET next_scheduled_run_date = @nextScheduledRunDate 
    WHERE session_id = @P3 AND job_id = @P4',
N'@P1 int,@P2 int,@P3 int,@P4 uniqueidentifier',
20120819,181600,5,'36924B24-9706-4FD7-8B3A-1F9F0BECB52C'

দেখে মনে হচ্ছে এটি sysjobactivityঅবিলম্বে আপডেট হয়েছে এবং sysjobschedulesকেবলমাত্র একটি শিডিয়ুলে আপডেট হয়েছে। আমরা যদি দিনে একবারে নতুন সময়সূচী পরিবর্তন করি, যেমন

@freq_type=4, 
@freq_interval=1, 
@freq_subday_type=1, 
@freq_subday_interval=0, 
@freq_relative_interval=0, 
@freq_recurrence_factor=1, 

আমরা এখনও sysjobactivityউপরে হিসাবে তাত্ক্ষণিক আপডেট দেখতে পাচ্ছি , এবং তারপরে কাজ শেষ হওয়ার পরে আরও একটি আপডেট। এসকিউএল এজেন্টের মধ্যে বিভিন্ন আপডেট ব্যাকগ্রাউন্ড এবং অন্যান্য থ্রেড থেকে আসে eg

SQLAgent - Job Manager
SQLAgent - Update job activity
SQLAgent - Job invocation engine
SQLAgent - Schedule Saver

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

আমি নিশ্চিত না যে এসকিউএল এজেন্ট শুরু হওয়ার পরে, বা মধ্যরাত থেকে, বা মেশিন-নির্দিষ্ট কিছু থেকে 20 মিনিটের চক্রটি অফসেট হয়েছে কিনা। একই শারীরিক সার্ভারে দুটি ভিন্ন উদাহরণে, "শিডিয়ুল সেভার" থ্রেড আপডেট হয়েছে sysjobschedules, উভয় দৃষ্টিতে প্রায় একই সময়ে - 18:31:37 & 18:51:37 এক, এবং 18:31:39 & অন্যদিকে 18:51:39। আমি এই সার্ভারগুলিতে একই সময়ে এসকিউএল সার্ভার এজেন্ট শুরু করি নি, তবে শুরুর সময়গুলি 20 মিনিটের অফসেট হওয়ার সম্ভাবনা রয়েছে remote আমি এতে সন্দেহ করি, তবে এজেন্টদের মধ্যে একটিতে পুনরায় চালু করে এবং আরও আপডেট হওয়ার জন্য অপেক্ষা করে নিশ্চিত করার জন্য আমার কাছে এখনই সময় নেই।

আমি জানি এটি কে করেছে, এবং যখন এটি হয়েছিল, কারণ আমি সেখানে একটি ট্রিগার রেখেছিলাম এবং এটি ক্যাপচার করেছিলাম, যদি আমি এটি সন্ধানে খুঁজে না পাই বা অজান্তেই আমি এটি ফিল্টার করে ফেলেছি।

CREATE TABLE dbo.JobAudit
(
  [action] CHAR(1),
  [table] CHAR(1), 
  hostname SYSNAME NOT NULL DEFAULT HOST_NAME(), 
  appname SYSNAME  NOT NULL DEFAULT PROGRAM_NAME(),
  dt DATETIME2     NOT NULL DEFAULT SYSDATETIME()
);

CREATE TRIGGER dbo.schedule1 ON dbo.sysjobactivity FOR INSERT
AS
  INSERT dbo.JobAudit([action], [table] SELECT 'I', 'A';
GO
CREATE TRIGGER dbo.schedule2 ON dbo.sysjobactivity FOR UPDATE
AS
  INSERT dbo.JobAudit([action], [table] SELECT 'U', 'A';
GO
CREATE TRIGGER dbo.schedule3 ON dbo.sysjobschedules FOR INSERT
AS
  INSERT dbo.JobAudit([action], [table] SELECT 'I', 'S';
GO
CREATE TRIGGER dbo.schedule4 ON dbo.sysjobschedules FOR UPDATE
AS
  INSERT dbo.JobAudit([action], [table] SELECT 'U', 'S';
GO

এটি বলেছিল, স্ট্যান্ডার্ড ট্রেসটি ধরা শক্ত নয়, এটি এমনকি অ-গতিশীল ডিএমএল হিসাবে আসে:

UPDATE msdb.dbo.sysjobschedules 
  SET next_run_date = 20120817, 
      next_run_time = 20000 
 WHERE (job_id = 0xB87B329BFBF7BA40B30D9B27E0B120DE 
 and schedule_id = 8)

সময়ের সাথে সাথে এই আচরণটি ট্র্যাক করতে আপনি যদি আরও ফিল্টারযুক্ত ট্রেস চালাতে চান (যেমন এসকিউএল এজেন্টের মাধ্যমে অন-ডিমান্ডের পরিবর্তে পুনরায় চালু করা), আপনি অ্যাপ্লিকেশন = চালিত করতে পারেন 'SQLAgent - Schedule Saver'... ...

সুতরাং আমি মনে করি আপনি যদি পরবর্তী রান সময়টি তাত্ক্ষণিকভাবে জানতে চান তবে দেখুন sysjobactivity, না sysjobschedules। এই সারণীটি এজেন্ট বা এর পটভূমির থ্রেডগুলি দ্বারা আপডেট করা হয় ("জব ক্রিয়াকলাপ আপডেট করুন", "জব ম্যানেজার" এবং "জব ইনভোকেশন ইঞ্জিন") ক্রিয়াকলাপ হিসাবে ঘটে বা এর দ্বারা জানানো হয় xp_sqlagent_notify

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


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

0

msdb.dbo.sp_help_jobসর্বদা সঠিক আসল next_run_date/ প্রত্যাবর্তনের জন্য উপস্থিত হয় next_run_time

এটি ব্যবহার sp_get_composite_job_infoকরে যা প্রকৃতপক্ষে পুনরুদ্ধার করতে নিম্নলিখিত কলটি করে next_run_date/time

      IF ((@@microsoftversion / 0x01000000) >= 8) -- SQL Server 8.0 or greater
        INSERT INTO @xp_results
        EXECUTE master.dbo.xp_sqlagent_enum_jobs @can_see_all_running_jobs, @job_owner, @job_id
      ELSE
        INSERT INTO @xp_results
        EXECUTE master.dbo.xp_sqlagent_enum_jobs @can_see_all_running_jobs, @job_owner

যেহেতু sysjobscheduleঅবিশ্বাস্য বলে মনে হচ্ছে, আমি কেবল এটি ব্যবহার করব sp_help_job

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