Postgresql FDW (Foreign Data Wrapper)

Cihat Küçükbağrıaçık
4 min readApr 17, 2023

--

Microservice servis mimarilerde genel tercih her servis için ayrı bir veritabanı oluşturulması ön görülür. Postgresql ile sorgu yazarken kendi veritabanı içinde yani schema, tablespace veya tablolar arasında kolaylıkla sorgu yazabilirsiniz. Ancak aynı instance içinde var olan iki farklı veritabanı arasında bir sorgu yazmak istediğinizde FDW veya DBLINK gibi eklentiler kullanmanız gerekmektedir. FDW Postgresql 9.1 versiyonu ile Postgresql direkt olarak kendisinin sunduğu bir teknolojidir. Biz bu yazımızda FDW üzerinden örnekler yapacağız.

Ayrıca MSSQL, Oracle, Mysql gibi diğer ilişkisel veritabanlarında bağlantı sağlanabilir. Böylelikle farklı veritabanlarından verilerimize kolayla erişim sağlayabiliriz. Bu yazıda ayrıca “tds_fdw” eklentisi ile MSSQL üzerinden veri çekme işlemini gerçekleştireceğiz. Bu arada MSSQL de “Linked Server” ne ise, Postgresql de ise FDW odur. Benzer görev tanımları mevcuttur.

Postgresql Kurulu Olan İki Farklı Veritabanı Arasında FDW İşlemi

İlk olarak iki farklı veritabanı oluşturmakla işleme başlayalım.

-- Veritabanlarını listele.
\l+

-- 1. veritabanını oluştur.
create database test_db1;

-- 2. veritabanını oluştur.
create database test_db2;

-- Veritabanlarını listele.
\l+

Sonraki işlem olarak test tablosu oluşturup içini örnek data ile dolduruyoruz.

-- test_db1 veritabanına geçiş yapıyoruz.
\c test_db1

-- Test tablomuzu oluşturuyoruz.
create table test_tbl (id serial, name varchar);

-- Test verilerini basıyoruz.
insert into test_tbl select id, md5(random()::text) FROM generate_series(1,100) id;

-- Verileri kontrol ediyoruz.
select * from test_tbl limit 10;

Test ortamımız hazır olduğuna göre artık FDW kurulumuna geçebiliriz.
FDW kurulumunu “test_db2” veritabanına yapacağız. Veriyi “test_db1” veritabanından çekeceğiz. Extension kurulumu yapıp. Foreign Server tanımlayacağız. Oluşturduğumuz Foreign Servere erişim sağlanacak kullanıcı tanımı yapıyoruz. Son olarak da tablomuzu oluşturuyoruz.

-- test_db2 veritabanına geçiş yapıyoruz.
\c test_db2

-- Yüklü olan extensionları listeliyoruz.
\dx

-- postgres_fdw extension yüklü değil ise yükle.
CREATE EXTENSION IF NOT EXISTS postgres_fdw;

-- Yüklü olan extensionları listeliyoruz.
\dx

-- Sunucu erişim bilgileri ile Foreign Server oluşturuyoruz.
CREATE SERVER IF NOT EXISTS fs_test_db1
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (host 'localhost', port '5432', dbname 'test_db1');

-- Oluşturduğumuz Foreign Servere erişim sağlanacak kullanıcı tanımlıyoruz.
CREATE USER MAPPING IF NOT EXISTS FOR postgres
SERVER fs_test_db1
OPTIONS (user 'postgres', password '123456');

-- test_db1 veritabanındaki public.test_tbl tablosundan verileri çekmesini sağlıyoruz.
CREATE FOREIGN TABLE IF NOT EXISTS public.fdw_test_tbl (
id serial,
name varchar
)
SERVER fs_test_db1
OPTIONS (schema_name 'public', table_name 'test_tbl');

-- Verileri kontrol ediyoruz.
select * from fdw_test_tbl limit 10;

İşlemimiz tamamdır artık aynı sistem üzerinde farklı DB’ler üzerinden veri aktarımları tanımlayabiliyoruz. İstenir ise farklı bir Postgresql sunucu üzerinden de erişim sağlanabilir. Foreign Server tanımlanırken IP adresini, portunu ve DB ismini bilmeniz yeterlidir. Ayrıca bu işlemleri silmek veya düzenlemek isterseniz. Aşağıdaki kodlara göz atabilirsiniz.

-- Oluşturduğumuz tabloyu silmek için.
DROP FOREIGN TABLE fdw_test_tbl;

-- Oluşturduğumuz mapping silmek için.
DROP USER MAPPING FOR postgres SERVER fs_test_db1;

-- Oluşturduğumuz foreign server silmek için.
DROP SERVER fs_test_db1;

-- Oluşturduğumuz foreign server host bilgisini değiştirmek için.
-- port ve dbname alanlarını host yerine yazarak onlarıda düzenleyebilirsiniz.
ALTER SERVER fs_test_db1 options (set host '172.16.104.130');

-- Oluşturduğumuz extension silmek için.
DROP EXTENSION postgres_fdw;

MSSQL Veritabanından Postgresql Veritabanına Tablo Oluşturulması

MSSQL veritabanında bulunan tabloyu, Postgresql tarafında listeleyebilmek için “tds_fdw” eklentisini kullanacağız. “tds_fdw” eklentisi Postgresql paketleri üzerinde varsayılan olarak gelmediği için ilk önce paketleri indirip kurulumunu tamamlamanız gerekmektedir. Aşağıdaki kendi kurulum linki iletiyorum.

tds_fdw eklentisini “test_db2” veritabanına oluşturuyoruz. Yukardaki işlemlerin neredeyse aynısını burada da tanımlıyoruz. Tek değişen şey MSSQL bağlantı bilgileri

-- test_db2 veritabanına geçiş yapıyoruz.
\c test_db2

-- Yüklü olan extensionları listeliyoruz.
\dx

-- tds_fdw extension yüklüyoruz.
CREATE EXTENSION IF NOT EXISTS tds_fdw;

-- Yüklü olan extensionları listeliyoruz.
\dx

-- Sunucu erişim bilgileri ile Foreign Server oluşturuyoruz.
CREATE SERVER fs_mssql FOREIGN DATA WRAPPER tds_fdw
OPTIONS(servername '172.16.104.128',database 'test',port '1433');

-- Oluşturduğumuz Foreign Servere erişim sağlanacak kullanıcı tanımlıyoruz.
CREATE USER MAPPING FOR postgres
SERVER fs_mssql
OPTIONS (username 'sa', password '123456');

-- MSSQL de mevcut olan "test" veritabanında bulunan test.film tablosundaki verileri çekmesini sağlıyoruz.
CREATE FOREIGN TABLE fdw_film (id int, name varchar)
SERVER fs_mssql OPTIONS (query 'SELECT id, name FROM test.film');

-- Verileri kontrol ediyoruz.
select * from fdw_film;

Yukardaki drop işlemleri yine MSSQL deki Foreign Server içinde geçerlidir.

--

--

No responses yet