
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