postgresql 定期任務的 PG_cron

基本上大部分數據庫都有定時任務,最近開發問我PostgreSQL 要做定時任務,有的存儲過程要在夜間去和financial 的 服務器來交互。我的第一個反應就是用LINUX 的定時任務不就可以了,但這個程序員提出 SQL SERVER ORACLE 都有定時任務,postgresql 也應該有吧。所以就有了這篇文字

首先爲什麼選擇pg_cron ,pg_cron 在安裝上要方便與 pgagent,也曾經安裝過pgagent 但衆多的一些依賴以及編譯中的問題,導致pgagent 在某些初始化的方面並不友好。

pg_cron 是 citus 的一款開源產品,citus 也是POSTGRESQL 分佈式插件的產品提供者。

安裝相當簡單

curl https://install.citusdata.com/community/rpm.sh

下載相關的 package repository

sudo yum install -y pg_cron_11

然後就直接yum 安裝即可

安裝完後,需要的是對他與postgresql進行配置

shared_preload_libraries = 'pg_cron'
cron.database_name = 'postgres'

但實際上如果這樣安裝很可能會,無法啓動postgresql報無法找到pg_cron文件,別問爲什麼(呵呵)

這邊能正常進行安裝的方式是從git上下載文件,直接在有PG_CONFIG 的環境下,直接進行make ,make install 即可。

安裝後還是需要在postgresql.conf 中添加那兩句,重啓服務器後就可以正常使用了

實際當中安裝了pg_cron 擴展會在當前數據庫生成一張cron.job表

下面就演示存儲過程定期運行例子,數據庫啓動時會啓動pg_cron

添加一個測試表

我們定期每分鐘,往表裏面插入一條數據

實際當中如果認爲這麼容易就能進行定期任務的執行那麼大概率會失敗

1 PG_CRON 使用的是libpq 的方式連接,也就是說他執行命令的方式不是在內部,直接執行命令,而是他通過連接的方式將命令發送進來,在執行。

2 既然如此,那有兩點(經過碰過釘子,並且查詢大部分相關文檔都沒有找到明確的答覆),是需要注意的,1 nodename ,必須是本機的IP地址如果你配置了監聽地址,則最好你的數據庫服務的監聽地址就是你填入nodename的地址。

2 你需要保證PG_HBA.CONF 中允許你的賬戶進行免密的訪問,當然如果不行請設置.pgpass 到postgres 的用戶目錄中,否則你會經常看到無法連接的錯誤。

另外發現很多文章在說一個事情的時候,部分是不求細節的,例如如果我只想的語句是這樣的 怎麼辦  call insert_D('a','b')寫入到表裏面如果按照固定的格式,前後加'' 那是一定會報錯的,具體使用還需要注意

插入的數據的時候,需要在有單引號的地方,在添加單引號,

INSERT INTO cron.job (schedule, command, nodename, nodeport, database, username) VALUES ('0 4 * * *', 'call insert_D(''a'',''b'');', 'node-1', 5432, 'postgres', 'postgres');

或者下面的寫法也可以被接受。

INSERT INTO cron.job (schedule, command, nodename, nodeport, database, username) VALUES ('0 4 * * *', $$call insert_D('a','b')$$, '192,.168.198.120', 5432, 'postgres', 'job');

另在cron 中會有兩個函數,來進行添加和取消定時任務,但實際操作中,直接操作 cron.job 表的方式更爲直接

使用函數添加JOB,需要提供什麼時間允許,以及運行什麼命令

取消的函數,直接給出job_id 就會直接需要禁止的JOB 的數字就可以了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章