Ini adalah lanjutan dari entri blog saya sebelumnya yang membahas topik Ekstensi PostgreSQL. Ekstensi PostgreSQL adalah perangkat tambahan plug and play yang menambahkan set fitur tambahan ke cluster PostgreSQL. Beberapa fitur ini sesederhana membaca atau menulis ke database eksternal sementara yang lain bisa menjadi solusi canggih untuk mengimplementasikan replikasi database, pemantauan, dll.
PostgreSQL telah berkembang selama bertahun-tahun dari ORDBMS open source sederhana menjadi sistem database yang kuat dengan lebih dari 30 tahun pengembangan aktif yang menawarkan keandalan, kinerja, dan semua fitur yang sesuai dengan ACID. Dengan PostgreSQL 12 yang dirilis beberapa bulan lalu, software database ini semakin besar, lebih baik, dan lebih cepat.
Kadang-kadang, ekstensi perlu ditambahkan ke kluster PostgreSQL untuk mencapai fungsionalitas yang ditingkatkan yang tidak tersedia dalam kode asli, karena ekstensi tersebut tidak dikembangkan karena keterbatasan waktu atau karena kurangnya bukti database kasus tepi masalah. Saya akan membahas beberapa ekstensi favorit saya tanpa urutan tertentu, dengan beberapa demo yang digunakan oleh pengembang dan DBA.
Beberapa ekstensi ini mungkin perlu disertakan dalam parameter server shared_preload_libraries sebagai daftar yang dipisahkan koma untuk dimuat di awal server. Meskipun sebagian besar ekstensi disertakan dalam modul contrib kode sumber, beberapa harus diunduh dari situs web eksternal yang didedikasikan hanya untuk ekstensi PostgreSQL yang disebut Jaringan Ekstensi PostgreSQL.
Dalam seri blog dua bagian ini kita akan membahas ekstensi yang digunakan untuk mengakses data (postgres_fwd) dan menyusutkan atau mengarsipkan database (pg_partman). Ekstensi tambahan akan dibahas di bagian kedua.
postgres_fdw
Postgres_fdw adalah ekstensi pembungkus data asing yang dapat digunakan untuk mengakses data yang disimpan di server PostgreSQL eksternal. Ekstensi ini mirip dengan ekstensi lama yang disebut dblink tetapi berbeda dari pendahulunya dengan menawarkan sintaks yang sesuai standar dan kinerja yang lebih baik.
Komponen penting postgres_fdw adalah server, pemetaan pengguna, dan tabel asing. Ada overhead kecil yang ditambahkan ke biaya aktual untuk mengeksekusi kueri terhadap server jarak jauh yang merupakan overhead komunikasi. Ekstensi postgres_fdw juga mampu berkomunikasi dengan server jarak jauh yang memiliki versi hingga PostgreSQL 8.3, sehingga kompatibel dengan versi sebelumnya.
Demo
Demo akan menampilkan koneksi dari PostgreSQL 12 ke database PostgreSQL 11. Pengaturan pg_hba.conf telah dikonfigurasi agar server dapat berbicara satu sama lain. File kontrol ekstensi harus dimuat ke direktori beranda bersama PostgreSQL sebelum membuat ekstensi dari Di dalam kluster PostgreSQL.
Server Jarak Jauh:
$ /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)
Server Sumber:
$ /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)
Operasi MENULIS dari server sumber langsung mencerminkan tabel server jauh. Ekstensi serupa yang disebut oracle_fdw juga ada yang memungkinkan akses BACA dan TULIS antara tabel PostgreSQL dan Oracle. Selain itu, ada ekstensi lain yang disebut file_fdw yang memungkinkan akses data dari file datar di disk. Silakan merujuk ke dokumentasi resmi postgres_fdw yang diterbitkan di sini, untuk informasi dan detail lebih lanjut.
pg_partman
Seiring dengan pertumbuhan database dan tabel, selalu ada kebutuhan untuk mengecilkan database, mengarsipkan data yang tidak diperlukan, atau setidaknya mempartisi tabel menjadi berbagai fragmen yang lebih kecil. Ini agar pengoptimal kueri hanya mengunjungi bagian tabel yang memenuhi kondisi kueri, bukan memindai seluruh tumpukan tabel.
PostgreSQL telah lama menawarkan fitur partisi termasuk Range, List, Hash, dan teknik Sub-partisi. Namun, ini memerlukan banyak upaya administrasi dan manajemen seperti mendefinisikan tabel anak yang mewarisi properti tabel induk menjadi partisinya, membuat fungsi pemicu untuk mengarahkan data ke partisi dan selanjutnya membuat pemicu untuk memanggil fungsi tersebut, dll. di mana pg_partman berperan, di mana semua kerepotan ini ditangani secara otomatis.
Demo
Saya akan menunjukkan demo cepat untuk menyiapkan dan memasukkan data sampel. Anda akan melihat bagaimana data yang dimasukkan ke dalam tabel utama secara otomatis dialihkan ke partisi hanya dengan mengatur pg_partman. Penting agar kolom kunci partisi tidak kosong.
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)
Ini adalah teknik partisi sederhana tetapi setiap partisi sederhana di atas dapat dibagi lagi menjadi sub-partisi. Silakan periksa dokumentasi resmi pg_partman yang diterbitkan di sini, untuk lebih banyak fitur dan fungsi yang ditawarkannya.
Kesimpulan
Bagian kedua dari blog ini akan membahas ekstensi PostgreSQL lainnya seperti pgAudit, pg_repack dan HypoPG.