यह मेरी पिछली ब्लॉग प्रविष्टि के क्रम में है जिसमें मैंने PostgreSQL एक्सटेंशन के एक विषय को छुआ था। PostgreSQL एक्सटेंशन एन्हांसमेंट का एक प्लग एंड प्ले सेट है जो PostgreSQL क्लस्टर में एक अतिरिक्त फीचर-सेट जोड़ता है। इनमें से कुछ विशेषताएं बाहरी डेटाबेस को पढ़ने या लिखने जैसी सरल हैं, जबकि अन्य डेटाबेस प्रतिकृति, निगरानी आदि को लागू करने के लिए एक परिष्कृत समाधान हो सकती हैं।
PostgreSQL पिछले कुछ वर्षों में एक साधारण ओपन सोर्स ORDBMS से एक शक्तिशाली डेटाबेस सिस्टम के रूप में विकसित हुआ है जिसमें 30 से अधिक वर्षों के सक्रिय विकास के साथ विश्वसनीयता, प्रदर्शन, और सभी ACID अनुपालन सुविधाएँ हैं। कुछ महीने पहले जारी किए गए PostgreSQL 12 के साथ, यह डेटाबेस सॉफ़्टवेयर केवल बड़ा, बेहतर और तेज़ होता जा रहा है।
कभी-कभी, उन्नत कार्यक्षमता प्राप्त करने के लिए एक PostgreSQL क्लस्टर में एक्सटेंशन जोड़ने की आवश्यकता होती है जो मूल कोड में अनुपलब्ध थे, क्योंकि वे या तो समय की कमी के कारण या एज केस डेटाबेस के अपर्याप्त साक्ष्य के कारण विकसित नहीं हुए थे। समस्या। मैं अपने कुछ पसंदीदा एक्सटेंशन पर बिना किसी विशेष क्रम के चर्चा करने जा रहा हूं, कुछ डेमो के साथ जो डेवलपर्स और डीबीए द्वारा उपयोग किए जाते हैं।
इनमें से कुछ एक्सटेंशन को शेयर्ड_प्रीलोड_लाइब्रेरी सर्वर पैरामीटर में कॉमा से अलग की गई सूची के रूप में शामिल करने की आवश्यकता हो सकती है, जिसे सर्वर प्रारंभ होने पर प्रीलोड किया जाएगा। हालांकि अधिकांश एक्सटेंशन स्रोत कोड के योगदान मॉड्यूल में शामिल हैं, कुछ को केवल PostgreSQL एक्सटेंशन को समर्पित बाहरी वेबसाइट से डाउनलोड करना होगा जिसे PostgreSQL एक्सटेंशन नेटवर्क कहा जाता है।
इस दो भाग ब्लॉग श्रृंखला में हम डेटा (postgres_fwd) तक पहुंचने और डेटाबेस को सिकोड़ने या संग्रहीत करने के लिए उपयोग किए जाने वाले एक्सटेंशन (pg_partman) पर चर्चा करेंगे। दूसरे भाग में अतिरिक्त एक्सटेंशन पर चर्चा की जाएगी।
postgres_fdw
postgres_fdw एक विदेशी डेटा रैपर एक्सटेंशन है जिसका उपयोग बाहरी PostgreSQL सर्वर में संग्रहीत डेटा तक पहुंचने के लिए किया जा सकता है। यह एक्सटेंशन एक पुराने एक्सटेंशन के समान है जिसे dblink कहा जाता है, लेकिन यह मानकों के अनुरूप सिंटैक्स और बेहतर प्रदर्शन की पेशकश करके अपने पूर्ववर्ती से अलग है।
postgres_fdw के महत्वपूर्ण घटक एक सर्वर, एक उपयोगकर्ता मैपिंग और एक विदेशी तालिका हैं। दूरस्थ सर्वर के विरुद्ध प्रश्नों को निष्पादित करने की वास्तविक लागत में एक मामूली ओवरहेड जोड़ा जाता है जो संचार ओवरहेड है। postgres_fdw एक्सटेंशन एक दूरस्थ सर्वर के साथ संचार करने में भी सक्षम है, जिसका संस्करण PostgreSQL 8.3 तक है, इस प्रकार यह पिछले संस्करणों के साथ पिछड़ा संगत है।
डेमो
डेमो PostgreSQL 12 से PostgreSQL 11 डेटाबेस के लिए एक कनेक्शन प्रदर्शित करेगा। सर्वर के लिए एक दूसरे से बात करने के लिए pg_hba.conf सेटिंग्स को पहले ही कॉन्फ़िगर किया जा चुका है। एक PostgreSQL क्लस्टर के अंदर से एक्सटेंशन बनाने से पहले एक्सटेंशन नियंत्रण फ़ाइलों को PostgreSQL साझा होम निर्देशिका में लोड किया जाना है।
रिमोट सर्वर:
$ /usr/local/pgsql-11.3/bin/psql -p 5432 -d db_replica postgres
psql (11.3)
Type "help" for help.
db_replica=# create table t1 (sno integer, emp_id text);
CREATE TABLE
db_replica=# \dt t1
List of relations
Schema | Name | Type | Owner
--------+------+-------+----------
public | t1 | table | postgres
db_replica=# insert into t1 values (1, 'emp_one');
INSERT 0 1
db_replica=# select * from t1;
sno | emp_id
-----+---------
1 | emp_one
(1 row)
स्रोत सर्वर:
$ /database/pgsql-12.0/bin/psql -p 5732 postgres
psql (12.0)
Type "help" for help.
postgres=# CREATE EXTENSION postgres_fdw;
CREATE EXTENSION
postgres=# CREATE SERVER remote_server
postgres-# FOREIGN DATA WRAPPER postgres_fdw
postgres-# OPTIONS (host '192.168.1.107', port '5432', dbname 'db_replica');
CREATE SERVER
postgres=# CREATE USER MAPPING FOR postgres
postgres-# SERVER remote_server
postgres-# OPTIONS (user 'postgres', password 'admin123');
CREATE USER MAPPING
postgres=# CREATE FOREIGN TABLE remote_t1
postgres-# (sno integer, emp_id text)
postgres-# server remote_server
postgres-# options (schema_name 'public', table_name 't1');
CREATE FOREIGN TABLE
postgres=# select * from remote_t1;
sno | emp_id
-----+---------
1 | emp_one
(1 row)
postgres=# insert into remote_t1 values (2,'emp_two');
INSERT 0 1
postgres=# select * from remote_t1;
sno | emp_id
-----+---------
1 | emp_one
2 | emp_two
(2 rows)
सोर्स सर्वर से राइट ऑपरेशन रिमोट सर्वर टेबल को तुरंत दर्शाता है। oracle_fdw नामक एक समान एक्सटेंशन भी मौजूद है जो PostgreSQL और Oracle तालिकाओं के बीच READ और WRITE पहुंच को सक्षम बनाता है। इसके अलावा, एक और एक्सटेंशन है जिसे file_fdw कहा जाता है जो डिस्क पर फ्लैट फाइलों से डेटा एक्सेस को सक्षम बनाता है। अधिक जानकारी और विवरण के लिए कृपया यहाँ प्रकाशित postgres_fdw के आधिकारिक दस्तावेज़ देखें।
pg_partman
जैसे-जैसे डेटाबेस और टेबल बढ़ते हैं, डेटाबेस को सिकोड़ने की जरूरत होती है, डेटा को संग्रहित करने की आवश्यकता नहीं होती है या कम से कम टेबल को विभिन्न छोटे टुकड़ों में विभाजित करने की आवश्यकता होती है। ऐसा इसलिए है कि क्वेरी ऑप्टिमाइज़र टेबल के पूरे ढेर को स्कैन करने के बजाय केवल टेबल के उन हिस्सों पर जाता है जो क्वेरी शर्तों को पूरा करते हैं।
PostgreSQL लंबे समय से विभाजन सुविधाओं की पेशकश कर रहा है, जिसमें रेंज, सूची, हैश और उप-विभाजन तकनीक शामिल हैं। हालाँकि, इसके लिए बहुत सारे प्रशासन और प्रबंधन प्रयासों की आवश्यकता होती है जैसे कि चाइल्ड टेबल को परिभाषित करना जो एक मूल तालिका के गुणों को उसके विभाजन बनने के लिए विरासत में मिला है, डेटा को एक विभाजन में पुनर्निर्देशित करने के लिए ट्रिगर फ़ंक्शन बनाना और उन कार्यों को कॉल करने के लिए ट्रिगर बनाना आदि। यह है जहां pg_partman खेल में आता है, जिसमें इन सभी परेशानियों का स्वतः समाधान हो जाता है।
डेमो
मैं चीजों को सेट करने और नमूना डेटा डालने का एक त्वरित डेमो दिखाऊंगा। आप देखेंगे कि कैसे मुख्य तालिका में डाला गया डेटा केवल pg_partman को सेट करके स्वचालित रूप से विभाजन पर पुनर्निर्देशित हो जाता है। यह महत्वपूर्ण है कि पार्टीशन कुंजी कॉलम रिक्त न हो।
db_replica=# show shared_preload_libraries;
shared_preload_libraries
--------------------------
pg_partman_bgw
(1 row)
db_replica=# CREATE SCHEMA partman;
CREATE SCHEMA
db_replica=# CREATE EXTENSION pg_partman SCHEMA partman;
CREATE EXTENSION
db_replica=# CREATE ROLE partman WITH LOGIN;
CREATE ROLE
db_replica=# GRANT ALL ON SCHEMA partman TO partman;
GRANT
db_replica=# GRANT ALL ON ALL TABLES IN SCHEMA partman TO partman;
GRANT
db_replica=# GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA partman TO partman;
GRANT
db_replica=# GRANT EXECUTE ON ALL PROCEDURES IN SCHEMA partman TO partman;
GRANT
db_replica=# GRANT ALL ON SCHEMA PUBLIC TO partman;
GRANT
db_replica=# create table t1 (sno integer, emp_id varchar, date_of_join date not null);
db_replica=# \d
List of relations
Schema | Name | Type | Owner
--------+------+-------+----------
public | t1 | table | postgres
(1 row)
db_replica=# \d t1
Table "public.t1"
Column | Type | Collation | Nullable | Default
--------------+-------------------+-----------+----------+---------
sno | integer | | |
emp_id | character varying | | |
date_of_join | date | | not null |
db_replica=# SELECT partman.create_parent('public.t1', 'date_of_join', 'partman', 'yearly');
create_parent
---------------
t
(1 row)
db_replica=# \d+ t1
Table "public.t1"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
--------------+-------------------+-----------+----------+---------+----------+--------------+-------------
sno | integer | | | | plain | |
emp_id | character varying | | | | extended | |
date_of_join | date | | not null | | plain | |
Triggers:
t1_part_trig BEFORE INSERT ON t1 FOR EACH ROW EXECUTE PROCEDURE t1_part_trig_func()
Child tables: t1_p2015,
t1_p2016,
t1_p2017,
t1_p2018,
t1_p2019,
t1_p2020,
t1_p2021,
t1_p2022,
t1_p2023
db_replica=# select * from t1;
sno | emp_id | date_of_join
-----+--------+--------------
(0 rows)
db_replica=# select * from t1_p2019;
sno | emp_id | date_of_join
-----+--------+--------------
(0 rows)
db_replica=# select * from t1_p2020;
sno | emp_id | date_of_join
-----+--------+--------------
(0 rows)
db_replica=# insert into t1 values (1,'emp_one','01-06-2019');
INSERT 0 0
db_replica=# insert into t1 values (2,'emp_two','01-06-2020');
INSERT 0 0
db_replica=# select * from t1;
sno | emp_id | date_of_join
-----+---------+--------------
1 | emp_one | 2019-01-06
2 | emp_two | 2020-01-06
(2 rows)
db_replica=# select * from t1_p2019;
sno | emp_id | date_of_join
-----+---------+--------------
1 | emp_one | 2019-01-06
(1 row)
db_replica=# select * from t1_p2020;
sno | emp_id | date_of_join
-----+---------+--------------
2 | emp_two | 2020-01-06
(1 row)
यह एक सरल विभाजन तकनीक है लेकिन उपरोक्त प्रत्येक सरल विभाजन को आगे उप-विभाजन में विभाजित किया जा सकता है। अधिक सुविधाओं और कार्यों के लिए कृपया यहां प्रकाशित pg_partman के आधिकारिक दस्तावेज़ देखें।
निष्कर्ष
इस ब्लॉग के भाग दो में अन्य PostgreSQL एक्सटेंशन जैसे pgAudit, pg_repack और HypoPG पर चर्चा होगी।