Press ESC to close

Streamlining Task Scheduling in PostgreSQL: A Deep Dive into pg_cron and Its Advantages

pg_cron, PostgreSQL veritabanında zamanlanmış görevleri çalıştırmayı sağlayan bir uzantıdır. Bu yazıda, pg_cronun ne olduğunu, geleneksel crontab ile farklarını ve avantajlarını ele alacağız. pg_cron, PostgreSQL için tasarlanmış Scheduleing Job işlemlerini sağlar. Kullanıcıların SQL komutlarını veya PL/pgSQL işlemlerini, belirli zaman aralıklarında veya belirli bir takvimde belirlenmiş şekilde çalıştırmasını sağlar.

Başlıca Özellikleri:

•PostgreSQL ile entegre çalışır.

•SQL tabanlı iş planlama sağlar.

•İş durumları ve hataları, veritabanı tablolarında saklanır.

•Zamanlanmış görevler üzerinde kolay kontrol ve denetim sunar.

pg_cron ile crontab Karşılaştırması

pg_cron: Zamanlanmış işler ve bunların çalıştırılma durumları, PostgreSQL tabanlı tablolar kullanılarak depolanır. Bu, işlerin kolayca sorgulanmasını ve yönetilmesini sağlar.

crontab: İşler ve loglar sistem düzeyinde tutulur. Veritabanı ile doğrudan entegrasyonu yoktur ve loglar üzerinde SQL ile çalışmak mümkün değildir.

pg_cron: Veritabanında çalışan işlemleri zamanlamak için idealdir. Örneğin, periyodik yedekleme, veri temizleme veya analitik işlemler gibi işlerde kullanılır.

crontab: Sistem düzeyindeki işler için daha uygundur (örn. sistem bakımı, dosya transferleri).

pg_cron: Her bir işin çalışma durumu (cron.job_run_details tablosu) PostgreSQL’de saklanır. Bu, hataların kolayca analiz edilmesini sağlar.

crontab: Hata yönetimi genellikle dış log dosyalarına dayanır. Detaylı bir sorgulama yapmak zordur.

 

RHEL 8 de pg_cron yüklemek için rpm rpm lerini yüklüyoruz ardında shared_preload_libraries e pg_cron eklemesi yapıp vertabanını tekrar çalıştırıyoruz.

# yum install -y pg_cron_16

[postgres@postgresdb ~]$ cd $PGDATA
[postgres@postgresdb data]$ vi postgresql.conf


shared_preload_libraries = 'pg_cron'


$ pg_ctl stop
waiting for server to shut down.... done
server stopped
$ pg_ctl start
waiting for server to start....2025-01-06 18:49:42.456 UTC [3274724] LOG:  redirecting log output to logging collector process
2025-01-06 18:49:42.456 UTC [3274724] HINT:  Future log output will appear in directory "log".
 done
server started

son olaral psql ile bağlanıp extensionı aktifleştiriyoruz

postgres=# CREATE EXTENSION pg_cron;
CREATE EXTENSION

extensionları kontrol edelim 

postgres=# \dx
                                            List of installed extensions
        Name        | Version |   Schema   |                              Description
--------------------+---------+------------+------------------------------------------------------------------------
 pg_cron            | 1.6     | pg_catalog | Job scheduler for PostgreSQL
 pg_stat_statements | 1.10    | public     | track planning and execution statistics of all SQL statements executed
 plpgsql            | 1.0     | pg_catalog | PL/pgSQL procedural language
(3 rows)

Ayrıca pg_cron default olarak postgres veritabanında çalışır olarak gelecektir farklı bşr veritabanı için bunu etkinleştirmek istiyorsak postgresql.conf dosyasında aşağııdaki satırı eklemeliyiz

cron.database_name = 'mydb'

sonrasında

mydb=# CREATE EXTENSION pg_cron;
CREATE EXTENSION

Şimdi ise oluşturduğumuz bir funciton ı 15 dk da bir çalışmasını sağlayacak schedule yazalım

SELECT cron.schedule(
    '*/15 * * * *', 
    $$ 
    SELECT x_user_counts_unq_job(); 
	COMMIT;
    $$ 
);

bu yazdığımız job un schedule edlip edilmediğini kontrol edebileceğimiz tabloları kontrol edelim;

# SELECT * FROM cron.job;
-[ RECORD 1 ]----------------------------------
jobid    | 1
schedule | */15 * * * *
command  |                                     +
         |     SELECT x_user_counts_unq_job(); +
         |         COMMIT;                     +
         |
nodename | localhost
nodeport | 5432
database | akisdb
username | sysdba
active   | t
jobname  |

Job çalıştımı başarılımı onu kontrol edelim

# SELECT * FROM cron.job_run_details;
-[ RECORD 1 ]--+-------------------------------------
jobid          | 1
runid          | 1
job_pid        | 3285434
database       | akisdb
username       | sysdba
command        |                                     +
               |     SELECT x_user_counts_unq_job(); +
               |         COMMIT;                     +
               |
status         | succeeded
return_message | COMMIT
start_time     | 2025-01-06 19:30:00.191982+00
end_time       | 2025-01-06 19:30:08.123698+00

Bu job ı iptal etmek için cron.job tablosundan o kaydı silmemiz gerekir doğrudan delete yapabiliriz veya aşağıdaki komut ile de silebiliriz. cron.unschedule içerisine job id yi veya job name yazarak bu işlemi yapabiliriz.

SELECT cron.unschedule(1);

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir