通過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.rpm
3. 部署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=123456
4.作業部署
完成pgAgent的安裝部署工作後,在pgAdmin上出現相應的菜單
通過pgAgent可以使用圖形化頁面維護作業,不知道填什麽的時候註意看提示基本就知道了。
- 定義作業名稱
- 定義作業步驟
在General頁定義通用信息
在code頁定義需要執行的代碼
- 定義調度信息
在general頁定義基本信息
在Repeat頁定義周期,周期使用cron風格。
以上所有操作也可以通過SQL進行,上面所有操作對應的代碼如下:
DO $$ DECLARE jid 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, -- Minutes ARRAY[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[], -- Hours ARRAY[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 days ARRAY[false, false, false, false, false, false, false]::boolean[], -- Month days ARRAY[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[], -- Months ARRAY[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調度的定義在這個表裏。
通過pgAgent實現PostgreSQL上的自動作業