बाहरी क्रोन जैसे टूल के बिना Postgresql पर आवर्ती कार्य कैसे चलाएं?


41

मैं एक नियमित आधार पर संग्रहीत प्रक्रिया को कॉल करना चाहूंगा। ओरेकल पर, मैं इसके लिए एक नौकरी बनाऊंगा। मैंने पाया है कि Postgresql एक बाहरी उपकरण (क्रोन आदि) और PgAgent का उपयोग करके इस की अच्छी तरह से नकल कर सकता है।

क्या आप एक "आंतरिक" विकल्प के बारे में जानते हैं जो बाहरी उपकरण को शामिल नहीं करेगा?

  • मैं pgAgent की कमांड लाइन पर संग्रहीत पासवर्ड से सुरक्षा चिंताओं से बचना चाहता हूं।
  • मैं पासवर्ड छिपाने के लिए किसी भी अतिरिक्त सिस्टम कॉन्फ़िगरेशन से बचना चाहता हूं ( ~/.pgpass)।

Postgresql 8.3
लिनक्स रेडहैट 64 बिट


क्या आप जोड़ सकते हैं कि आप pgAgent या crontab का उपयोग क्यों नहीं कर सकते? विशेष रूप से क्या सुविधाएँ गायब हैं ..
WrinkFree

@ रोहन मैंने अपना प्रश्न अपडेट किया है
स्टीफन

ऐसा लगता है कि पोस्ट की प्रतिलिपि बनाई गई है और stackoverflow.com/q/16958625/398670 पर
क्रेग रिंगर

जवाबों:


30

यहां तक ​​कि अगर आप जल्द-से-जारी (लिखने के समय) पोस्टग्रेसीक्यू 10 या वर्तमान पोस्टग्रेएसक्यूएल 9.6 नहीं प्राचीन 8.3 की तरह चल रहे थे, तब भी कोई अंतर्निहित कार्य अनुसूचक नहीं है।

PgAgent या बाहरी क्रोन नौकरियों की तरह कुछ की आवश्यकता है, कोई सुविधाजनक समाधान नहीं है।

9.3 में पेश किए गए बैकग्राउंड वर्कर्स फ़ीचर को उम्मीद है कि PgAgent जैसे टूल को बाद के रिलीज़ में PostgreSQL कोर में ले जाया जा सकता है, लेकिन यह अभी तक नहीं किया गया है। यहां तक ​​कि 9.3 पर आपको अभी भी क्रोन या महामारी चलाना है।

कुछ लोग बैकग्राउंड वर्कर आधारित शेड्यूलर्स पर काम कर रहे हैं, और कुछ ऐसे पैच आ रहे हैं जिनकी मदद से सुविधाएं मिलनी चाहिए। लेकिन PostgreSQL 10 के रूप में अभी भी कोई अच्छी गुणवत्ता नहीं है, व्यापक रूप से अपनाया गया अनुसूचक, और ज्यादातर लोग क्रोन / एमएस कार्य अनुसूचक आदि का उपयोग करते हैं।

कृपया संस्करण नीति पर भी नज़र डालें ; आप एक अप्रचलित और असमर्थित रिलीज़ चला रहे हैं।


Please take a look at the version policy, उन्नयन Postgresql एक विकल्प नहीं है।
Stephan

2
@ आप किसी बिंदु पर अपग्रेड करने जा रहे हैं, और यह केवल कठिन होता जा रहा है। क्या 8.3 बिंदु जारी है, वैसे? कितने महत्वपूर्ण बग फिक्स आपको याद कर रहे हैं? या आप कम से कम 8.3.23 पर हैं? उन्होंने कहा, जैसा कि मैंने बताया कि आप चाहते हैं कि आने वाली 9.3 रिलीज में भी यह सुविधा मौजूद नहीं है, हालांकि इसके अलावा इसकी अनुमति देने के लिए कुछ जमीनी कार्य को जोड़ा गया है।
क्रेग रिंगर

मैं अपने बॉस से बात करूंगा :)
Stephan

1
@ अच्छा विचार :-)। न्यूनतम अद्यतन 8.3.23 पर तत्काल, फिर नवीनीकरण योजनाओं पर एक नए रिलीज के लिए काम करना शुरू करें। यह इस सवाल को हल नहीं करेगा, लेकिन भविष्य के दर्द को बचाने के लिए यह एक बहुत अच्छा विचार है। जिन ग्राहकों को मैं समस्या देता हूं उनकी संख्या का समर्थन करता है, अगर उनके पास वर्तमान में रहने की समस्या है तो वे कभी भी आश्चर्यजनक नहीं होंगे। हम सिर्फ kicks ;-) के लिए नए संस्करण जारी नहीं करते हैं। उन चीजों पर मार्गदर्शन के लिए प्रत्येक .0 संस्करण के लिए रिलीज़ नोट्स पढ़ें जिनसे आपको निपटने की आवश्यकता हो सकती है, और उन्नयन पर मैनुअल पढ़ सकते हैं। आपका केवल संभावना दर्द अंक हैं standard_conforming_stringsऔर bytea_output
क्रेग रिंगर

क्रेग, आप pg_cron के बारे में क्या सोचते हैं?
mehmet

21

PostgreSQL 9.5 के रूप में, आप pg_cron एक्सटेंशन का उपयोग कर सकते हैं , जिसे PostgreSQL में एक साझा लाइब्रेरी के रूप में लोड किया गया है।

इसे स्थापित करने के बाद, नौकरी बनाना बहुत सरल है:

SELECT cron.schedule('30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$);

यह निर्दिष्ट क्रोन शेड्यूल के अनुसार डिलीट कमांड चलाएगा। @rebootजब सर्वर पुनरारंभ होता है, तो आप किसी कार्य को शेड्यूल करने के लिए भी उपयोग कर सकते हैं और यदि आप हॉट स्टैंडबाय को बढ़ावा देते हैं तो pg_cron स्वचालित रूप से नौकरी चलाना शुरू कर देगा।

.Pg का उपयोग करने के बजाय, आप cg उपयोगकर्ता के लिए pg_hba.conf में लोकलहोस्ट एक्सेस प्रदान कर सकते हैं।


-1

आप वास्तव में, वास्तव में ऐसा नहीं करना चाहते हैं। Postgres एक ऑपरेटिंग सिस्टम नहीं है, यह एक डेटाबेस सर्वर है। भले ही डेटाबेस अनुसूचित कार्यों को चलाने का समर्थन करता है, लेकिन डेटाबेस को उस तरह से दुरुपयोग करना वास्तव में एक अच्छा विचार नहीं है।

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

इसके आउट ऑफ बॉक्स कॉन्फ़िगरेशन में, आमतौर पर पोस्ट postgresसर्वर डीबी सर्वर को चलाने के लिए सिस्टम उपयोगकर्ता को सेट करता है, और यह सिस्टम उपयोगकर्ता आमतौर पर पहले से ही कॉन्फ़िगर होता है, इसलिए यह स्थानीय सर्वर से विश्वास करते हुए स्थानीय यूनिक्स सॉकेट के माध्यम से कनेक्ट करते हुए कनेक्ट कर सकता है। आप अपने क्रोनजॉब को सिस्टम उपयोगकर्ता के रूप में चला सकते हैं, स्थानीय सॉकेट से कनेक्ट कर सकते हैं, और फिर भूमिका को स्विच कर सकते हैं यदि आप नहीं चाहते हैं कि आपकी संग्रहित प्रक्रिया सुपरसुसर विशेषाधिकार के साथ चले।

डिफ़ॉल्ट सेटअप में, आप ऐसा कर सकते हैं:

$ sudo -u postgres crontab -e

संपादक में, crontab प्रविष्टि में इस तरह जोड़ें:

0    0    *     *    * bash /path/to/run_stored_procedure.sh

और अपने / inpath/to/run_stored_procedure.sh फ़ाइल में आप बस अपनी दुकानों को कॉल करने के लिए psql का उपयोग करें

#!/usr/bin/env bash
psql my_db_name <<END
    SET ROLE limited_user;
    SELECT my_stored_proc();
    SELECT 1 FROM my_stored_proc();
END

1
'यह वास्तव में डेटाबेस का दुरुपयोग करने के लिए एक अच्छा विचार नहीं है कि' आपको क्यों लगता है कि यह दुरुपयोग है? विभिन्न मुख्यधारा RDBMSes समान दृष्टिकोण रखते हैं, और मुझे नहीं लगता कि यह बहुत भयानक है। इसके अलावा, यदि आपके पास OS तक पहुंच नहीं है, तो आप crontab की कमी से बाहर हैं।
dezso
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.