pg_cron
postgres=# select version(); version --------------------------------------------------------- PostgreSQL 14.5 (Debian 14.5-1.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc sudo apt install postgresql-14-cron alter system set shared_preload_libraries = 'pg_cron' ; sudo systemctl restart postgresql@14-main.service ps -ef |grep postgres |grep pg_cron |grep -v grep postgres 1152 1145 0 16:06 ? 00:00:00 postgres: 14/main: pg_cron launcher postgres=# CREATE EXTENSION pg_cron; postgres=# \dn List of schemas Name | Owner --------+---------- cron | postgres public | postgres
pg_cron kullanımı unix/linux sistemlerindeki cron ile aynı mantığa sahiptir.
15 03 * * * → Her gece 03:15 anlamındadır.
Önce çalışan postgresql sürümü kontrol edilir ve pg_cron uygun versiyonu kurulur.
Veritabanı ayarlarında shared_preload_libraries ayarı yapılır, restart edilir ve
extension oluşturulur.
Eklentiyle (extension) birlikte cron adında bir schema gelir. Cron schema’sının cron ve tablolarından zamanlanmış görevlerle ilgili detaylar görülebilir.
job_run_details
Ayarlar
Adım 1
vim /etc/postgresql/14/main/postgresql.conf
cron.database_name = postgres cron.enable_superuser_jobs = on cron.host = localhost cron.log_min_messages = debug2 # warning, info, debug gibi değerler alabilir cron.log_run = on cron.log_statement = on cron.max_running_jobs = 5 cron.use_background_workers = on
Manuel olarak postgresql.conf dosyasına yukarıdaki formatta değerler girilerek
ayarlanabilir. Ayarların aktif olabilmesi için restart gereklidir.max_worker_processes değeri cron.max_running_jobs değerinden
yüksek olmalı.
Adım 2
vim /etc/postgresql/14/main/pg_hba.conf aşağıdaki satır eklenir
kapatıp açıldıktan sonra ayarlar kontrol edilir.
host postgres postgres localhost trust sudo systemctl restart postgresql@14-main.service SELECT name, setting, short_desc FROM pg_settings WHERE name LIKE 'cron.%' ORDER BY name; name | setting | short_desc --------------------------------------------------------------------------- cron.database_name | postgres | Database in which pg_cron metadata is kept. cron.enable_superuser_jobs | on | Allow jobs to be scheduled as superuser cron.host | localhost | Hostname to connect to postgres. cron.log_min_messages | debug2 | log_min_messages for the launcher bgworker. cron.log_run | on | Log all jobs runs into the job_run_details cron.log_statement | on | Log all cron statements prior to execu cron.max_running_jobs | 5 | Maximum number of jobs that can run conc cron.use_background_workers | on | Use background workers instead of client (8 rows)
Cron için hangi veritabanı kullanılacaksa adım 1’de ve 2’de aynı veritabanı ismi
girilmelidir.
Örnek
SELECT cron.schedule(‘av off’,’43 9 * * *’,’alter system set auotvacuum=off ;’); SELECT cron.schedule(‘reload’, ‘43 9 * * *’, ‘select pg_reload_conf();’); SELECT * FROM cron.job ; jid| schedule | command |nodename |port|database|username| -----+----------+---------------------------------+---------+-----+--------+- 20 |43 9 * * *|alter system set autovacuum=off ;|localhost|5432 |postgres|postgres 21 |43 9 * * *|select pg_reload_conf(); |localhost|5432 |postgres|postgres SELECT * FROM cron.job_run_details ; jid|runid|job_pid|db|user|command|status|return_message|start_time| end_time ---+-------+---------+----------+----------+-------+-----------+-------------- 21|10 |8617|postgres|postgres|select|succeeded|SELECT 1 |12:43:00 |12:43:00 20|11 |8619|postgres|postgres|alter|succeeded |ALTER SYS|12:43:00 |12:43:00
‘job ismi’ , ‘zaman’ , ‘çalıştırılacak SQL’ formatında giriş yapmak gerekiyor.
Yukarıdaki örnekte ilk cümle her öğlen 12:43’te autovacuum özelliğini kapatır.
İkinci cümle 12:43’te ayarların geçerlilik kazanması için reload işlemini gerçekleştirir.
Girilen saatler yanlış değil UTC zaman diliminde çalışıyor. Yani Türkiye saatinden 3 saat
geride, bu yüzden Türkiye saati ile 12:43’ te çalışıyor.
SELECT now() at time zone ‘utc’; - Kontrol edilebilir.
Zamanlanmış görevlerin unschedule fonksiyonu ile silinmesi daha iyi olur. Job ID ile
silinebilir.
SELECT cron.unschedule(21);
Monitoring
postgres=# \dt cron.* List of relations Schema | Name | Type | Owner --------+-----------------+-------+---------- cron | job | table | postgres cron | job_run_details | table | postgres tail -f /var/lib/postgresql/14/main/log/postgresql-%d.log 12:43:00 +03 [919]:[23-1]user=,db=,app=,client=LOG:cron job 20 starting:alter system set autovacuum=off ; 12:43:00 +03 [919]:[24-1]user=,db=,app=,client= LOG: cron job 21 COMMAND completed: SELECT 1 1 12:43:00 +03 [919]:[25-1]user=,db=,app=,client= LOG: cron job 20 COMMAND completed: ALTER SYSTEM sudo systemctl status postgresql@14-main.service ├─ 919 postgres: 14/main: pg_cron launcher sudo ps -ef |grep pg_cron |grep -v grep postgres 0 Sep13 00:00:08 postgres: 14/main: pg_cron launcher
