Posts

Tablo Yetkilerinin Başka Tabloya Tanımlanması

Merhaba, Daha önce aldığım notun kaybolmaması adına bu yazıyı yazmak istedim. Paylaşacağım bu yazı içeriğinde yapılan işlemlerin sonucuna farklı yollardan da ulaşılabilir tabi.  Tabloların belirli kullanıcılar tarafından erişilebilir olması için kullanıcıların tablolar üzerinde yetkiye ihtiyaçları vardır. Bunun için Postgres, GRANT komutu kullanılır. GRANT ile ilgili detaylı bilgiye buradan ulaşabilirsiniz. Bir tablo üzerinde birden fazla kullanıcının farklı yetki tipinde yetkiye sahip olması olağandır. Belirli tablo üzerindeki kullanıcı yetkilerini aşağıdaki script ile görebilirsiniz. SELECT grantor, grantee, privilege_type   FROM information_schema.role_table_grants  WHERE table_schema ='public'  AND table_name = 'test_table';   Yeni bir tablo eklediniz ve mevcut tablonuzun üzerindeki kullanıcı yetkilerinin birebir yeni tablonuzda da olmasını isterseniz yukarıdaki scripti biraz daha değiştirerek GRANT scriptini SQL ile oluşturabilirsiniz.  Öncesinde yu

PGConf Europe 2018 Güncesi 2

Image
Merhaba, PGConf Europe 2018 ile ilgili giriş yazıma buradan ulaşabileceğiniz gibi eğer merak ediyorsanız konferanstaki detayları, doğru yerdesiniz. Her sunum farklı alanda çalışan konuşmacılar tarafından veriliyor DBA, Hacker, Developer gibi. Daha fazla konuşmacının sunumlara sınırlı zamanda katkıda bulunması için aynı andan birden fazla oturumda gerçekleştiriliyor konuşmalar. Dolayısıyla katılacağınız etkinliklerde eğer bir konuşmayı dinlerken diğerini kaçırma ihtimaliniz olan böyle etkinliklerde takvimi ve sunum içeriğini detaylıca okumanızı öneririm. Sunum sonrası konuşmacıların bir çoğu kendi sunumlarını yine aynı sayfada görebileceğiniz şekilde paylaşıyorlar. PostgreSQL etkinliklerinin güzel yanı, etkinlik sayfasından etkinlik detayına, etkinlik içeriğine ulaşabilmeniz. Ayrıca konuşmacılar, konuşmalarının kimlere hitap ettiğini belirtiyorlar, beginner, intermediate ve advanced gibi. Eğer konuyla ilgili fikriniz yok ve anlatım seviyesi ile ilgili endişeleriniz varsa bu size yol

PGConf Europe 2018 Güncesi 1

Image
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ız

PostgreSQL'de file_fdw Kullanımı

Merhaba, FDW ile ilgili nasıl kullanılması gerektiği ve temel olarak ne işe yaradığıyla ilgili detaylıca buradaki yazımda bahsetmiştim. Postgres'de iki adet in-core FDW bulunmaktadır; file_fdw ve postgres_fdw. Bu yazımda file_fdw'nun nasıl kullanıldığından bahsetmek istiyorum. file_fdw, file system foreign data wrapper olarak geçiyor. Yani Postgres veritabanından postgres kullanıcısının erişim yetkisi olan dizinler üzerinde bulunan dosyaları okumayı sağlıyor. Bu, elinizde bir metin dosyası varsa eğer içeriğini uygun tablo yapısıyla birlikte veritabanı üzerinden okuyabileceğiniz anlamına gelir. Dosya içine bir satır daha eklediniz diyelim, verilerin akışı siz SELECT attığınız anda anlık olur ve siz yeni eklenen satırı tablonuzda görebilirsiniz. file_fdw ile sunucu üzerinde çalıştıracağınız komutların sonucunu PostgreSQL 10 ile gelen ve file_fdw için yeni eklenen bir seçenek olan program seçeneğini kullanarak da çalışan programın sonucunu bir tablo yapısıyla görüntüleyeb

PostgreSQL11 Yenilikleri 4 - Stored Procedure

Merhaba, PostgreSQL 10 ve öncesine kadar Stored Procedure'e en yakın veritabanı objesi olarak fonksiyon bulunuyordu. İkisi arasındaki en büyük fark fonksiyon bir sonuç döndürürken, Stored Procedure'ün buna ihtiyaç duymaması. PostgreSQL 11 ile gelen özelliklerden biri de yeni eklenen veritabanı objesi olan Stored Procedure'ler oldu. Stored Procedure CREATE OR REPLACE PROCEDURE ...   ile oluşturulur.  Fonksiyonlar SELECT ile çağırılırken, Stored Procedure 'ler PostgreSQL 11 ile gelen yeni bir ifade olan CALL komutu ile çalıştırılır. Stored Procedure , fonksiyondaki gibi input parametrelerinde IN, OUT ve INOUT kullanılabilir aynı fonksiyonlardaki gibi.  Bir Stored Procedure 'ü aşağıdaki gibi oluşturabilirsiniz. [pg11] # CREATE OR REPLACE PROCEDURE public.test_procedure(a integer, INOUT b integer)  LANGUAGE plpgsql AS $procedure$  BEGIN         SELECT a*b INTO b; END; $procedure$; CREATE PROCEDURE Stored procedure'ü CALL komutuyle çalıştırabilrsi

PostgreSQL 11 Yenilikleri 3 - Partition Yenilikleri

Image
Merhaba, PostgreSQL 11’de partition’un nasıl yapıldığından bahsetmeden önce Partitioning nedir ve PostgreSQL 10 ve öncesinde nasıl yapıldığından bahsetmek isterim. Verilerin belirlenen kriterlerde farklı tablolara ayrıştırılmasına Partitioning denir. PostgreSQL’de partitioned tabloları bireysel tabloların oluşturduğu partition tablolarından meydana gelir. Bu tablolar tek bir tablo altında gruplandırılırlar. 10GB tablonuz olsun. Tüm tablodan veri çekmek yerine daha küçük boyuttaki partition tablolarından veri çekmek daha hızlı olacaktır. Eğer sorgunuzun yapısı partition yapınıza uygunsa arayacağı kriterin olduğu partition tablosuna gidecektir. Örneğin tarihlere göre aylık olarak tablonuzu böldüyseniz, sorgunuzda partition key değeriniz yoksa işe yaramayacaktır. Önemli noktalardan biri partition key’inin kullanılmasıdır. PostgreSQL 9.6 ve öncesinde partition yapısını kurmak için partitioned tabloya eklenecek verilerin partition tablolarına eklenmesi için trigger oluşturuyorduk. Tüm kr

PostgreSQL 10'da Partitioning

Merhaba, Partitioning aslında bir tablonun belirlenen kriterler için küçük parçalara ayrılmasıdır. Parçalarına ayrılan tabloya partitioned(master) tablo denir. Partitioned tabloları oluşturan küçük tablolara da partition(child) tabloları denir. Büyük tabloları daha küçük parçalara ayırmanın bir kaç sebebi var. Sorgu performansının arttırılmasını sağlar. Bir tablonun erişilmiş satırların çoğu aslında tek bir partitionda yada küçük parçalar halinde biren fazla partition tablolarında yer alır. Partition tabloları index sütunlarına yol göstermeye, index boyutunu küçültmeye ve yoğun şekilde kullanılan indexleri memory ile fit etmeye yarar. Bulk loads ve DELETE işlemleri için partition tablolarının partitioned tablolara eklenmesi ve çıkarılmasıyla başarım sağlanabilir. ALTER TABLE DETACH PARTITION yapmak yada partitioned tabloyla bağını DROP TABLE ile koparmak bulk operasyonlar için oldukça hızlıdır. DELETE komutundan dolayı VACUUM gereksinimi ortadan kalkacaktır. PostgreSQL 10 öncesinde ku

PostgreSQL 11 Yenilikleri 2 - Alter Table Add Column

Image
Merhaba, Bir tabloya yeni bir sütun nasıl eklenir? Bir sütunun eklenmesi ne demek ve nasıl olur? Bahsedeceğim yeniliği anlatmadan önce bunu anlatmak isterim. Bir tabloya default değeri null olmayan yeni bir sütun eklenmesi o tablonun baştan yazılması anlamına gelir. Tüm tabloyu yeniden yazmak demek tablonun locklanması anlamına da gelir. Büyük tablolar için maliyetli bir işlemdir. Şöyle düşünün, diyelim ki 10 sütunlu bir tablonuz var ve default değeriyle birlikte yeni bir sütun daha ekleyeceğiz. Bunun anlamı o tabloya eklenen yeni sütunun tüm değerlerinin add column ile belirlediğimiz default değerine eşit olması gerektiğidir. Yani o tablonun mevcut verileriyle ve yeni eklediğiniz sütunun default değeriyle birlikte yeniden oluşturulması anlamına gelir. Bu derece maliyetli bir işlemin önüne geçmek için mevcut pg_attribute tablosuna iki yeni sütun daha eklendi; sütunun default değerini saklamak için attmissingval sütunu ve sonradan eklenen sütun olup olmadığını gösteren sütun atthasmis

PostgreSQL 11 Yenilikleri 1 - wal-segsize

Image
Merhaba, PostgreSQL wal size deafult olarak 16MB dir. PostgreSQL 11 ile initdb komutuna yeni bir seçenek daha geldi, wal-segsize. PostgreSQL 11 ile birlikte bu değer kurulum sırasında wal dosyalarının boyutu belirlenebilecek. 2 nin katları (1,2,4,8,16,32..) şeklinde MB boyutunda set edilebilir. Buradaki sınır en fazla 1024 (MB) olarak set edilebilir. initdb -D /pg_data --wal-segsize=32 Bu yenilik gelmeden önce Robert Haas’ın neden böyle bir değişikliğe gereksinim duyulduğu ile ilgili bir yazısını okudum. Wal dosyasınınn boyutunun 16MB’tan 64MB’a çıkarılmasınyüzlerceın çok fark etmeyeceğinden bahsetmişti. Açıklaması da şöyle: “max_wal_size=1GB olması demek 64 adet 16MB’lık WAL segment’i demek. 16 adet 64MB’lık WAL segmentine sahip olunması bu değişikliği yapan kişileri çok da etkilemeyecek. Bir günde 32,768 adet WAL segmenti üreten bir PostgreSQL veritabanı (her 2.6 sn civarı WAL dosyasının üretilmesi anlamına gelir bu da) için günde 8,192 WAL segmentinin oluşturulması(günde 10.5 sn

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;