時間:2021-02-10來源:www.farandoo.com作者:電腦系統城
前言
最近在工作的時候 需要用數據庫A中的表a1來更新插入數據庫B中的b2表 由于數據庫都是postgres數據庫
我想到了 postgres_fdw插件
準備工作
首先需要保證這兩個數據庫之間網 是通的
數據庫A 名字 AA ip 10.10.2.100(虛構)端口 5432 用戶名 postgres
數據庫B 名字 BB ip 100.20.0.120(虛構)端口 6688 用戶名 postgres
1 | Create extension "postgres_fdw" ; |
無論你實在A數據庫中創建B數據庫的連接 ,還是在B數據庫中創建A數據庫的連接 從本質上是一樣的,都是為了打通2個數據庫,實現數據互通
1.2.1 在A數據庫創建b數據庫的連接
1 2 3 4 5 6 |
--創建外部服務器 -- 括號里的三個參數,分別是數據庫b的ip、端口和數據庫名稱 CREATE SERVER lianjiebb FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '100.20.0.120' , port '6688' , dbname 'BB' ); --創建用戶映射· -- 括號里的兩個參數,分別是數據庫b數據庫的用戶名、密碼 create user mapping for postgres server lianjiebb options( user 'postgres' , password '數據庫密碼' ); |
1.2.2 在b數據庫創建a數據庫的連接
1 2 3 4 5 6 |
--創建外部服務器 -- 括號里的三個參數,分別是數據庫a的ip、端口和數據庫名稱 CREATE SERVER lianjieAA FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '10.10.2.100' , port '5432' , dbname 'AA' ); --創建用戶映射· -- 括號里的兩個參數,分別是數據庫a數據庫的用戶名、密碼 create user mapping for postgres server lianjieAA options( user 'postgres' , password '數據庫密碼' ); |
1.2.3 查詢 外部鏈接
1 | select * from pg_foreign_server; |
在A數據庫創建b1表的外部鏈接
1 2 3 4 5 6 7 8 9 10 |
CREATE FOREIGN TABLE tb_fdw_b1 ( collect_time timestamp (6), id varchar (36) , 列名1 numeric (12,2) , 列名2 int4 , 列名3 timestamp (6) ) --跟b1 一模一樣的表結構就行 server lianjiebb --你創建的外部鏈接名字 options (table_name '時序庫的表名' ); |
查看外部表是否有數,有數就表示ok了
1 | select * from tb_fdw_b1; |
在數據庫b上創建a1表的外部鏈接也是一樣的
因為 倆個表都是一樣的表結構,可以直接插入
1 | INSERT into tb_fdw_b1 SELECT * from a1; |
因為外部表是實時的 在數據庫a中更改了 外部表tb_fdw_b1 的數據 ,數據庫B中的b1表中的數據也隨之改變 達成了我們一開始的目的
更新 UPDATE 刪除DELETE 也是一樣的 在這里就不說了
每天都需要執行顯然不符合我們的“懶人”形象 ,所以用定時任務來實現明天自動同步是必不可少的 我讓他每天早上8點自動執行
3.1.1
3.1.2
3.1.3
3.1.4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
DO $$ DECLARE jid integer ; scid integer ; BEGIN -- Creating a new job INSERT INTO pgagent.pga_job( jobjclid, jobname, jobdesc, jobhostagent, jobenabled ) VALUES ( 1:: integer , '更新表b1' ::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, '更新表b1' ::text, true , 's' :: character (1), '' ::text, '數據庫A' :: name , 'f' :: character (1), ' INSERT into tb_fdw_b1 SELECT * from a1;' ::text, '' ::text ) ; -- Schedules -- Inserting a schedule INSERT INTO pgagent.pga_schedule( jscjobid, jscname, jscdesc, jscenabled, jscstart, jscend, jscminutes, jschours, jscweekdays, jscmonthdays, jscmonths ) VALUES ( jid, '更新表b1' ::text, '' ::text, true , '2021-02-07 10:24:50 +08:00' :: timestamp with time zone, '2100-02-07 10:24:52 +08:00' :: timestamp with time zone, -- Minutes ARRAY[ true , 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 , false , false , false ]::boolean[], -- Hours ARRAY[ false , false , false , false , false , false , false , false , true , false , false , false , false , false , false , false , 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 $$; |
到此這篇關于postgresql 利用fdw來實現不同數據庫之間數據互通的文章就介紹到這了
2022-02-25
系統城教小白如何在Centos8-stream安裝PostgreSQL132021-04-22
自定義函數實現單詞排序并運用于PostgreSQL(實現代碼)2021-04-19
MySQL命令行操作時的編碼問題詳解玩游戲的時候最怕跳出什么程序來干擾游戲,很多玩家在玩游戲過程中會遇到輸入法彈出來,影響游戲體驗,Win10玩游戲老跳出來輸入法怎么辦?按照以下的方法操作就可以解決這個問題了...
2021-02-19