PostgreSQL Tablo ve Kolon Bazlı Logical Replication

PostgreSQL 15 veri tabanında kolon ve satır bazlı logical replication yapabilirsiniz.

PostgreSQL 15 veri tabanında kolon ve satır bazlı logical replication yapabilirsiniz.

PostgreSQL 15 sürümüyle birlikte tablolarda kolon ve satır bazlı filtreleme yaparak logical replication uygulanabilir hale geldi. Bu sayede tablolardaki istenilen kolonlar ve satırlarda replikasyon yapılabilmektedir. PostgreSQL 15 ile gelen önemli yeni özelliklere PostgreSQL 15 yazımızdan ulaşabilirsiniz.

Logical Replication

wal_level=logical

Logical replication için postgresql.conf dosyasında wal_level parametresinin logical olarak düzenlenmesi gerekir. Varsayılan olarak wal_level değeri replica olarak gelmektedir. replica değeri streaming replication için gerekli wal dosyalarının oluşmasını sağlar. wal_level parametresi logical olarak ayarlandığında ise replica değeri ile sağlanan wal bilgisine logical replication için de gerekli olan wal bilgilerinin eklenmesini sağlar. Yani wal_level parametresinin logical olarak ayarladığınızda replica değerini de kapsamaktadır ve streaming replication çalışmaya devam edebilmektedir. wal_level logical olarak çalıştığında wal dosyalarının boyutu büyümektedir. Parametre düzenlemesi her iki veri tabanında yapılır.

Örnek Veri Tabanı ve Tablolar

postgres=# CREATE DATABASE testdb;
CREATE DATABASE
postgres=# \c testdb
You are now connected to database “testdb” as user “postgres”.
testdb=# CREATE TABLE person(person_id int, name text, surname text, gender text, PRIMARY KEY(person_id));
CREATE TABLE
testdb=# INSERT INTO person values (1,’Fatih’,’Acar’,’Erkek’);
INSERT 0 1
testdb=# INSERT INTO person values (2,’Ayşe’,’Fatma’,’Kadın’);
INSERT 0 1
testdb=# INSERT INTO person values (3,’Ahmet’,’Mehmet’,’Erkek’);
INSERT 0 1

testdb=# select * from person;
person_id | name | surname | gender
———–+——-+———+——–
1 | Fatih | Acar | Erkek
2 | Ayşe | Fatma | Kadın
3 | Ahmet | Mehmet | Erkek
(3 rows)

Publication Oluşturma

Logical replication uygulanacak tablo ya da tabloların istenilen alanları da belirlenerek publication oluşturulur.

postgres=# CREATE PUBLICATION pub_person FOR TABLE person (person_id, name, surname);
CREATE PUBLICATION

 

Publication yapılan tabloda satır bazlı filtre eklemek için aşağıdaki gibi sorguya where şartı ekleyebilirsiniz.

CREATE PUBLICATION pub_person FOR TABLE person (person_id, name, surname) where (gender=’Erkek’);

Eğer tüm tabloları publication kapsamına almak isterseniz aşağıdaki sorguyu kullanabilirsiniz.

CREATE PUBLICATION pub_tablolar FOR ALL TABLES;

Belirli tabloları tüm alanlarıyla publication kapsamına almak isterseniz aşağıdaki sorguyu kullanabilirsiniz.

CREATE PUBLICATION pub_tablo123 FOR TABLE tablo1,tablo2,tablo3;

Replikasyon Kullanıcısı

Replikasyon için özel oluşturulmuş ve replikasyon uygulanacak tablolara yetkisi olan kullanıcıya ihtiyaç vardır. Örnek olarak repuser kullanıcısı aşağıdaki gibi oluşturulabilir.

[postgres@btcozumleri ~]$ createuser -p 5432 repuser -P –replication

postgres=# GRANT ALL ON person TO repuser;
GRANT

Subscription Oluşturma

Standby veri tabanında master veritabanındaki publication’da belirlenen kolonlar ile aynı olacak şekilde tablo oluşturulur.

postgres=# CREATE DATABASE testdb;
CREATE DATABASE
postgres=# \c testdb;
You are now connected to database “testdb” as user “postgres”.
testdb=# CREATE TABLE person(person_id int, name text, surname text, PRIMARY KEY(person_id));
CREATE TABLE

testdb=# CREATE SUBSCRIPTION sub_person CONNECTION ‘host=localhost dbname=testdb user=repuser password=123456 application_name=sub_person’ PUBLICATION pub_person;
NOTICE: created replication slot “sub_person” on publisher
CREATE SUBSCRIPTION

postgres=# \c testdb
You are now connected to database “testdb” as user “postgres”.
testdb=# select * from person;
person_id | name | surname
———–+——-+———
1 | Fatih | Acar
2 | Ayşe | Fatma
3 | Ahmet | Mehmet
(3 rows)

Standby veri tabanına veriler geldi. Master veri tabanından veri ekleme çıkarma işlemleri yaparak test işlemleri yapabilirsiniz.

select * from pg_replication_slots; ile master tarafta açık olan replication slotları listeyebilirsiniz.

Bilgisayar Yüksek Mühendisi | Lead Auditor | Oracle OCP