Posts

Showing posts with the label PostgreSQL11

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 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 ile Logical Replication Slot

Logical Replication Slot   Logical Decoding Replication Slot yazısına buradan ulaşabilirsiniz. Giriş bilgisi bu yazıda yer almaktadır.  Logical Replication, logical decoding kullanır. Logical decoding, veritabanı tabloları üzerinde commit edilmiş processlerin karşı tarafa row-by-row aktarılmasıdır. Oluşturulan her bir slot sadece bir veritabanı için kullanılabilir. Bir veritabanında birden fazla birbirinden bağımsız slot oluşturulabilir. Logical replication Slot'lar alıcı tarafla ilgili herhangi bilgiye sahip olmadıkları için yukarıda bahsettiğim disk size'ının dolması durumunun yaşanması kontrol edilmeyen bir sistemde kaçınılmaz olacaktır. Unlogged veya temp tables slot ile karşı tarafa aktarılmadığı unutulmamalıdır. Logical Replication kullanılmadan önce wal_level=logical olarak set edilmeli ve max_replication_slots değeri en az 1 olarak set edilmeli. Logical Replication Slot oluşturulması Physical Replication Slot ile benzerdir. Logical Replication Slot

PostgreSQL ile Physical Replication Slot ve Pg_Basebackup

Physical Replication Slot Physical Replicatio slot, disk bloklarındaki değişikliklerini karşı tarafa gönderir. Aktarılan WAL dosyalarını kontrol eder. Replication Slot yazısına buradan ulaşabilirsiniz. Physical slot oluşturmak için pg_create_physical_replication_slot() fonksiyonu kullanılır. Tam kullanımı şöyledir. Checkpoint sonrası güncel WAL dosyasının hangisi olduğu bilgisi bu fonksiyonu kullanarak oluşturduğumuz slot ile tutulmaz. Açıkcası bunu tercih etmemek için geçerli sebeplerim var ve açıklamasını aşağıda yaptım. select pg_create_physical_replication_slot('slot_name'); Aynı fonksiyona gelen ikinci parametre ile checkpoint sonrası güncel WAL dosyası bilgisi tutulur. Bunun önemi ve asıl farkı aşağıdaki örneklerin altında açıklanmıştır. select pg_create_physical_replication_slot('slot_name',true);     gunce=# select pg_create_physical_replication_slot('slot_first_standby'); pg_create_physical_replication_slot ---------------------------

PostgreSQL İle Replication Slot

Merhaba, PostgreSQL 9.4 ile Logical Decoding kavramı gelmesiyle Replication Slot yapısının temeli atıldı diyebiliriz. Çünkü Logical Replication, Logical Decoding yapsının üzerinde geliştirilmiştir. Sonrasında ise PostgreSQL 9.6 ile Logical Replication ve Physical Replication kavramlarıyla tanıştık. Öncesinde Replication Slot kavramından, daha sonra Logical ve Physical Replication kavramlarından bahsedeceğim. Tabii öncesinde WAL kavramıyla ilgili küçük bir açıklama yapmak isterim. Çünkü Replicatiın Slot aslında kabaca WAL dosyalarının bir yerden başka bir yere kopyalanması olarak düşünebilirsiniz.  WAL(Write-Ahead-Log) PostgreSQL de transactional loglar 16MB lik dosyalarda saklanmaktadır. Bu dosyalar WAL (Write-Ahead-Log) dosyalarıdır. Data file'lar üzerindeki değişiklikler commit edildikten sonra ancak loglanır. Log record'lar okunduktan sonra değişiklikler kalıcı olarak diske yazılır. Aslında bunların yapılmasının tek bir amacı var o da bir sorun olması durumunda WAL d