एक मुख्य नौकरी से क्रमिक रूप से कई SQL सर्वर एजेंट नौकरियों को कॉल करने का अच्छा तरीका है?


11

मुझे कई SQL सर्वर एजेंट कार्य मिले हैं जो क्रमिक रूप से चलने चाहिए। उन नौकरियों का एक अच्छा अवलोकन रखने के लिए जिन्हें मुझे निष्पादित करना चाहिए मैंने एक मुख्य नौकरी बनाई है जो कॉल के साथ अन्य नौकरियों को कॉल करती है 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?) समाधान संभव होना चाहिए।

मैं निम्नलिखित चीजों के बारे में उत्सुक हूं, आशा है कि आप मुझे कुछ जानकारी प्रदान कर सकते हैं:

  • इस दृष्टिकोण के साथ क्या समस्याएं हैं?
  • क्या आप ऐसा करने का बेहतर तरीका सुझा सकते हैं?

(मैंने इस सवाल को StackOverflow में सबसे पहले पोस्ट किया , क्योंकि मैं कोड के सुधार पर ध्यान केंद्रित कर रहा था। फिर भी मान्य है। लेकिन मेरा अनुमान है कि यहां के लोग सामान्य तौर पर यह कहने के लिए होशियार होंगे कि मुझे ऐसा करने की कोशिश क्यों नहीं करनी चाहिए। ' मी अभी कर रहा है, या अच्छे विकल्प प्रदान कर रहा है।)

EDIT (25 जुलाई)
स्पष्ट रूप से मेरी स्क्रिप्ट के साथ बहुत अधिक गलत नहीं है, इसके साथ समस्याओं की ओर इशारा करते हुए जवाबों की कम संख्या के अनुसार :-) इस तरह की स्क्रिप्टिंग का विकल्प एक उपकरण का उपयोग करना प्रतीत होता है जो इन के लिए डिज़ाइन किया गया है कार्य (जैसे SQL संतरी इवेंट मैनेजर या ...) - या इस तरह के टूल को स्वयं लिखने के लिए। हम अपनी मौजूदा कंपनी में ऐसा कोई उपकरण नहीं खरीदेंगे, इसलिए अभी मैं सिर्फ स्क्रिप्ट के साथ रहूंगा।


क्या आपने इन नौकरियों को स्वतंत्र नौकरियों के बजाय मुख्य नौकरी के कदम के रूप में माना है? यही कारण है कि जटिलता को कम करेगा, खासकर अगर वे ही कभी इस तरह से एक दृश्य में एक साथ कहा जाता है ...
हारून बर्ट्रेंड

यह एक संतुलन है। यह 'क्लीनर' रखरखाव होगा यदि हम सभी नौकरियों को मुख्य नौकरी के चरणों के रूप में जोड़ देंगे, लेकिन जब हम ऐसा करते हैं तो हम बहुत अधिक अवलोकन और विशिष्ट नौकरियों को मैन्युअल रूप से चलाने की संभावना खो देंगे। इसलिए मैंने निश्चित रूप से इस पर विचार किया है, लेकिन वर्तमान 'समाधान' के बहुत अधिक फायदे हैं - जब तक यह काम करता है।

जवाबों:


9

अस्वीकरण: मैं SQL संतरी के लिए काम करता हूं।

हमारे एसक्यूएल संतरी इवेंट मैनेजर उत्पाद में इसके लिए बिल्कुल एक सुविधा है: श्रृंखला नौकरियों के लिए और उन्हें विभिन्न वर्कफ़्लो ऑर्डर में व्यवस्थित करने के लिए।

मैंने SQL संतरी का उपयोग वर्षों पहले करना शुरू कर दिया था, इससे पहले कि मैं कंपनी में शामिल हो गया, ठीक यही करने के लिए। जो मैं चाहता था, उत्पादन पर बैकअप समाप्त होने के तुरंत बाद हमारे परीक्षण सर्वर पर एक बहाल नौकरी शुरू करने का एक तरीका था।

मैंने मूल रूप से जो लागू किया था, वह बैकअप जॉब टाइम और रिस्टोर स्टार्ट टाइम के बीच एक पर्याप्त बफर था। यह बिल्कुल मूर्ख नहीं था; चूँकि बैकअप समय के साथ ही विविध बफर अक्सर हमें बर्बाद समय के साथ छोड़ देते हैं जहां एक पुनर्स्थापना शुरू नहीं हुई थी, भले ही यह हो सकता है। और कभी-कभी बफर पर्याप्त नहीं था।

मैंने जो आगे लागू किया वह आपके जैसा था - मैंने निर्धारित बैकअप के तुरंत बाद शुरू होने वाले टेस्ट सर्वर पर एक नौकरी लिखी थी, और यह देखने के लिए कि जब नौकरी समाप्त हो गई थी, तब तक मतदान जारी रखा। बाद में बैकअप कार्य में एक दूसरे चरण में संशोधन किया गया जिसने परीक्षण सर्वर पर एक तालिका अपडेट की। वास्तव में बहुत अलग नहीं है, केवल नौकरी बहाल करने के अलावा, नौकरी के इतिहास को दूरस्थ रूप से मॉनिटर करने के बजाय स्थानीय रूप से एक टेबल देखना था। यह सोचकर कि उस मेज पर एक ट्रिगर हो सकता है जिसे कॉल किया जाता है sp_start_jobताकि काम को हर एन मिनट चलाने की ज़रूरत न हो (या बिल्कुल निर्धारित हो)।

अंतिम समाधान एक साथ जॉब्स की श्रृंखला के लिए था ... जब सर्वर ए पर बैकअप खत्म हो जाता है, तो इवेंट मैनेजर सर्वर बी पर पुनर्स्थापना की नौकरी शुरू करता है। जब एक नौकरी विफल हो जाती है, तो सफल होता है, आदि, यह सभी के लिए जिम्मेदार हो सकता है। वर्कफ़्लो डिज़ाइनर आपको SSIS की काफी याद दिलाएगा:

यहाँ छवि विवरण दर्ज करें

अंतर्निहित मैकेनिक्स जो मैं बता रहा हूं वह रॉकेट सर्जरी नहीं है, निश्चित रूप से। यदि आप बैठते हैं और करते हैं तो आप खुद को इस प्रकार की चेनिंग रैपर लिख सकते हैं। बस आपको एक विकल्प प्रदान करना है जहाँ आपके पास नहीं है।


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
बहुत बहुत धन्यवाद, आपका जवाब प्यार! मैं निश्चित रूप से यह कोशिश करूँगा!
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.