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
job_run_details
tablolarından zamanlanmış görevlerle ilgili detaylar görülebilir.

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

Kategori seçin...