PostgreSQL best practices: veritabanı, güvenlik kalkanı ve kontrol listesi

PostgreSQL Best Practices: Production (Üretim Ortamı) İçin 10 Temel Kural

PostgreSQL’i production’da (üretim ortamında) güvenli ve hızlı işletmek için 10 temel kural: test edilmiş yedekleme, otomatik failover, bağlantı havuzu, bellek ayarları, güvenlik, autovacuum ve izleme.

Kasım 2, 2026

PostgreSQL best practices, bir veritabanını production’da (üretim ortamında) güvenli, hızlı ve sürdürülebilir şekilde işletmek için uygulanan temel kurallardır. En kritik olanlar şunlardır: doğrulanmış yedekleme ve belirli bir ana geri dönüş (PITR), otomatik failover’lı yüksek erişilebilirlik, bağlantı havuzu, belleğe göre boyutlandırılmış ayarlar, en az yetki ilkesi ve şifreli bağlantılar, düzenli çalışan autovacuum, sürekli izleme ve desteklenen bir sürümde kalmak.

Bu rehber, PostgreSQL’i production’da işleten veya production’a almaya hazırlanan ekipler için hazırlandı. Önerileri on başlıkta topladık ve her birinde “neden” sorusunu yanıtladık. Bilgiler PostgreSQL 18 dokümantasyonuna dayanıyor; sorguları PostgreSQL 18 üzerinde kontrol ettik.

PostgreSQL Sağlık Kontrolü

PostgreSQL ortamınız bu kurallara ne kadar uyuyor?

Aryasoft'un kıdemli PostgreSQL uzmanları yapılandırma, yedekleme, yüksek erişilebilirlik, güvenlik ve performansı inceler; bulguları öncelik sırasıyla raporlar.

Değerlendirme Talep Et

Kısaca: PostgreSQL İçin 10 Temel Kural

# Kural Uygulanmazsa ne olur?
1 Desteklenen bir sürüm ve güncel ara sürüm kullanın. Bilinen güvenlik açıkları ve hatalar kapatılmaz.
2 Yedeklemeyi WAL arşiviyle birlikte kurun ve geri yüklemeyi test edin. Mantıksal bir hata veya arıza sonrasında veri geri getirilemez.
3 Yüksek erişilebilirliği otomatik failover ile kurun. Sunucu arızasında kesinti, elle müdahale süresi kadar uzar.
4 Uygulama ile veritabanı arasına bağlantı havuzu koyun. Bağlantı sayısı arttıkça bellek tükenir, performans düşer.
5 Bellek ve checkpoint ayarlarını donanıma göre boyutlandırın. Varsayılan ayarlar, sunucunun kapasitesinin küçük bir kısmını kullanır.
6 İşletim sistemini veritabanına göre ayarlayın. Bellek yönetimi kaynaklı beklenmedik kapanmalar ve gecikmeler yaşanır.
7 En az yetki ilkesi, SCRAM ve TLS kullanın. Tek bir sızdırılmış parola tüm veriyi açığa çıkarabilir.
8 Autovacuum’u kapatmayın, yoğun tablolarda ayarlayın. Tablolar şişer, sorgular yavaşlar, en kötü durumda veritabanı yazmaya kapanır.
9 Sorguları, replikasyonu ve kapasiteyi sürekli izleyin. Sorunlar kullanıcılar şikâyet ettiğinde fark edilir.
10 Şemayı baştan doğru tasarlayın. Primary key’siz tablolar, yanlış veri tipleri ve eksik indeksler sonradan pahalıya düzeltilir.

1. Desteklenen Bir Sürümde Kalın

PostgreSQL topluluğu her ana sürümü beş yıl destekler ve en az üç ayda bir ara sürüm yayımlar. Ara sürümler yalnızca hata ve güvenlik düzeltmesi içerir; dump veya pg_upgrade gerektirmez, genellikle paketlerin güncellenip servisin yeniden başlatılmasıyla uygulanır. Topluluk, her zaman güncel ara sürümün kullanılmasını önerir.

Durum Öneri
Yeni kurulum PostgreSQL 18 (Kasım 2030’a kadar destekleniyor)
PostgreSQL 14 kullanıyorsanız Destek 12 Kasım 2026’da bitiyor; yükseltmeyi şimdi planlayın.
Ara sürüm güncellemeleri Üç aylık bir takvimle, önce test ortamında
Ana sürüm yükseltmeleri Destek bitmeden en az altı ay önce planlanmalı

PostgreSQL 14’ten çıkış için hedef sürüm ve yöntem seçimini PostgreSQL 14 destek sonu rehberimizde ayrıntılı olarak anlattık.

2. Yedekleme: Geri Yüklenemeyen Yedek, Yedek Değildir

PostgreSQL üç yedekleme yaklaşımı sunar ve bunlar birbirinin alternatifi değil, tamamlayıcısıdır:

Yöntem Ne sağlar? Sınırı
pg_dump (mantıksal yedek) Tek bir veritabanının veya tablonun taşınabilir kopyası; farklı sürüme geri yüklenebilir. Belirli bir ana geri dönüş yapılamaz; büyük veritabanlarında yavaştır.
Temel yedek + WAL arşivi (fiziksel) Tüm kümenin kopyası ve belirli bir saniyeye geri dönüş (PITR) Yalnızca aynı ana sürüme geri yüklenir.
Replikasyon Donanım arızasına karşı hazır bekleyen kopya Yedek değildir: yanlışlıkla silinen veri replikadan da silinir.

Production için önerimiz, pgBackRest gibi bir araçla fiziksel yedek ve sürekli WAL arşivlemesidir. Yedekler veritabanı sunucusunun dışında, tercihen farklı bir lokasyonda tutulmalı; fidye yazılımına karşı en az bir kopya değiştirilemez (immutable) depolamada olmalıdır.

Kritik

Hiç geri yükleme testi yapılmamış bir yedekleme düzeni, yalnızca bir varsayımdır. Geri yüklemeyi en az üç ayda bir, ayrı bir sunucuya ve belirli bir zamana dönerek test edin; süresini ölçüp RTO hedefinizle karşılaştırın.

3. Yüksek Erişilebilirlik: Failover’ı Otomatikleştirin

PostgreSQL, streaming replication ile bekleme (standby) sunucularını yerleşik olarak destekler. Ancak primary’nin arızalandığını tespit edip bir replikayı otomatik olarak primary yapan bir mekanizma içermez. Bu iş için yaygın çözüm Patroni ve onun karar vermek için kullandığı etcd gibi bir dağıtık yapılandırma deposudur.

  • En az üç sunucu düşünün: bir primary, bir replika ve karar mekanizması (etcd) için tek sayıda üye. Üç etcd üyesi bir arızaya, beş üye iki arızaya dayanır.
  • Veri kaybı toleransını belirleyin: asenkron replikasyonda failover anında son işlemler kaybolabilir. Kayıp kabul edilemiyorsa senkron replikasyon kullanın.
  • Bağlantı adresini sabitleyin: uygulamalar sunucu adresine değil, sanal IP’ye, yük dengeleyiciye veya DNS adına bağlanmalıdır.
  • Failover’ı test edin: canlıya almadan önce ve sonrasında düzenli aralıklarla.

Bu bileşenleri tutarlı biçimde kurmak için Autobase’i kullanıyoruz. Dikkat ettiğimiz noktaları Autobase ile yüksek erişilebilir PostgreSQL ortamı kurulumu yazımızda anlattık.

4. Bağlantı Havuzu Kullanın

PostgreSQL her bağlantı için işletim sisteminde ayrı bir süreç açar. Bağlantı sayısı arttıkça bellek kullanımı ve bağlam değiştirme maliyeti de artar. Yüzlerce veya binlerce eşzamanlı bağlantı açan uygulamalarda max_connections değerini yükseltmek çözüm değildir; çözüm, PgBouncer gibi bir bağlantı havuzudur.

Havuz modu Nasıl çalışır? Ne zaman?
Session İstemci, oturum boyunca bir veritabanı bağlantısını tutar. En uyumlu seçenek; oturum düzeyinde özellik kullanan uygulamalar
Transaction Bağlantı yalnızca işlem süresince istemciye verilir. Kısa işlemler yapan çok sayıda istemci; en verimli seçenek

Uygulamanın açıp kapatmadığı, boşta bekleyen bağlantılar da sık görülen bir sorundur. Özellikle bir işlem başlatıp tamamlamadan bekleyen oturumlar, VACUUM’un çalışmasını engeller. idle_in_transaction_session_timeout ile bu oturumları belirli bir süre sonra kapatın.

-- Sessions by state, and the oldest open transaction
SELECT state, count(*) AS sessions,
       max(now() - xact_start) AS oldest_transaction
FROM pg_stat_activity
WHERE backend_type = 'client backend'
GROUP BY state
ORDER BY sessions DESC;

5. Bellek ve Checkpoint Ayarlarını Boyutlandırın

PostgreSQL’in varsayılan ayarları, küçük bir makinede çalışabilecek şekilde muhafazakâr seçilmiştir. Production sunucusunda ilk gözden geçirilmesi gereken ayarlar şunlardır:

Ayar Varsayılan Başlangıç önerisi Açıklama
shared_buffers 128 MB Belleğin %25’i PostgreSQL’in veri sayfası önbelleği. Dokümantasyon, veritabanına ayrılmış sunucular için %25’i başlangıç noktası olarak önerir.
effective_cache_size 4 GB Belleğin %50–75’i Bellek ayırmaz; sorgu planlayıcısına işletim sistemi önbelleğinin büyüklüğünü bildirir.
work_mem 4 MB İş yüküne göre Her sıralama ve hash işlemi için ayrı ayrı kullanılır; bağlantı sayısıyla çarpılarak düşünülmelidir.
maintenance_work_mem 64 MB 512 MB – 1 GB VACUUM, CREATE INDEX gibi bakım işlemlerini hızlandırır.
max_wal_size 1 GB Yazma yüküne göre artırılır Çok küçük olursa checkpoint’ler sıklaşır ve yazma performansı düşer.
checkpoint_completion_target 0.9 0.9 Checkpoint yazmalarını zamana yayar.

work_mem en dikkatli ayarlanması gereken parametredir. Örneğin 64 MB’lık bir değer, karmaşık bir sorguda birden fazla kez kullanılabilir ve yüzlerce bağlantıyla çarpıldığında sunucunun belleğini aşabilir. Değeri genel olarak düşük tutup, yoğun raporlama sorgularında oturum veya rol düzeyinde yükseltmek daha güvenlidir.

6. İşletim Sistemini Veritabanına Göre Ayarlayın

Ayar Öneri Neden?
Bellek taahhüdü vm.overcommit_memory = 2 PostgreSQL dokümantasyonu, Linux’un bellek tükendiğinde veritabanı sürecini sonlandırma (OOM killer) riskini azaltmak için bu ayarı önerir.
Transparent Huge Pages Kapalı Bellek yönetiminde beklenmedik gecikmelere yol açabilir.
Huge pages huge_pages = try ve işletim sisteminde ayrılmış sayfa Büyük shared_buffers değerlerinde bellek yönetimi yükünü azaltır.
Swap kullanımı vm.swappiness düşük (örneğin 1) Veritabanı belleğinin diske taşınmasını önler.
Zaman senkronizasyonu NTP (chrony) açık Loglar, replikasyon ve küme yönetimi doğru zamana bağlıdır.
Disk SSD/NVMe; veri ve yedek ayrı disklerde Gecikme doğrudan sorgu süresine yansır; yedekler aynı diskte tutulursa disk arızasında birlikte kaybolur.

7. Güvenlik: En Az Yetki, SCRAM ve TLS

  • Uygulamaya süper kullanıcı vermeyin. Her uygulama kendi rolüyle bağlanmalı ve yalnızca kendi veritabanında gerekli yetkilere sahip olmalıdır. postgres rolü yalnızca yönetim için kullanılmalıdır.
  • Parolaları SCRAM-SHA-256 ile saklayın. MD5 parola desteği PostgreSQL 18’de kaldırılma sürecine girdi; MD5 kullanan rolleri tespit edip parolalarını yenileyin.
  • pg_hba.conf kurallarını dar tutun. Her kuralda belirli bir veritabanı, rol ve ağ belirtin; trust yöntemini ağ bağlantılarında asla kullanmayın.
  • Bağlantıları şifreleyin. Uzak bağlantılarda hostssl kullanın; en düşük TLS sürümünü 1.2 olarak belirleyin.
  • Veritabanını internete açmayın. 5432 portu yalnızca uygulama sunucularına açık olmalıdır.
  • Yetkili işlemleri kayıt altına alın. Bağlantı, oturum kapanışı ve DDL işlemlerini loglayın; denetim gereksinimleri için pgAudit eklentisini değerlendirin.
-- Roles with superuser or other elevated attributes
SELECT rolname, rolsuper, rolcreaterole, rolcreatedb, rolreplication, rolbypassrls
FROM pg_roles
WHERE rolsuper OR rolcreaterole OR rolreplication OR rolbypassrls
ORDER BY rolname;
-- Roles still using MD5 password hashes
SELECT rolname FROM pg_authid WHERE rolpassword LIKE 'md5%';

8. Autovacuum’u Kapatmayın, Ayarlayın

PostgreSQL, güncellenen ve silinen satırların eski sürümlerini hemen silmez. Bu “ölü satırları” autovacuum temizler. Autovacuum aynı zamanda sorgu planlayıcısının istatistiklerini günceller ve işlem numarası taşmasını (transaction ID wraparound) önler. Autovacuum’u kapatmak, kısa vadede performans kazancı gibi görünse de orta vadede tabloların şişmesine ve en kötü durumda veritabanının yeni işlemleri kabul etmemesine yol açar.

Yoğun güncellenen büyük tablolarda varsayılan eşikler geç kalabilir. Bu tablolarda autovacuum’u tablo düzeyinde daha sık çalışacak şekilde ayarlayın ve aşağıdaki iki sorguyu düzenli olarak izleyin:

-- Tables with the most dead rows and their last autovacuum
SELECT relname, n_live_tup, n_dead_tup, last_autovacuum, last_autoanalyze
FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC
LIMIT 10;
-- Transaction ID age per database (autovacuum_freeze_max_age default: 200 million)
SELECT datname, age(datfrozenxid) AS xid_age
FROM pg_database
ORDER BY xid_age DESC;

Uyarı

Uzun süre açık kalan işlemler, replikasyon slot’ları ve hazırlanmış (prepared) işlemler VACUUM’un eski satırları temizlemesini engeller. İşlem numarası yaşı sürekli artıyorsa, önce bu üç kaynağı kontrol edin.

9. Sürekli İzleme

İyi bir izleme düzeni, sorunları kullanıcılar fark etmeden önce gösterir. En az şu metrikler için alarm tanımlayın:

Metrik Nereden? Neden önemli?
En pahalı sorgular pg_stat_statements Performans iyileştirmesinin en hızlı geri dönüş verdiği yer
Replikasyon gecikmesi pg_stat_replication Failover anında olası veri kaybını ve okuma tutarlılığını belirler
Bağlantı sayısı ve boşta bekleyen işlemler pg_stat_activity Bağlantı sızıntılarını ve VACUUM engellerini gösterir
İşlem numarası yaşı pg_database Wraparound riskini önceden haber verir
Disk doluluğu ve WAL birikimi İşletim sistemi, pg_replication_slots Unutulan bir slot diski doldurabilir
Yedekleme ve arşivleme başarısı Yedekleme aracı, pg_stat_archiver Başarısız arşivleme, PITR imkânını sessizce ortadan kaldırır

pg_stat_statements eklentisi, sorgu düzeyinde performans analizinin temelidir. shared_preload_libraries ayarına eklenip sunucu yeniden başlatıldıktan sonra kullanılabilir:

CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
-- Top 10 queries by total execution time
SELECT round(total_exec_time::numeric, 0) AS total_ms,
       calls,
       round(mean_exec_time::numeric, 1) AS mean_ms,
       left(query, 80) AS query
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 10;

Sunucu logunda da yavaş sorguları görmek için log_min_duration_statement ayarını (örneğin 1 saniye), kilit beklemeleri için log_lock_waits ve checkpoint davranışı için log_checkpoints ayarlarını açın.

10. Şemayı Baştan Doğru Tasarlayın

Kural Neden?
Her tabloda primary key olsun. Logical replication, birçok araç ve veri bütünlüğü buna ihtiyaç duyar.
Otomatik artan anahtarlarda GENERATED ... AS IDENTITY kullanın. SQL standardına uygundur ve serial tipinin yetki sorunlarını yaşatmaz.
Zaman bilgisini timestamptz ile saklayın. Saat dilimi farklarından kaynaklanan hataları önler.
Para birimi ve kesin sayılar için numeric kullanın. Kayan noktalı tipler yuvarlama hatası üretir.
Foreign key kolonlarını indeksleyin. PostgreSQL bu indeksleri otomatik oluşturmaz; silme ve birleştirme işlemleri yavaşlar.
Türkçe veri için locale’i ilk gün seçin. Bir veritabanının locale ayarı sonradan değiştirilemez.
Nesne adlarını küçük harfle ve tırnaksız yazın. Tırnaklı adlar büyük/küçük harfe duyarlı olur ve sorgularda hata kaynağı olur.

İpucu

Türkçe metinde “i” ve “ı” harflerinin doğru büyük/küçük harf dönüşümü ve Türk alfabesine uygun sıralama için ICU tabanlı tr-TR sıralama kurallarını kullanın. Örnekleri PostgreSQL Nedir rehberimizde bulabilirsiniz.

Hızlı Öz Değerlendirme

Aşağıdaki soruların her birine “evet” diyebiliyorsanız, PostgreSQL ortamınız sağlam temellere sahiptir:

  1. Desteklenen bir ana sürüm ve en güncel ara sürüm mü çalışıyor?
  2. Son üç ay içinde ayrı bir sunucuya geri yükleme testi yapıldı mı?
  3. Primary sunucu kapandığında kimse müdahale etmeden bir replika devreye giriyor mu?
  4. Uygulamalar bir bağlantı havuzu üzerinden mi bağlanıyor?
  5. shared_buffers ve work_mem sunucunun belleğine göre mi ayarlandı?
  6. Hiçbir uygulama süper kullanıcı yetkisiyle bağlanmıyor mu?
  7. Uzak bağlantıların tamamı şifreli mi?
  8. Autovacuum açık ve işlem numarası yaşı izleniyor mu?
  9. Replikasyon gecikmesi, disk doluluğu ve yedekleme başarısı için alarm var mı?
  10. Tüm tablolarda primary key var mı?

Aryasoft ile PostgreSQL

Aryasoft’un yalnızca kıdemli uzmanlardan oluşan ekibi, SQL Server için sunduğu hizmetleri PostgreSQL için de sunar: sağlık kontrolü, mimari ve kurulum, yüksek erişilebilirlik ve yedekleme tasarımı, performans iyileştirme, sürüm yükseltme ve SQL Server ya da Oracle’dan PostgreSQL’e geçiş. Bu rehberdeki kuralların ortamınızda ne ölçüde uygulandığını bir sağlık kontrolüyle ortaya koyar, bulguları öncelik sırasıyla raporlarız. Sürekli destek için uzaktan veritabanı yöneticisi (Remote DBA) hizmetini de içeren yönetilen veritabanı hizmetlerimizi inceleyebilirsiniz.

Sıkça Sorulan Sorular

Test edilmiş yedekleme. Diğer tüm hatalar performans veya kesinti olarak geri döner; geri yüklenemeyen bir yedek ise kalıcı veri kaybı demektir. Fiziksel yedek ve WAL arşivini birlikte kurun ve geri yüklemeyi düzenli olarak deneyin.
PostgreSQL dokümantasyonu, 1 GB veya daha fazla belleğe sahip ve yalnızca veritabanına ayrılmış bir sunucu için başlangıç değeri olarak belleğin %25’ini önerir. Daha yüksek değerler her zaman daha iyi sonuç vermez; iş yükünü izleyerek ayarlayın.
Genellikle hayır. Her bağlantı ayrı bir süreç ve bellek demektir. Çok sayıda eşzamanlı bağlantı gerekiyorsa PgBouncer gibi bir bağlantı havuzu kullanın ve veritabanı bağlantı sayısını sınırlı tutun.
Hayır. Autovacuum ölü satırları temizler, istatistikleri günceller ve işlem numarası taşmasını önler. Kapatılması tabloların şişmesine ve en kötü durumda veritabanının yazma işlemlerini durdurmasına yol açar. Yoğun tablolarda kapatmak yerine daha sık çalışacak şekilde ayarlayın.
Streaming replication ile en az bir replika, failover kararını veren Patroni gibi bir küme yöneticisi ve tek sayıda üyeden oluşan bir yapılandırma deposu (etcd veya Consul). Uygulamalar sabit bir bağlantı adresi kullanmalı ve failover düzenli olarak test edilmelidir.

Kaynaklar

Bu rehberdeki bilgiler Kasım 2026’da aşağıdaki resmi dokümantasyonla karşılaştırıldı.

  1. PostgreSQL: Versioning Policy
  2. PostgreSQL dokümantasyonu: Backup and Restore
  3. PostgreSQL dokümantasyonu: Continuous Archiving and Point-in-Time Recovery
  4. PostgreSQL dokümantasyonu: High Availability, Load Balancing, and Replication
  5. PostgreSQL dokümantasyonu: Resource Consumption
  6. PostgreSQL dokümantasyonu: Write Ahead Log
  7. PostgreSQL dokümantasyonu: Query Planning (effective_cache_size)
  8. PostgreSQL dokümantasyonu: Managing Kernel Resources (overcommit, huge pages)
  9. PostgreSQL dokümantasyonu: Password Authentication
  10. PostgreSQL dokümantasyonu: The pg_hba.conf File
  11. PostgreSQL dokümantasyonu: Routine Vacuuming
  12. PostgreSQL dokümantasyonu: The Cumulative Statistics System
  13. PostgreSQL dokümantasyonu: pg_stat_statements
  14. PostgreSQL dokümantasyonu: Client Connection Defaults (idle_in_transaction_session_timeout)
  15. PostgreSQL dokümantasyonu: Identity Columns
  16. PgBouncer: Features
  17. Patroni dokümantasyonu

PostgreSQL Sağlık Kontrolü

PostgreSQL ortamınızı birlikte değerlendirelim

Aryasoft’un kıdemli PostgreSQL uzmanları yapılandırma, yedekleme, yüksek erişilebilirlik, güvenlik ve performansı inceler ve bulguları öncelik sırasıyla raporlar.

4.7/5