PostgreSQL veritabanında veritabanı değişikliklerinin yazıldığı dosyalara WAL (Write Ahead Log) ismi verilir. Birçok veritabanında farklı adlarda da olsa aynı yapı bulunmaktadır. Veritabanında yazma yükü fazla ise WAL dosyaları çok sık olarak yeni dosyaya geçmektedir (WAL Switch). Bu durum veritabanı performansına olumsuz etki yapar.
PostgreSQL veritabanında WAL dosya büyüklükleri varsayılan olarak 16M olarak tanımlanmıştır. Bu günümüz iş yüklerini dikkate aldığımızda hayli küçük kalmaktadır. Bu yazıda WAL dosya boyutlarını nasıl değiştirebileceğimizden bahsedeceğiz.
Eğer hiçbir parametre vermeden veritabanı oluşturursak WAL dosyaları için 16M olarak varsayılan boyut verilir. Fakat istersek WAL boyutunu belirleyebiliriz. Komut satırında verilecek boyut MB cinsinden belirtilebilir ve 2 üzeri 0-10 arası değer verilebilir. Verilebilecek segment boyutları şunlardır: 1, 2, 4, 8, 16, 32, 64, 128, 256, 512 ve 1024.
initdb -D /pgdata/data --wal-segsize=256
Veritabanını başlattıktan sonra WAL boyutunu görebiliriz.
$ pg_ctl start -D /pgdata/data $ psql postgres postgres=# show wal_segment_size; wal_segment_size ------------------ 256MB (1 row)
Şimdi var olan veritabanında WAL büyütmesini nasıl yapabileceğimize bakalım. WAL dosyalarında veri değişiklikleri bulunduğu için, dosyaların bozulması verilerin kaybolmasına neden olur. Bu yüzden WAL dosyaları çok önemlidir. WAL dosyalarının boyutunu büyütebilmek için PostgreSQL kurulumu ile gelen pg_resetwal uygulamasını kullanacağız. Bu uygulama mevcut WAL dosyalarını siler ve istediğimiz boyutta yeni bir WAL dosyası oluşturur. Oracle ortamlarına aşina olan DBA’larin RESET LOGS ile veritabanı açmasına eşdeğerdir. pg_resetwal kullanılmadan önce veritabanının temiz olarak kapatılmış olması büyük önem arz etmektedir. Eğer WAL’larda hala datafile’lara yazılmamız veriler bulunuyorsa (checkpoint tamamlanmamışsa) veritabanı artık açılmaz, veriler bozulur. Dolayısıyla pg_resetwal yapmadan önce, garanti tarafta kalmak açısından veritabanı uzak bağlantıya kapatılıp (listen_address = ‘localhost’ ile), en az iki defa kapatıp açılmasını tavsiye ediyorum.
Gerekli açıklamalardan ve alınmış tedbirlerden sonra, aşağıdaki gibi, WAL dosya boyutlarını istediğimiz gibi ayarlayabiliriz. Örnekte 1GB yapıyoruz.
pg_resetwal -D /pgdata/data/ --wal-segsize=1024
Veritabanını açalım:
pg_ctl -D /pgdata/data -l dbwal.log start waiting for server to start.... stopped waiting pg_ctl: could not start server Examine the log output. [postgres@pgadmintest pg_wal]$ cat dbwal.log 2023-07-14 09:53:02.552 +03 [14990] FATAL: "min_wal_size" must be at least twice "wal_segment_size" 2023-07-14 09:53:02.552 +03 [14990] LOG: database system is shut down
Veritabanı açılırken bir hata ile kapandı, log kayıtlarının açıkladığı gibi, min_wal_size parametresinin değeri (varsayılan 80MB) ayarlanan wal_segment_size değerinin en az 2 katı olması gerekiyor. Buna ek olarak max_wal_size (varsayılan 1GB) parametresi de checkpoint’leri etkilediğinden en az 4 WAL size kadar olmasını tavsiye ediyorum.
Tüm durumlar için aşağıdaki parametreleri postgresql.conf dosyasına yazmalıyız:
min_wal_size = 2048 max_wal_size = 4096
Veritabanını başlatıp, yeni WAL boyutunu görebiliriz.
$ pg_ctl -D /pgdata/data -l dbwal.log start $ psql postgres postgres=# show wal_segment_size; wal_segment_size ------------------ 1GB (1 row)
Gerçek ortamlarda bu işlemin yapılması kesinti gerektireceğinden planlı çalışma kapsamında yapılmalıdır.
Referanslar: pgresetwal
0 Yorum