通过pgAgent实现PostgreSQL上的自动作业
在使用數據庫時,我們經常會需要在上面跑一些定時作業,例如轉歷史庫,批處理,定時維護數據等。Oracle可以通過其自帶的job機制來進行,作為Oracle的替代方案之一的PostgreSQL沒有自帶job機制,但是可以通過pgAgent來補全功能。
在pgAdmin v1.9版本之前,pgAgent是其安裝包的一部分,pgAdmin v1.9之后 pgAgent獨立成一個單獨的軟件包。
1. 環境
操作系統 RHEL 6.3
數據庫版本 PostgreSQL 10.3
2. 軟件下載獲取
在PG自己的yum源上可以下載到適配各個數據庫版本的pgAgent及其依賴包。可以選擇配置yum源安裝或者在沒有網絡的內網環境下通過下載安裝。如果下載安裝則要補全依賴包。我這里是內網RHEL 6.3 軟件工作站模式。需要下載:
wxBase-2.8.12-1.el6.x86_64.rpm pgagent_10-3.4.0-10.rhel6.x86_64.rpm3. 部署pgAgent
# rpm -ivh wxBase-2.8.12-1.el6.x86_64.rpm warning: wxBase-2.8.12-1.el6.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID 442df0f8: NOKEY Preparing... ########################################### [100%]1:wxBase ########################################### [100%]# rpm -ivh pgagent_10-3.4.0-10.rhel6.x86_64.rpm warning: pgagent_10-3.4.0-10.rhel6.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID 442df0f8: NOKEY Preparing... ########################################### [100%]1:pgagent_10 ########################################### [100%]默認pgAgent會被安裝在/usr/share/pgagent_10 目錄下,可執行文件位于/usr/bin/pgagent_10
軟件包安裝完成后在需要進行作業調度的數據庫執行以下腳本完成作業調度相關數據庫對象的創建工作(并非全局有效)
$ psql -U postgres -d postgres -f /usr/share/pgagent_10-3.4.0/pgagent.sql腳本執行完后會在數據庫內生成一個新的catalog,通過這個schema進行數據庫作業的調度。
最后還需要啟動pgAgent才算是全部完成。
$ pgagent_10 -s /PostgreSQL/10/data/pgagent.log hostaddr=127.0.0.1 port=5432 dbname=postgres user=postgres password=1234564.作業部署
完成pgAgent的安裝部署工作后,在pgAdmin上出現相應的菜單
通過pgAgent可以使用圖形化頁面維護作業,不知道填什么的時候注意看提示基本就知道了。
- 定義作業名稱
- 定義作業步驟
在General頁定義通用信息
?
在code頁定義需要執行的代碼
?
- 定義調度信息
在general頁定義基本信息
?
在Repeat頁定義周期,周期使用cron風格。
?
以上所有操作也可以通過SQL進行,上面所有操作對應的代碼如下:
DO $$ DECLAREjid integer;scid integer; BEGIN -- Creating a new job INSERT INTO pgagent.pga_job(jobjclid, jobname, jobdesc, jobhostagent, jobenabled ) VALUES (1::integer, 'job_test2'::text, ''::text, ''::text, true ) RETURNING jobid INTO jid;-- Steps -- Inserting a step (jobid: NULL) INSERT INTO pgagent.pga_jobstep (jstjobid, jstname, jstenabled, jstkind,jstconnstr, jstdbname, jstonerror,jstcode, jstdesc ) VALUES (jid, 'step1'::text, true, 's'::character(1),''::text, 'postgres'::name, 'f'::character(1),'insert into t1 values (999);'::text, ''::text ) ;-- Schedules -- Inserting a schedule INSERT INTO pgagent.pga_schedule(jscjobid, jscname, jscdesc, jscenabled,jscstart, jscend, jscminutes, jschours, jscweekdays, jscmonthdays, jscmonths ) VALUES (jid, 'job_sch_test2'::text, ''::text, true,'2018-05-24 15:12:33+08'::timestamp with time zone, '2018-05-25 15:12:39+08'::timestamp with time zone,-- MinutesARRAY[false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, true, true, true]::boolean[],-- HoursARRAY[false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false]::boolean[],-- Week daysARRAY[false, false, false, false, false, false, false]::boolean[],-- Month daysARRAY[false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]::boolean[],-- MonthsARRAY[false, false, false, false, false, false, false, false, false, false, false, false]::boolean[] ) RETURNING jscid INTO scid; END $$;再回到圖形界面,除了預先定義好的作業外,通過作業上的run now選項可以立刻執行一次。
上面的設置里我選擇在每天的15點56-59分,一共執行4次作業,每次向t1表寫入一條數據。完成后
?
5. pgAgent的數據字典表
pgAgent的相關表都位于Catalogs/pgAgent下。
pga_exception : 記錄作業執行異常信息
pga_job: 作業定義的基本信息,作業起止時間,最后運行時間等
pga_jobagent:pgAgent的配置信息,服務器上pgAgent的地址和啟動時間
pga_jobclass: pgAgent的配置信息,定義作業類型
pga_joblog:每個作業的運行日志,包含啟動時間、執行時長。
pga_jobstep:每個job步驟的定義在這個表里。
pga_jobsteplog:每個job步驟的執行日志,包含步驟的開始時間,執行時長。
pga_schedule:job調度的定義在這個表里。
?
轉載于:https://www.cnblogs.com/aegis1019/p/9085133.html
總結
以上是生活随笔為你收集整理的通过pgAgent实现PostgreSQL上的自动作业的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 饿了么CTO张雪峰:允许90后的技术人员
- 下一篇: Linux SSH和SFTP服务分离