接上一篇《PG-跨庫操作-dblink》;講下postgres_fdw的使用;postgres_fdw工作原理詳細介紹可以去看下《PostgreSQL指南》第4章; 對FDW特性;還支持在PostgreSQL異構資料庫的同步、遷移的場景。FDW隨著Postgres版本而升級、優化,對分散式架構也是支 ...
接上一篇《PG-跨庫操作-dblink》;講下postgres_fdw的使用;postgres_fdw工作原理詳細介紹可以去看下《PostgreSQL指南》第4章;
對FDW特性;還支持在PostgreSQL異構資料庫的同步、遷移的場景。FDW隨著Postgres版本而升級、優化,對分散式架構也是支持的。
一、新建插件postgres_fdw
安裝插件postgres_fdw
lottu01=# create extension postgres_fdw;
二、新建遠程資料庫伺服器
2.1、在本地庫創建SERVER
--1 賦予lottu01對應許可權
lottu01=# grant usage on foreign data wrapper postgres_fdw to lottu01;
GRANT
lottu01=# \c lottu01 lottu01
You are now connected to database "lottu01" as user "lottu01".
--2 創建server
lottu01=> CREATE SERVER lottu FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '192.168.1.221', port '6000', dbname 'lottu');
CREATE SERVER
2.2、在本地庫創建user mapper
lottu01=> CREATE USER MAPPING FOR lottu01 SERVER lottu OPTIONS (user 'lottu', password 'li0924');
CREATE USER MAPPING
2.3、創建外部表
lottu01=> CREATE FOREIGN TABLE t1 (id int, info text) server lottu OPTIONS (schema_name 'public', table_name 't1');
CREATE FOREIGN TABLE
lottu01=> select * from t1;
id | info
------+-------
1001 | lottu
1002 | hello
1003 | rax
1004 | rax
1005 | lottu
(5 rows)
2.4、導入外部表
CREATE FOREIGN TABLE中聲明的列數據類型和其他性質必須要匹配實際的遠程表。列名也必須匹配,不過也可以為個別列附上column_name選項以表示它們在遠程伺服器上對應哪個列。在很多情況中,要手工構造外部表定義,使用IMPORT FOREIGN SCHEMA會更好。
lottu01=> create schema ft;
CREATE SCHEMA
lottu01=> IMPORT FOREIGN SCHEMA public FROM SERVER lottu INTO ft;
IMPORT FOREIGN SCHEMA
三、擴展
3.1、相關係統表
通過下列系統表可以查看資料庫外部表信息。
系統表 | 簡命令操作 | 含義 |
---|---|---|
pg_extension | \dx | 插件 |
pg_foreign_data_wrapper | \dew | 支持外部資料庫介面 |
pg_foreign_server | \des | 外部伺服器 |
pg_user_mappings | \deu | 用戶管理 |
pg_foreign_table | \det | 外部表 |
3.2、使用優化
減少對遠端伺服器的連接影響;可以使用物化視圖;
--1、在本地資料庫創建物化視圖
create materialized view mv_t1 as select * from t1;
--2、 刷新一下本地的物化視圖即可看到新進來的數據:
refresh materialized view mv_t1
四、應用場景
4.1、數據同步
本地創建外部表;可對外部表支持執行delete、update、insert語句;同時遠程資料庫的表也會執行相對應的操作。例如兩個資料庫實現token的一致。
4.2、數據遷移
在導入外部表;可以實現數據遷移。
4.3、分散式架構使用
citus的實現原理是採用FDW特性。安裝很簡單;但維護註意點比較多;想要更多瞭解可以找陳華軍老師。