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