Skip to main content

PostgreSQL'de TDS_FDW Kullanımı

Merhaba,

Veritabanlarında oluşturduğunuz sorguları sadece kendi veritabanınızdaki tabloları kullanarak oluşturmak istemeyebilirsiniz. DWH'de kulanılan sorgular, finans sorguları vs. için bazen tek bir veritabanı yerine farklı cluster'lar üzerindeki veritabanları arasında da sorgu yazma ihtiyacı doğabilir ve bu ihtiyaç farklı sadece aynı veritabanı arasında değil, farklı sunucular üzerinde ki veritabanlarıyla da çalışma ihtiyacını doğurabilir.

Bu ihtiyaç için PostgreSQL'de Foreign Data Wrappers(FDW) kullanılmaktadır. Bir kaç farklı çeşit FDW bulunmaktadır. En çok bilinenleri postgres_fdw ve tds_fdw dir. postgres_fdw, PostgreSQL-PostgreSQL veritabanları arasında erişimi sağlar. tds_fdw, PostgreSQL ile SQL Server veya SysBase veritabanları arasında erişimi sağlar.

tds_fdw, Tabular Data Stream protokolünü kullanır. Bu protokol farklı sunucu ve istemci arasında data transferini sağlar.

tds_fdw kurulumu için izlenmesi gereken sıra aşağıdaki gibidir.
 

CREATE EXTENSION tds_fdw;
CREATE SERVER ...
CREATE USER MAPPING ...
CREATE FOREIGN TABLE/IMPORT FDW SCHEMA


Yukarıdaki dört adımı izleyerek tds_fdw kurulumunu yapabiliriz.

tds_fdw kurulumu için öncelikle tds_fdw için kullanılan paketi kaynak koddan derlemelisiniz.


PostgreSQL10 üzerine güncel tds_fdw sürümü 2.0.0 kurulumunun CentOS/RHEL üzerinde yapılması için izlenmesi gereken adımlar şöyledir:

sudo yum install epel-release
sudo yum install freetds freetds-devel

export TDS_FDW_VERSION="2.0.0" 

wget https://github.com/tds-fdw/tds_fdw/archive/v2.0.0-alpha.2.tar.gz -O tds_fdw-${TDS_FDW_VERSION}.tar.gz 
tar -xvzf tds_fdw-${TDS_FDW_VERSION}.tar.gz 
cd tds_fdw-${TDS_FDW_VERSION} 
PATH=/usr/<pgsql-10>/bin:$PATH 
make USE_PGXS=1 
sudo PATH=/usr/pgsql-10/bin:$PATH 
make USE_PGXS=1 install

PostgreSQL10 üzerinde güncel tds_fdw 2.0.0 sürümünü Ubuntu üzerinde kurmak için izlenmasi gereken adımlar;

sudo apt-get install libsybdb5 freetds-dev freetds-common

wget https://github.com/tds-fdw/tds_fdw/archive/v2.0.0-alpha.2.tar.gz 
cd tds_fdw-2.0.0 
make USE_PGXS=1 
sudo make USE_PGXS=1 install  

Tds_fdw konusuna başlamadan önce dikkat edilmesi gereken konulardan birisi eğer makinanın slave'i varsa CREATE EXTENSION komutunu master üzerinde kullanmadan önce slave üzerinde fdw paketinin kurulması gerekliliğidir. Aksi taktirde slave üzerinde CREATE EXTENSION ile fdw kurulmak istendiğinde slave makinasında eklenti kurmak için gereken paket kurulmamış olduğundan hata verecektir.

Extension

Paket kurulumundan sonra PostgreSQL veritabanınız üzerinde tds_fdw için kullanacağınız eklentiyi aşağıdaki komutla birlikte kurabilirsiniz.

CREATE EXTENSION tds_fdw;

Hedef veritabanına erişecek PostgreSQL veritabanı üzerinde eklenti kurulmalıdır. Yani PostgreSQL veritabanında kurduğunuz tds_fdw eklentinizi diğer veritabanında kullanamazsınız. Dolayısıyla ilgili veritabanı üzerinde eklenti kurulumu ve diğer işlemlerin yapılması gerekir.


Kurduğunuz paketi görüntülemek için aşağıdaki scripti kullanabilirsiniz.

select name from pg_available_extensions where name='tds_fdw';

Server

Karşı taraftaki sunucu ve üzerinde koşulan veritabanının ne olduğunu ve nasıl ulaşılacağını PostgreSQL tarafında bildirmek için SERVER oluşturmalıyız. Server oluşturmak için gereken komut şöyledir:

CREATE SERVER <server_ismi> FOREIGN DATA WRAPPER tds_fdw OPTIONS(....);

Options alanında kullanılan parametreler; servername, port ve database. Diğer parametreler; language, character_set, , dbuse, tds_version, msg_handler, row_estimate_method, use_remote_estimate, fdw_startup_cost, fdw_tuple_cost'dir.


En sık kullanılan üç parametre;
  • Servername: hedef veritabanının bulunduğu makinaya ait hostname'ini veya IP değerini girmelisiniz.
  • Port: hedef veritabanının kullandığı port bilgisi olmalı.
  • Database: hedef veritabanı adı olmalı.
Örnek bir CREATE SERVER scripti şöyle olabilir.CREATE SERVER test_fdw_server FOREIGN DATA WRAPPER tds_fdw OPTIONS(servername '192.168.8.8', port '1433', database 'hedef_db');

Server listesini görüntülemek için sistem kataloğu olan pg_foreign_Server ile aşağıdaki scriptteki gibi ya da psql komutu olan \des+ komutunu kullanabilirsiniz. 

select name, wrapper from pg_foreign_Server;

Oluşturduğunuz Server'i silmek için aşağıdaki scripti kullanabilirsiniz. Eğer server'a bağlı User Mapping varsa önce onu silmelisiniz.

DROP SERVER <server_ismi>; 

User Mapping

Hedef veritabanının ne olduğunu PostgreSQL tarafında belirledikten sonra bu veritabanına PostgreSQL veritabanı üzerinden erişim sağlayacak kullanıcıların belirlenmesi gerekir. Bu kullanıcıları USER MAPPING oluşturarak belirleyeceğiz. PostgreSQL ve SQL Server arasında bağlantıyı sağlamak için SQL server/Sysbase veritabanları üzerinde mevcut olan ve kullanmak istediğimiz tablolara erişim yetkisi olan kullanıcıya ait kullanıcı adı ve parolasına ihtiyacımız var bu noktada. 

CREATE USER MAPPING syntax'ı şöyledir:
 

CREATE USER MAPPING FOR <PostgreSQL veritabanındaki bir kullanıcı> server <server_ismi> options(....); 

User mapping oluşturmak için her iki taraftaki kullanıcılara da ihtiyacımız var. PostgreSQL de karşı taraftaki tablolara erişmesini istediğimiz kullanıcıyı belirlemeliyiz. Sonrasında da hedef veritabanındaki bir kullanıcı üzerinden fdw tablolarına erişim sağlayacağız. 

Örnek bir CREATE USER MAPPING scripti şöyle oluşturulabilir.  

CREATE USER MAPPING FOR postgres SERVER test_fdw_server OPTIONS(username 'sqlserver_kullanicisi', password 'password');
Hangi server üzerinden hangi kullanıcıyla karşı tarafa erişeceği bilgisini belirlemiş olduk.

User mapping, postgres kullanıcısı dışında PostgreSQL üzerinde bulunan diğer kullanıcılar için de oluşturulabilir.


Bir PostgreSQL veritabanı üzerinde birden fazla server ve birden fazla user mapping oluşturulabilir. Bir user birden fazla server ile farklı sunucular üzerindeki veritabanlarına ulaşabilir.


User mapping listesine psql komutu olan \deu+ ile yada pg_user_mapping sistem kataloğu ile erişebilirsiniz. 

select * from pg_user_mappings;

User Mapping'i silmek için DROP scriptini kullanabilirsiniz.

DROP USER MAPPING FOR <user_mapping_kullanıcı_ismi> SERVER <server_ismi>;

DROP USER MAPPING FOR postgres SERVER test_fdw_server;

FDW Tabloları

Son olarak FDW tablolarını oluşturmalısınız. Her bir tabloyu tek başına oluşturabilirsiniz ya da istediğiniz şema için şemada bulunna tüm tabloları import edebilirsiniz.

FDW, hedef tablolarda tablo üzerinde tablo yapısındaki değişiklikleri PostgreSQL tarafına otomatik şekilde aktaramaz. Hedef veritabanı üzerindeki tablolarda yapılan değişiklikleri yansıtmak için bu işlemi manuel yönetmeliyiz.

FDW tablosu yaratmak için CREATE FOREIGN TABLE scripti şöyledir:

CREATE FOREIGN TABLE <table_ismi> (sütun1 data_tipi, sütun2 data_tipi ...) SERVER <server_ismi>;

FDW tablosunu oluştururken sütunların data type'larının hedef tablodaki sütunların data tipleriyle aynı olmasına dikkat etmelisiniz. FDW tablosuna ait gerçek bir örnek şöyle olabilir:

CREATE FOREIGN TABLE interns (id integer, f_name character varying, l_name character varying, created_date timestamp without time zone) SERVER test_fdw_server;

Hedef veritbanındaki bir şema altındaki tabloların tamamını taşımak isterseniz IMPORT FOREIGN SCHEMA scriptini kullanmalısınız.

IMPORT FOREIGN SCHEMA <hedef_şema> from server <server_ismi> into <postgresql_şema_ismi>;

PostgreSQL tarafında şema aktarımı yapmadan önce, fdw tabloları için ayrı bir şema oluşturabilirsiniz. Şema aktarımını yaptıktan sonra da PostgreSQL tarafında USER MAPPING ile eklediğiniz kullanıcıların o şemayı kullanım(USAGE) ve erişim(en azından SELECT) yetkisinin olup olmadığı kontrol edilmelidir. Import schema syntax'ı aşağıdaki gibidir:

IMPORT FOREIGN SCHEMA dbo from server test_fdw_server into dbo_fdw;
 

Dediğinizde hedef şemadaki tüm tablolar PostgreSQL'de oluşturduğumuz dbo_fdw şeması içine aktarılacaktır. 

FDW tablo listesini \dE ile yada aşağıdaki script ile görüntüleyebilirsiniz.

SELECT table_name,table_type FROM information_schema.tables WHERE table_type='FOREIGN TABLE'
 

Son olarak PostgreSQL veritabanı üzerinden FDW tablosuna select attığımızda;

dummy_=# select * from test_fdw_dbo."interns" limit 1;
NOTICE:  tds_fdw: Query executed correctly
NOTICE:  tds_fdw: Getting results 

         Id          | f_name        | l_name      |created_date
---------------------+---------------+-------------+------------------
 12342123222         | f_test        | l_test      | 2018-08-05 01:32:02.692413+03
(1 row)


Sevgiler,

Comments

Popular posts from this blog

PGConf Europe 2018 Güncesi 1

Merhaba, Diğer tüm veritabanları arasında en popüler açık kaynak kodlu veritabanı olan PostgreSQL, tüm yıl boyunca farklı ülkelerde bir çok konferansa sahiplik yapmaktadır. En bilinenleri PGDay ve PGConf'dur. Ayrıca her yıl 2 Şubatta Brüksel’de yapılan FOSDEM etkinliğinde de PostgreSQL konuşmalarının yapıldığı bir oturum mutlaka olmaktadır. PostgreSQL etkinlik detaylarına bu linkten ulaşabilirsiniz. Bu yıl ki PGConf Europe konferansı Lizbon'da yapıldı. Konferansla ilgili izlenimlerimi, yaptığım neredeyse 6 günlük yolculuğun en başından tüm detaylarıyla birlikte paylaşmak istiyorum. Yolculuğumuz sevgili Seda ile birlikte Atatürk Havalimanı’ndan sabah 07:30’da Lizbon’a direk uçuşla başladı.  Hava şahaneydi ve uçuşumuz konforlu geçti. Koltuğumuz cam kenarı ve uçağın kanadının hemen yanındaydı (benim favori koltuklarım 24, 25, 26, 27 ve 28. sıradakiler) ve biz 27. sıradaydık. Bol bol resim çektik bulutların üstündeyken ve uçak kanatlı olanlardan.  Lizbon’a vardığımı...

PostgreSQL High Availability - Patroni 2

Patroni kurulumuyla ilgili oldukça fazla kaynak bulunmakta fakat kurulum ve yönetimini beraber barındıran kaynağa denk gelmedim. Bu yazıda hem Patroni kurulumu hem de kurulum sonrası yönetimiyle alakalı detaylara ulaşabilirsiniz. PostgreSQL cluster'larının yönetimi için kullanılan Patroni ile ilgili temel bilgilerin yer aldığı Autofailover üzerine hazırladığım yazı serisine aşağıdaki linklerden erişebilirsiniz. PostgreSQL ve Autofailover PostgreSQL'de Autofailover ve Patroni 1 (Giriş) PostgreSQL'de Autofailover ve Patroni 2 (Kurulum, Konfigürasyon ve Yönetim) PostgreSQL'de Autofailover ve Patroni 3 (Mevcut PostgreSQL Cluster'inin Patroni'ye Geçirilmesi) Patroni, PostgreSQL veritabanlarının kurulumundan ve konfigürasyonundan sorumludur. Yani Patroni'yi kurduğumuz sunucular aynı zamanda Patroni ile kurulmuş PostgreSQL'leri barındıracak. Üç node'lu PostgreSQL ve üç node'lu ETCD cluster'larını oluşturacağım. Kuruluma önce üç no...

PostgreSQL High Availability - Patroni 1

Patroni, PostgreSQL HA (High Availability) Cluster yapısının kurulması ve yönetimi için kullanılan open source bir araçtır. Patroni, PostgreSQL Cluster’inin kurulumu (bootstrap), replikasyonunun kurulumu, PostgreSQL otomatik failover yapılması amacıyla kullanılır. Python ile yazılmıştır. Bir önceki yazıda PostgreSQL'de Autofailover araçlarının ne olduğu ve neden Autofailover'a gereksinim duyulduğu konusunda yazı paylaşmıştım. Yazıya buradan ulaşabilirsiniz. Patroni Kurulumu İçin Gereksinimler nedir? Patroni’nin tek başına kurulumu autofailover yapısını yapılandırmak için yeterli değildir. Patroni ile Autofailover yapısının kurulması için DCS (Distributed Configuration Store) araçlarından birine ihtiyaç vardır. Bunlardan bazıları; ETCD, Consul, ZooKeeper, Kubernetes. PostgreSQL üzerinde Autofailover araçlarından Patroni entegre edecekseniz DCS araçlarından birini kullanmanız gerekecek. DCS dediğimiz şey aslında Service Discovery araçlarından biri olduğundan bu iki tan...