PostgreSQL Kurulum ve Performans Optimizasyonu Rehberi
zafer ak
Yazar
PostgreSQL, açık kaynak kodlu, güçlü ve güvenilir bir ilişkisel veritabanı yönetim sistemidir. Bu rehberde kurulum ve optimizasyonu öğreneceksiniz.
PostgreSQL vs MySQL
| Özellik | PostgreSQL | MySQL |
|---|---|---|
| ACID Uyumluluğu | Tam | InnoDB ile |
| JSON Desteği | Gelişmiş (JSONB) | Temel |
| Full-text Search | Native | Sınırlı |
| Extensibility | Çok yüksek | Orta |
Kurulum
# Ubuntu/Debian
sudo apt update
sudo apt install postgresql postgresql-contrib
# CentOS/RHEL
sudo dnf install postgresql-server postgresql-contrib
sudo postgresql-setup --initdb
# Servisi başlat
sudo systemctl enable postgresql
sudo systemctl start postgresql
İlk Yapılandırma
# postgres kullanıcısına geç
sudo -u postgres psql
# Şifre belirleme
ALTER USER postgres PASSWORD 'guclu_sifre';
# Yeni veritabanı oluşturma
CREATE DATABASE myapp;
# Yeni kullanıcı oluşturma
CREATE USER myapp_user WITH ENCRYPTED PASSWORD 'sifre123';
# Yetki verme
GRANT ALL PRIVILEGES ON DATABASE myapp TO myapp_user;
# Çıkış
\q
pg_hba.conf Yapılandırması
Bağlantı izinleri /etc/postgresql/XX/main/pg_hba.conf dosyasında:
# TYPE DATABASE USER ADDRESS METHOD
# Local connections
local all postgres peer
local all all md5
# IPv4 local connections
host all all 127.0.0.1/32 md5
host all all 192.168.1.0/24 md5
# IPv6 local connections
host all all ::1/128 md5
postgresql.conf Optimizasyonu
# /etc/postgresql/XX/main/postgresql.conf
# Bağlantı Ayarları
listen_addresses = '*'
port = 5432
max_connections = 200
# Bellek Ayarları (16GB RAM için)
shared_buffers = 4GB # RAM'in %25'i
effective_cache_size = 12GB # RAM'in %75'i
work_mem = 64MB # Sorgu başına
maintenance_work_mem = 512MB # Bakım işlemleri
# Write-Ahead Log
wal_buffers = 64MB
checkpoint_completion_target = 0.9
max_wal_size = 2GB
# Query Planner
random_page_cost = 1.1 # SSD için
effective_io_concurrency = 200 # SSD için
# Logging
log_destination = 'stderr'
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%Y-%m-%d.log'
log_min_duration_statement = 1000 # 1 saniyeden uzun sorgular
Temel psql Komutları
# Veritabanına bağlan
psql -h localhost -U myapp_user -d myapp
# Veritabanları listele
\l
# Tablolar listele
\dt
# Tablo yapısı
\d table_name
# Sorgu çalıştır
SELECT * FROM users LIMIT 10;
# Sorgu planı
EXPLAIN ANALYZE SELECT * FROM users WHERE id = 1;
# Çıkış
\q
Index Optimizasyonu
-- B-tree index (varsayılan)
CREATE INDEX idx_users_email ON users(email);
-- Unique index
CREATE UNIQUE INDEX idx_users_username ON users(username);
-- Partial index
CREATE INDEX idx_active_users ON users(email) WHERE status = 'active';
-- Composite index
CREATE INDEX idx_orders_user_date ON orders(user_id, created_at DESC);
-- GIN index (JSONB için)
CREATE INDEX idx_data_gin ON documents USING GIN(data);
-- Kullanılmayan indexleri bul
SELECT schemaname, tablename, indexname, idx_scan
FROM pg_stat_user_indexes
WHERE idx_scan = 0;
Yedekleme ve Geri Yükleme
# Tek veritabanı yedekleme
pg_dump -h localhost -U postgres myapp > myapp_backup.sql
# Sıkıştırılmış yedek
pg_dump -h localhost -U postgres -Fc myapp > myapp_backup.dump
# Tüm veritabanlarını yedekle
pg_dumpall -h localhost -U postgres > all_databases.sql
# Geri yükleme (SQL)
psql -h localhost -U postgres myapp < myapp_backup.sql
# Geri yükleme (Custom format)
pg_restore -h localhost -U postgres -d myapp myapp_backup.dump
Vacuum ve Bakım
-- Manual VACUUM
VACUUM VERBOSE users;
-- VACUUM FULL (tablo kilitleme gerektirir)
VACUUM FULL users;
-- ANALYZE (istatistik güncelleme)
ANALYZE users;
-- REINDEX
REINDEX TABLE users;
-- Autovacuum durumu
SELECT schemaname, relname, last_vacuum, last_autovacuum
FROM pg_stat_user_tables;
Sonuç
PostgreSQL, kurumsal düzeyde güvenilirlik ve performans sunar. Doğru yapılandırma ve düzenli bakım ile mükemmel veritabanı performansı elde edebilirsiniz.