有時會希望透過 PostgreSQL 拉資料來進行分析,來減輕工作中資料庫的負擔。這一般是利用所謂 ETL 工具定時拉資料達成。不過由於 PostgreSQL 本身就有排程工具的專案,而且在近幾版本的 PostgreSQL9.x 能夠外接資料,因此用此來試試看。
pgAgent 是一個 PostgreSQL 的排程作業工具,而 Foreign Data Wrapper 是 PostgreSQL 的外部資料源存取架構。這兩樣搭起來,加上在 9.5 版引入的UPSERT 功能:INSERT ... ON CONFLICT ... ,就能達成跨資料庫進行資料更新/同步的作業雛型。
在此使用 PostgreSQL 社群維護的 YUM Repo 在 CentOS7 下進行示範;如果使用 EnterpriseDB 公司維護的 PostgreSQL Distribution 可以透過圖像界面安裝工具 Stack Builder 進行。
[root@vm ~]# yum install epel-release [root@vm ~]# yum install https://download.postgresql.org/pub/repos/yum/9.5/redhat/rhel-7-x86_64/pgdg-centos95-9.5-2.noarch.rpm [root@vm ~]# yum install postgresql95{,-server,-contrib} pgagent_95
初始化資料庫服務:提醒一點,資料庫的初始化一般使用 initdb 就能完成,在此使用 postgresql-setup 指令,是為了一併產生相關的作業系統服務檔,以便後續使用:
[root@vm ~]# /usr/pgsql-9.5/bin/postgresql95-setup initdb /usr/lib/systemd/system/postgresql-9.5.service
方便起見,將 pg_hba.conf 預設設置變更,以利後續進行
host all all 127.0.0.1/32 trust host all all ::1/128 trust
然後啟動它,以及設置開機啟動:在 CentOS7 底下(SystemD 管理系統),系統服務檔位在 /usr/lib/systemd/system/ 底下,不知道服務名稱可以來這找(例如待會會用到的 pgAgent_95 服務):
[root@vm ~]# chkconfig postgresql-9.5 on [root@vm ~]# service postgresql-9.5 start
設置 pgAgent 服務:pgAgent 會在一個「Maintenance Database」建立相關服務資料表,該服務便可以針對此 Instance 上面,全部的 Database 設置排程活動
[root@vm ~]# su postgres bash-4.2$ psql -d postgres psql (9.5.4) Type "help" for help. postgres=# CREATE EXTENSION pgagent; postgres=# \q
直接啟動 pgAgent:這會在 postgres 下運作,後續便可以對此一 Cluster 內的 Database 進行排程設置
[root@vm ~]# pgagent_95 user=postgres host=127.0.0.1 dbname=postgres
或是設置 pgAgent 的系統服務:一般會把 pgAgent 套件在 postgres 這個 database 下啟用,這也是系統服務檔 /usr/lib/systemd/system/pgagent_95.service 內所預設的值,有需要可以在系統服務檔變更
[root@vm ~]# -- 編輯 pgAgent 連線資訊 [root@vm ~]# cp /usr/lib/systemd/system/pgagent_95.service /etc/systemd/system/pgagent_95-new.service [root@vm ~]# vi /etc/systemd/system/pgagent_95-new.service
編輯完之後:
[root@vm ~]# systemctl daemon-reload [root@vm ~]# -- 啟動系統服務 [root@vm ~]# chkconfig pgagent_95-new on [root@vm ~]# service pgagent_95-new start
以上便將環境設置完成。
接著進行練習:
登入進去資料庫,設置測試的兩個資料庫,srcdb 與 trgdb
[root@vm ~]# su postgres bash-4.2$ createdb srcdb bash-4.2$ createdb trgdb bash-4.2$ psql -d srcdb psql (9.5.4) Type "help" for help. srcdb=#
先在 srcdb 建立測試的資料:初始資料
srcdb=# CREATE TABLE tstdata(id SERIAL UNIQUE, smpdata TEXT); srcdb=# DO $$ BEGIN FOR i IN 1..10000 LOOP INSERT INTO tstdata(smpdata) SELECT md5(random()::text); END LOOP; END $$;
另外開一個 Shell 登入 trgdb,啟用 Foreign Data Wrapper、pgAgent(PL/pgSQL 預設安裝好了)
[root@vm ~]# su postgres bash-4.2$ psql -d trgdb psql (9.5.4) Type "help" for help. trgdb=# CREATE EXTENSION postgres_fdw;
建立連線到 srcdb 的 Foreign Data Wrapper 連線與表格:方便起見,進階帳號密碼設置沒有進行。
trgdb=# CREATE SERVER srcdb_pgsql FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'localhost', port '5432', dbname 'srcdb'); trgdb=# CREATE USER MAPPING FOR postgres SERVER srcdb_pgsql OPTIONS (user 'postgres'); trgdb=# CREATE FOREIGN TABLE foreign_tstdata( id SERIAL, smpdata TEXT) SERVER srcdb_pgsql OPTIONS (schema_name 'public', table_name 'tstdata');
先載入目前有的初始資料
trgdb=# CREATE TABLE offload_tstdata ( id SERIAL UNIQUE, smpdata TEXT); trgdb=# INSERT INTO offload_tstdata SELECT * FROM foreign_tstdata;
現在,在源頭表格開始利用 pgbench 工具產生資料活動,在此僅以 INSERT 活動練習
[root@vm ~]# su postgres bash-4.2$ cat << EOF > ~/insert_activity.sql INSERT INTO tstdata(smpdata) SELECT md5(random()::text); SELECT pg_sleep(10); EOF bash-4.2$ /usr/pgsql-9.5/bin/pgbench -U postgres -d srcdb -T 1800 -f ~/insert_activity.sql
資料更新策略:使用 pg_agent 定時執行資料載入的作業,等下要放到 pgAgent 裡面
INSERT INTO offload_tstdata SELECT * FROM foreign_tstdata ON CONFLICT (id) DO UPDATE SET id = EXCLUDED.id, smpdata = EXCLUDED.smpdata ;
現在要將上述置入 pgAgent 中,然後定時作業就完成了:不過在 psql 下自行填妥 pgAgent 資料不容易,需要透過 pgAdmin 進行。
接下來就是操作 pgAdmin3 設置 pgAgent 作業。
(Note:使用 pgAdmin4 的操作也相似)
- 先登入有啟用 pgAgent 物件的 database:
- 可以看到裡面有一個 pgAgent System Catalog 和一個 Job 物件:
- 在 Job 上新增作業:
- 總共有三個頁籤要設置:
1.命名排程作業名稱
2.設置作業內容:把上述擬定的資料更新指令放進來
3.設置作業時程
接著便可按下 OK 啟動。
觀察同步:(放置同步前後的資料差別)
前
|
後
|
pg_Agent 作業檢視視窗
| |
資料的變動
| |
同步成功。
這個練習所用的方法的缺點很多(!):每次都走遍整張遠端表格進行更新才能兼顧資料更新與插入資料、無法同步刪除動作等。不過不介意的話,也可以用此方法定期重新匯入資料,就不管更新或刪除等異動,直接重匯了。
如果想要簡單方便的進行資料同步的話,則可以用 EnterpriseDB 發行的的產品 - xDB SMR 功能。
xDB SMR 分成(1)透過 JDBC 將整個表格重新匯入(2)使用 Trigger 紀錄 DML 活動,再定時重演這些 DML 活動。後者便能夠達成同步新增修改刪除等異動(類似 Oracle Materialized View 的方式進行同步的)。
參考:
其他排程工具
因為剛剛接觸 postgre,且對於 linux 不熟悉,想請問一下 pgagent 有辦法直接在 windows 環境下安裝嗎?目前使用 production 的 postgre 裝在 linux 上,postgre 版本是 9.2.4,Linux 版本是 Red Hat 7.2 版,已經安裝 pgadmin 在 Windows7,打算透過 pgadmin 管理 postgreSQL,有需要用到 pgagent job 的功能
回覆刪除pgagent 是資料庫端的套件喔~
刪除只要在資料庫主機上面設置好 pgagent,就可以在 pgadmin 裡面看到設定功能了。
不過照你所述,我猜這個系統用的是 RHEL 7 的 YUM Repo 提供的 Postgres 9.2,印象中裡面沒有提供 pgagent 的 RPM 安裝檔...
有需要的話,可能需要參考 http://wundercode.blogspot.tw/2015/04/installation-pgagent-on-centos.html 或 http://opentechrains.blogspot.tw/2016/12/how-to-install-postgresql-pgagent.html 從原始碼安裝才行。
或者是,可能需要考慮替換成 EnterpriseDB / OpenSCG / Postgres YUM Repo 等發行版,裡面才有提供 pgagent。不過這些涉及升版的作業,需要評估與規劃才行~
不過新版 Postgres 有更多的功能與更好的效能,很值得考量升級~~
感謝您的回覆,依您所言,在目前的情況下,我必須在 server 端安裝 pgagent 套件,完成之後,從 windows 端的 pgadmin (目前使用 pgadmin 4 V2.1) 就可以使用這個功能了,pgagent 並沒有提供 windows 端的安裝版本。
刪除此外,在請教一個問題,我在網路上有看到 navicat 有提供給 windows 安裝的 postgre 產品,是否我只要購買了這個產品,因為是屬於商業開發版本的 postgres,因此我可以不用在 linux server 端安裝 pgagent 這個套件,就可以使用這樣的功能呢?
不好意思
刪除我目前的理解是,pgagent 是一個跟資料庫一起運行的系統服務與外掛。
因此我現在所知道的 pgagent 設定方式只有跟資料庫裝在一起的設置方法.....
至於 navicat 我目前只知道它是一款 client 工具,能夠支援連線到多種資料庫進行開發。但是可能跟 PGSQL server 企業版是兩件事....
感謝您的耐心回覆,因為我剛剛接觸這塊大約三個月左右,您的訊息對我來講已經受用不盡。在請教
回覆刪除1. PGSQL 企業版是否可以免費(或付費)下載?
2. 敢決您在這方面已經鑽研了一段時日,除了在這裡與您互動之外,是否有其他方式可以與您互動呢?
1. 關於 Postgres 的企業版,您可以參照 EnterpriseDB(由歐立威科技代理,http://www.omniwaresoft.com.tw/)
刪除或是 OpenSCG BigSQL (不知道是否有人服務),
以上的 PostgreSQL 皆可以下載使用,功能上即一般的 PostgreSQL
除了 EnterpriseDB 的企業版有內建加值功能(Oracle語法相容性),需要洽詢代理商
2. 歡迎您加入 PostgreSQL 的台灣用戶 FB 社團 https://www.facebook.com/groups/pgsql.tw/
上面可以作使用上的問題交流~