İÇİNDEKİLER
- •PostgreSQL ortamınız bu kurallara ne kadar uyuyor?
- •Kısaca: PostgreSQL İçin 10 Temel Kural
- •1. Desteklenen Bir Sürümde Kalın
- •2. Yedekleme: Geri Yüklenemeyen Yedek, Yedek Değildir
- •3. Yüksek Erişilebilirlik: Failover’ı Otomatikleştirin
- •4. Bağlantı Havuzu Kullanın
- •5. Bellek ve Checkpoint Ayarlarını Boyutlandırın
- •6. İşletim Sistemini Veritabanına Göre Ayarlayın
- •7. Güvenlik: En Az Yetki, SCRAM ve TLS
- •8. Autovacuum’u Kapatmayın, Ayarlayın
- •9. Sürekli İzleme
- •10. Şemayı Baştan Doğru Tasarlayın
- •Hızlı Öz Değerlendirme
- •Aryasoft ile PostgreSQL
- •Sıkça Sorulan Sorular
- •Kaynaklar
- •PostgreSQL ortamınızı birlikte değerlendirelim
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 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.
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.
postgresrolü 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.confkurallarını dar tutun. Her kuralda belirli bir veritabanı, rol ve ağ belirtin;trustyöntemini ağ bağlantılarında asla kullanmayın.- Bağlantıları şifreleyin. Uzak bağlantılarda
hostsslkullanı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:
- Desteklenen bir ana sürüm ve en güncel ara sürüm mü çalışıyor?
- Son üç ay içinde ayrı bir sunucuya geri yükleme testi yapıldı mı?
- Primary sunucu kapandığında kimse müdahale etmeden bir replika devreye giriyor mu?
- Uygulamalar bir bağlantı havuzu üzerinden mi bağlanıyor?
shared_buffersvework_memsunucunun belleğine göre mi ayarlandı?- Hiçbir uygulama süper kullanıcı yetkisiyle bağlanmıyor mu?
- Uzak bağlantıların tamamı şifreli mi?
- Autovacuum açık ve işlem numarası yaşı izleniyor mu?
- Replikasyon gecikmesi, disk doluluğu ve yedekleme başarısı için alarm var mı?
- 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
Kaynaklar
Bu rehberdeki bilgiler Kasım 2026’da aşağıdaki resmi dokümantasyonla karşılaştırıldı.
- PostgreSQL: Versioning Policy
- PostgreSQL dokümantasyonu: Backup and Restore
- PostgreSQL dokümantasyonu: Continuous Archiving and Point-in-Time Recovery
- PostgreSQL dokümantasyonu: High Availability, Load Balancing, and Replication
- PostgreSQL dokümantasyonu: Resource Consumption
- PostgreSQL dokümantasyonu: Write Ahead Log
- PostgreSQL dokümantasyonu: Query Planning (effective_cache_size)
- PostgreSQL dokümantasyonu: Managing Kernel Resources (overcommit, huge pages)
- PostgreSQL dokümantasyonu: Password Authentication
- PostgreSQL dokümantasyonu: The pg_hba.conf File
- PostgreSQL dokümantasyonu: Routine Vacuuming
- PostgreSQL dokümantasyonu: The Cumulative Statistics System
- PostgreSQL dokümantasyonu: pg_stat_statements
- PostgreSQL dokümantasyonu: Client Connection Defaults (idle_in_transaction_session_timeout)
- PostgreSQL dokümantasyonu: Identity Columns
- PgBouncer: Features
- 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.