একটি মূল কাজ থেকে ধারাবাহিকভাবে একাধিক এসকিউএল সার্ভার এজেন্ট কাজ কল করার ভাল উপায়?


11

আমি বেশ কয়েকটি এসকিউএল সার্ভার এজেন্ট কাজ পেয়েছি যা ক্রমান্বয়ে চালানো উচিত। যে কাজগুলি কার্যকর করা উচিত তার একটি সুন্দর ওভারভিউ রাখতে আমি একটি প্রধান কাজ তৈরি করেছি যা অন্য কাজগুলিকে কল দিয়ে কল করে EXEC msdb.dbo.sp_start_job N'TEST1'sp_start_jobশেষ অবিলম্বে (ইয়োব ধাপ 1), কিন্তু তারপর আমি অপেক্ষা করতে আমার মূল চাকরি চাও পর্যন্ত কাজ TEST1পরবর্তী কাজ কল করার আগে সমাপ্ত হয়েছে।

সুতরাং আমি এই ছোট স্ক্রিপ্টটি লিখেছি যা কাজটি ডাকা হওয়ার ঠিক পরে (জব স্টেপ 2) চালানো শুরু করে এবং মূল কাজটি সাব জব শেষ না হওয়া পর্যন্ত অপেক্ষা করতে বাধ্য করে:

WHILE 1 = 1
  BEGIN
    WAITFOR DELAY '00:05:00.000';

    SELECT *
    INTO   #jobs
    FROM   OPENROWSET('SQLNCLI', 'Server=TESTSERVER;Trusted_Connection=yes;',
           'EXEC msdb.dbo.sp_help_job @job_name = N''TEST1'',
           @execution_status = 0, @job_aspect = N''JOB''');

    IF NOT (EXISTS (SELECT top 1 * FROM #jobs))
      BEGIN
        BREAK
      END;

    DROP TABLE #jobs;

  END;

এটি যথেষ্ট ভাল কাজ করে। তবে আমি অনুভূতিটি আরও স্মার্ট এবং / অথবা নিরাপদ ( WHILE 1 = 1?) সমাধানগুলি সম্ভব হওয়া উচিত পেয়েছি ।

আমি নিম্নলিখিত বিষয়গুলি সম্পর্কে আগ্রহী, আশা করি আপনি আমাকে কিছু অন্তর্দৃষ্টি সরবরাহ করতে পারেন:

  • এই পদ্ধতির সাথে সমস্যাগুলি কী?
  • আপনি কি এটি করার জন্য আরও ভাল উপায়ের পরামর্শ দিতে পারেন?

(আমি এই প্রশ্নটি প্রথমে স্ট্যাকওভারফ্লোতে পোস্ট করেছি , কারণ আমি কোডের উন্নতির দিকে মনোনিবেশ করছিলাম Still তবে এখনও বৈধ gu তবে আমার ধারণা হ'ল এখানে লোকেরা কেন আমাকে এভাবে করার চেষ্টা করবেন না সে সম্পর্কে সাধারণভাবে বুদ্ধিমান জিনিস থাকবে '' আমি এখনই এটি করছি, বা ভাল বিকল্প সরবরাহ করি))

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


আপনি কি এই চাকুরীগুলি স্বাধীন কাজের পরিবর্তে মূল কাজের পদক্ষেপ হিসাবে বিবেচনা করেছেন? এটি জটিলতা হ্রাস করবে, বিশেষত যদি তাদের এইভাবে কেবল ক্রমানুসারে ডাকা হয় ...
অ্যারন বারট্রান্ড

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

উত্তর:


9

দাবি অস্বীকার: আমি এসকিউএল সেন্ট্রি এর জন্য কাজ করি।

আমাদের এসকিউএল সেন্ট্রি ইভেন্ট ম্যানেজার প্রোডাক্টটিতে ঠিক এই জন্য নির্মিত একটি সুবিধা রয়েছে: কাজগুলি শৃঙ্খলাবদ্ধ করতে এবং বিভিন্ন ওয়ার্কফ্লো অর্ডারে তাদের সাজানোর জন্য।

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

আমি মূলত যা প্রয়োগ করেছি তা হ'ল ব্যাকআপ জব শুরু করার সময় এবং পুনরুদ্ধার শুরুর সময়ের মধ্যে একটি যথেষ্ট বাফার। এটি ঠিক বোকা ছিল না; ব্যাকআপের সময়গুলি পরিবর্তিত হওয়ার কারণে বাফার প্রায়শই আমাদের নষ্ট সময় দিয়ে যায় যেখানে একটি পুনরুদ্ধার শুরু না হলেও এটি শুরু হতে পারে। এবং মাঝে মধ্যে বাফার যথেষ্ট ছিল না।

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

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

এখানে চিত্র বর্ণনা লিখুন

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


2

আপনার পদ্ধতির মূল সমস্যাটি হ'ল কিছু না হওয়া পর্যন্ত আপনাকে অবিচ্ছিন্নভাবে লুপ করতে হয় (যা খুব দীর্ঘ সময় বা এমনকি কখনই হতে পারে) এবং এটি সঠিকভাবে অনুভব করে না। আমি মনে করি আপনি প্রশ্ন জিজ্ঞাসা করছেন কেন।

সুতরাং, আপনার সমস্যার ডেটা-চালিত পদ্ধতির ব্যবহার সম্পর্কে কীভাবে? উদাহরণস্বরূপ, একটি 'অডিট' সারণী তৈরি করুন যা প্রতিটি কাজ শুরু হওয়ার সাথে সাথে শেষ হয়:

কাজের নাম | শুরুর সময় | শেষ সময়
--------- + + ------------------- + + ------------------
টেস্ট 1 2012-07-26 07:30 2012-07-26 07:35

একটি 'প্রসেসিং' সারণী তৈরি করুন যা সমস্ত কাজ এবং ক্রম যাতে তাদের সম্পাদন করতে হবে তার তালিকাভুক্ত করে:

কাজের নাম | অর্ডার চালান
--------- + + ---------
পরীক্ষা 1 | 1
পরীক্ষা 2 | 2
পরীক্ষা 3 | 3

অডিট টেবিলে একটি সন্নিবেশ ট্রিগার তৈরি করুন, যাতে কোনও কাজ শেষ হয়ে যায় এবং নিরীক্ষার রেকর্ড সন্নিবেশ করা হয়, তখন ট্রিগার পরবর্তী কাজের (রান অর্ডার দ্বারা) প্রসেসিং টেবিলটি অনুসন্ধান করে এবং তারপরে এটি চালু করে।

এই পদ্ধতির সুবিধাগুলি হ'ল:

  1. এটি বিকাশ এবং বজায় রাখা মোটামুটি সহজ।
  2. কোডের একটি লাইন পরিবর্তন না করে প্রসেসিং টেবিলের মাধ্যমে নতুন কাজ যুক্ত করার বা বিদ্যমান কাজের ক্রম পরিবর্তন করার সুযোগ দেয়।
  3. নিরীক্ষণ সারণি কিছু কখন ঘটেছে তা দৃশ্যমান করে।
  4. এটি সিপিইউ চক্র নষ্ট করে না। ট্রিগারটি তখনই গুলি চালানো হবে যখন কিছু ঘটেছে।
  5. এটা ঠিক অনুভূত 😉

আছে HTH


1
অনেক ধন্যবাদ, আপনার উত্তর ভালবাসা! আমি অবশ্যই চেষ্টা করে দেখব!
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.