अन्य डेटाबेस प्रबंधन प्रणालियों के विपरीत, जिनके पास स्वयं का अंतर्निहित अनुसूचक होता है (जैसे Oracle, MSSQL या MySQL), PostgreSQL में अभी भी इस तरह की सुविधा नहीं है।
PostgreSQL में शेड्यूलिंग कार्यक्षमता प्रदान करने के लिए आपको एक बाहरी टूल का उपयोग करना होगा जैसे...
- लिनक्स क्रोंटैब
- एजेंट pgAgent
- एक्सटेंशन pg_cron
इस ब्लॉग में हम इन उपकरणों का पता लगाएंगे और उन्हें और उनकी मुख्य विशेषताओं को संचालित करने के तरीके पर प्रकाश डालेंगे।
लिनक्स क्रोंटैब
हालांकि, यह सबसे पुराना है, लेकिन शेड्यूलिंग कार्यों को निष्पादित करने का एक कुशल और उपयोगी तरीका है। यह प्रोग्राम एक डेमॉन (क्रॉन) पर आधारित है जो समय-समय पर बैकग्राउंड में कार्यों को स्वचालित रूप से चलाने की अनुमति देता है और नियमित रूप से कॉन्फ़िगरेशन फ़ाइलों (जिसे क्रोंटैब फाइल कहा जाता है) को सत्यापित करता है, जिस पर स्क्रिप्ट/कमांड को निष्पादित करने और उसके शेड्यूलिंग को परिभाषित किया जाता है।
प्रत्येक उपयोगकर्ता की अपनी crontab फ़ाइल हो सकती है और नवीनतम Ubuntu रिलीज़ के लिए निम्न में स्थित हैं:
/var/spool/cron/crontabs (for other linux distributions the location could be different):
[email protected]:/var/spool/cron/crontabs# ls -ltr
total 12
-rw------- 1 dbmaster crontab 1128 Jan 12 12:18 dbmaster
-rw------- 1 slonik crontab 1126 Jan 12 12:22 slonik
-rw------- 1 nines crontab 1125 Jan 12 12:23 nines
कॉन्फ़िगरेशन फ़ाइल का सिंटैक्स निम्न है:
mm hh dd mm day <<command or script to execute>>
mm: Minute(0-59)
hh: Hour(0-23)
dd: Day(1-31)
mm: Month(1-12)
day: Day of the week(0-7 [7 or 0 == Sunday])
इस सिंटैक्स के साथ कुछ ऑपरेटरों का उपयोग शेड्यूलिंग परिभाषा को कारगर बनाने के लिए किया जा सकता है और ये प्रतीक एक फ़ील्ड में कई मान निर्दिष्ट करने की अनुमति देते हैं:
तारांकन (*) - इसका अर्थ है किसी फ़ील्ड के लिए सभी संभावित मान
अल्पविराम (,) - मूल्यों की सूची को परिभाषित करने के लिए प्रयोग किया जाता है
डैश (-) - मानों की श्रेणी को परिभाषित करने के लिए उपयोग किया जाता है
विभाजक (/) - एक चरण मान निर्दिष्ट करता है
स्क्रिप्ट all_db_backup.sh प्रत्येक शेड्यूलिंग एक्सप्रेशन के अनुसार निष्पादित की जाएगी:
0 6 * * * /home/backup/all_db_backup.sh | हर दिन सुबह 6 बजे |
20 22 * * सोम, मंगल, बुध, गुरु, शुक्र /home/backup/all_db_backup.sh | हर सप्ताह रात 10:20 बजे |
0 23 * * 1-5 /home/backup/all_db_backup.sh | सप्ताह के दौरान रात 11 बजे |
0 0/5 14 * * /home/backup/all_db_backup.sh | हर पांच घंटे में दोपहर 2:00 बजे से शुरू होता है। और हर दिन दोपहर 2:55 बजे समाप्त होता है |
यदि उपयोगकर्ता के लिए crontab फ़ाइल मौजूद नहीं है, तो इसे निम्न कमांड द्वारा बनाया जा सकता है:
[email protected]:~$ crontab -e
या -l पैरामीटर का उपयोग करके इसे प्रस्तुत किया:
[email protected]:~$ crontab -l
यदि इस फ़ाइल को निकालने के लिए आवश्यक है, तो उपयुक्त पैरामीटर है -r:
[email protected]:~$ crontab -r
क्रोन डेमॉन स्थिति निम्न कमांड के निष्पादन द्वारा दिखाई जाती है:
एजेंट pgAgent
pgAgent PostgreSQL के लिए उपलब्ध एक जॉब शेड्यूलिंग एजेंट है जो संग्रहीत कार्यविधियों, SQL कथनों और शेल स्क्रिप्ट के निष्पादन की अनुमति देता है। इसका कॉन्फ़िगरेशन क्लस्टर में पोस्टग्रेज़ डेटाबेस पर संग्रहीत होता है।
इसका उद्देश्य यह है कि यह एजेंट लिनक्स सिस्टम पर एक डेमॉन के रूप में चल रहा है और समय-समय पर यह जांचने के लिए डेटाबेस से कनेक्शन करता है कि कोई कार्य निष्पादित करने के लिए है या नहीं।
यह शेड्यूलिंग आसानी से PgAdmin 4 द्वारा प्रबंधित किया जाता है, लेकिन यह डिफ़ॉल्ट रूप से एक बार pgAdmin स्थापित होने के बाद स्थापित नहीं होता है, इसे स्वयं डाउनलोड और इंस्टॉल करना आवश्यक है।
इसके बाद pgAgent के ठीक से काम करने के लिए सभी आवश्यक चरणों का वर्णन किया गया है:
एक कदम
pgAdmin 4 की स्थापना
$ sudo apt install pgadmin4 pgadmin4-apache
दूसरा चरण
परिभाषित नहीं होने पर plpgsql प्रक्रियात्मक भाषा का निर्माण
CREATE TRUSTED PROCEDURAL LANGUAGE ‘plpgsql’
HANDLER plpgsql_call_handler
HANDLER plpgsql_validator;
चरण तीन
pgAgent
. की स्थापना$ sudo apt-get install pgagent
चरण चार
पेजेंट एक्सटेंशन का निर्माण
CREATE EXTENSION pageant
यह एक्सटेंशन pgAgent संचालन के लिए सभी तालिकाओं और कार्यों का निर्माण करेगा और इसके बाद इस एक्सटेंशन द्वारा उपयोग किया गया डेटा मॉडल दिखाया जाएगा:
अब pgAdmin इंटरफ़ेस में पहले से ही "pgAgent Jobs" का विकल्प है ताकि pgAgent प्रबंधित करें:
नई नौकरी को परिभाषित करने के लिए, यह केवल आवश्यक है "बनाएं" चुनें "pgAgent Jobs" पर दाएं बटन का उपयोग करके, और यह इस कार्य के लिए एक पदनाम सम्मिलित करेगा और इसे निष्पादित करने के चरणों को परिभाषित करेगा:
टैब में "शेड्यूल" को इस नए कार्य के लिए शेड्यूलिंग परिभाषित किया जाना चाहिए :
आखिरकार, एजेंट को बैकग्राउंड में चलाने के लिए यह आवश्यक है कि वह लॉन्च करे मैन्युअल रूप से निम्नलिखित प्रक्रिया:
/usr/bin/pgagent host=localhost dbname=postgres user=postgres port=5432 -l 1
फिर भी, इस एजेंट के लिए सबसे अच्छा विकल्प पिछले आदेश के साथ एक डेमॉन बनाना है।
एक्सटेंशन pg_cron
pg_cron PostgreSQL के लिए एक क्रॉन-आधारित जॉब शेड्यूलर है जो डेटाबेस के अंदर एक एक्सटेंशन के रूप में चलता है (Oracle में DBMS_SCHEDULER के समान) और डेटाबेस से सीधे डेटाबेस कार्यों के निष्पादन की अनुमति देता है, एक के कारण पृष्ठभूमि कार्यकर्ता।
कार्य करने के लिए निम्न में से कोई भी कार्य हो सकता है:
- संग्रहीत प्रक्रियाएं
- एसक्यूएल विवरण
- PostgreSQL कमांड (जैसे VACUUM, या VACUUM ANALYZE)
pg_cron समानांतर में कई कार्य चला सकता है, लेकिन एक समय में एक प्रोग्राम का केवल एक उदाहरण चल सकता है।
यदि पहला रन पूरा होने से पहले दूसरा रन शुरू किया जाना चाहिए, तो यह कतार में है और पहला रन पूरा होते ही शुरू हो जाएगा।
यह एक्सटेंशन PostgreSQL के 9.5 या उच्चतर संस्करण के लिए परिभाषित किया गया था।
pg_cron की स्थापना
इस एक्सटेंशन की स्थापना के लिए केवल निम्नलिखित कमांड की आवश्यकता होती है:
[email protected]:~$ sudo apt-get -y install postgresql-10-cron
कॉन्फ़िगरेशन फ़ाइलें अपडेट करना
एक बार PostgreSQL सर्वर शुरू होने के बाद pg_cron बैकग्राउंड वर्कर शुरू करने के लिए, postgresql.conf में pg_cron को shared_preload_libraries पैरामीटर पर सेट करना आवश्यक है:
shared_preload_libraries = ‘pg_cron’
इस फ़ाइल में यह परिभाषित करना भी आवश्यक है कि किस डेटाबेस पर निम्नलिखित पैरामीटर जोड़कर pg_cron एक्सटेंशन बनाया जाएगा:
cron.database_name= ‘postgres’
दूसरी ओर, प्रमाणीकरण का प्रबंधन करने वाली pg_hba.conf फ़ाइल में, IPV4 कनेक्शन के लिए पोस्टग्रेज़ लॉगिन को ट्रस्ट के रूप में परिभाषित करना आवश्यक है, क्योंकि pg_cron को ऐसे उपयोगकर्ता को डेटाबेस से कनेक्ट करने में सक्षम होने की आवश्यकता होती है। कोई पासवर्ड प्रदान किए बिना, इसलिए इस फ़ाइल में निम्न पंक्ति जोड़ने की आवश्यकता है:
host postgres postgres 192.168.100.53/32 trust
प्रमाणीकरण की ट्रस्ट विधि किसी को भी pg_hba.conf फ़ाइल में निर्दिष्ट डेटाबेस से कनेक्ट करने की अनुमति देती है, इस मामले में डेटाबेस पोस्टग्रेज करता है। यह डेटाबेस तक पहुंचने के लिए एकल उपयोगकर्ता मशीन पर यूनिक्स डोमेन सॉकेट का उपयोग करके कनेक्शन की अनुमति देने के लिए अक्सर उपयोग की जाने वाली विधि है और इसका उपयोग केवल तभी किया जाना चाहिए जब सर्वर से कनेक्शन पर पर्याप्त ऑपरेटिंग सिस्टम-स्तरीय सुरक्षा हो।
दोनों परिवर्तनों के लिए PostgreSQL सेवा पुनरारंभ की आवश्यकता है:
[email protected]:~$ sudo system restart postgresql.service
यह ध्यान रखना महत्वपूर्ण है कि जब तक सर्वर हॉट स्टैंडबाय मोड में है, तब तक pg_cron कोई कार्य नहीं चलाता है, लेकिन सर्वर के प्रचारित होने पर यह स्वचालित रूप से प्रारंभ हो जाता है।
pg_cron एक्सटेंशन का निर्माण
यह एक्सटेंशन मेटा-डेटा और इसे प्रबंधित करने की प्रक्रियाओं का निर्माण करेगा, इसलिए निम्न कमांड को psql पर निष्पादित किया जाना चाहिए:
postgres=#CREATE EXTENSION pg_cron;
CREATE EXTENSION
अब, कार्य शेड्यूल करने के लिए आवश्यक ऑब्जेक्ट पहले से ही क्रॉन स्कीमा पर परिभाषित हैं :
यह एक्सटेंशन बहुत आसान है, सभी को प्रबंधित करने के लिए केवल जॉब टेबल ही काफी है यह कार्यक्षमता:
नई नौकरियों की परिभाषा
pg_cron पर नौकरियों को परिभाषित करने के लिए शेड्यूलिंग सिंटैक्स वही है जो क्रॉन टूल पर उपयोग किया जाता है, और नई नौकरियों की परिभाषा बहुत सरल है, केवल फ़ंक्शन को कॉल करना आवश्यक है cron.schedule:
select cron.schedule('*/5 * * * *','CALL reporting.p_compute_client_data(12356,''DAILY_DATA'');')
select cron.schedule('*/5 * * * *','CALL reporting.p_compute_client_data(998934,''WEEKLY_DATA'');')
select cron.schedule('*/5 * * * *','CALL reporting.p_compute_client_data(45678,''DAILY_DATA'');')
select cron.schedule('*/5 * * * *','CALL reporting.p_compute_client_data(1010,''WEEKLY_DATA'');')
select cron.schedule('*/5 * * * *','CALL reporting.p_compute_client_data(1001,''MONTHLY_DATA'');')
select cron.schedule('*/5 * * * *','select reporting.f_reset_client_data(0,''DATA'')')
select cron.schedule('*/5 * * * *','VACUUM')
select cron.schedule('*/5 * * * *','$$DELETE FROM reporting.rep_request WHERE create_dt<now()- interval '60 DAYS'$$)
कार्य सेटअप कार्य तालिका पर संग्रहीत है:
नौकरी को परिभाषित करने का दूसरा तरीका क्रॉन पर सीधे डेटा डालना है .जॉब टेबल:
INSERT INTO cron.job (schedule, command, nodename, nodeport, database, username)
VALUES ('0 11 * * *','call loader.load_data();','postgresql-pgcron',5442,'staging', 'loader');
और किसी भिन्न मशीन (साथ ही अन्य डेटाबेस) से कनेक्ट करने के लिए नोडनाम और नोडपोर्ट के लिए कस्टम मानों का उपयोग करें।
नौकरियों का निष्क्रिय होना
दूसरी ओर, किसी कार्य को निष्क्रिय करने के लिए केवल निम्नलिखित कार्य निष्पादित करना आवश्यक है:
select cron.schedule(8)
जॉब लॉगिंग
इन नौकरियों की लॉगिंग PostgreSQL लॉग फ़ाइल /var/log/postgresql/postgresql-12-main.log:
पर देखी जा सकती है।