PostgreSQL - Boşta Kalan Oturumları Kapatma
3 min read

PostgreSQL - Boşta Kalan Oturumları Kapatma

PostgreSQL - Boşta Kalan Oturumları Kapatma

Merhaba,

Bu yazımda sizlere ile PostgreSQL veri tabanında, "idle" yani boşta duran oturumları nasıl kapatacağımızı anlatmaya çalışacağım.

Buna Neden İhtiyacımız Var?

Bazen programlama aşamasında işlem bittikten sonra soketi tam olarak kapatmayabilir veya var olan bağlantımız bir şekilde asılı durumda kalmış olabilir.

Bir Öneri!

Programlama aşamasında soketin yani bağlantının kapatıldığından emin olunuz. Bazı hata durumlarında bağlantı açık kalabilir. Bu ve bunun gibi durumlar veri tabanında boşta duran oturumlara sebep olur. Böylelikle hem veri tabanı performansını hem de sunucu performansını olumsuz etkileyecektir. Bu makalede sizlere anlatacağım SQL kodunu bir cron görevini atayabilirsiniz veya "postgres.conf" dosyasında yapacağını bazı değişiklik ile de aynı işlemi gerçekleştirebilirsiniz.

Nasıl Yapacağız?

"pg_stat_activity" tablosu postgresql veri tabanınıza bağlı olan oturumları listeler. Sadece listelemek ile kalmaz, bu oturumların bilgisini de içerir.

select * from pg_stat_activity

sorgusu ile  sizde bağlı olan oturumları listeyebilirsiniz. PgAdmin4 uygulaması ile ana ekranda da görebilirsiniz. Bu yazıda daha çok manuel işlemleri ele aldığımız için sorgularla devam ediyorum. İlgili tablomuzda bazı parametreler ile amacımıza ulaşacağız. Parametreler aşağıdaki gibidir:

  1. datname
  2. usename
  3. state
  4. state_change

Bu parametreleri kendinize göre düzenleyebilirsiniz.

"usename" alanı hangi kullanıcı adı ile bağlandığını gösterir.
"datname" alanı hangi veri tabanına bağlandığını gösterir.
"state" oturumun hangi durumda olduğunu gösterir. "idle" değeri boşta olduğunu gösterir.
"state_change" bu alan ise son değişiklik zamanını gösterir.

Peki SQL Sorgumuz Nasıl Olmalı?

select pg_terminate_backend(pid) from pg_stat_activity where (datname='test') and (state='idle') and (usename='postgres') and (state_change + time '00:00:59' < now());

pg_terminate_backend(pid) komutu oturumu sonlandırmaya yarar. Parametre olarak sizden "pid" yani ilgili oturumun id değerini ister. "id" değerini pg_stat_activity tablosunda "pid" alanında bulabiliriz.

state_change + time '00:00:59 bu değer ise anlayacağınız üzere 59 saniyeden sonra işlem yapmamış kullanıcıları listeliyoruz. Yani state_change alanında 59 saniye ekleyip, şimdiki zaman ile karşılaştırıyoruz.

Yapılandırma Dosyası Hakkında

"C:\Program Files\PostgreSQL\12\data" yoluna gidiniz. "postgresql.conf" dosyasını düzenleyiniz..

#idle_in_transaction_session_timeout = 0 # in milliseconds, 0 is disabled

değerini

idle_in_transaction_session_timeout = 10000 # 10 second

değeri ile değiştiriniz. 10000 millisaniye cinsindendir. Yani 10 saniyeye tekabül etmektedir. Sonraki işlemler ise; PostgreSQL hizmetini yeniden başlatınız. Sonrasında ise aşağıdaki sorguyu çalıştırınız.

SELECT pg_reload_conf();

Bu sorgu işlemlerinizin tanınmasını sağlar.

CLI için yeniden başlatma komutları:

service postgresql restart
sudo su postgres
pg_ctl reload
psql -U postgres
SELECT pg_reload_conf();

Kaynaklar:

Client Connection Defaults
Date/Time Functions and Operators
[Reload PostgreSQL config] After updating pg_hba.conf or postgresql.conf, the server needs the config needs to be reloaded. #postgres
[Reload PostgreSQL config] After updating pg_hba.conf or postgresql.conf, the server needs the config needs to be reloaded. #postgres - reload-config-postgresql.md

Sağlıcakla kalın!