PostgreSQL DB link (FDW)
- Foreign Data Wrappers (FDW)
- 可用以進行跨資料庫 query, insert, delete 指定資料表等操作。
- 非預設功能,需手動安裝 PostgreSQL Extension
- 可連結多種資料源:
- SQL Databases: Oracle, MySQL, ODBC, JDBC
- NoSQL Databases: CouchDB, Mongo, Redis
- Files: CSV, Text, even JSON
- Hadoop, Hive, Elastic Search
FDW 參考資料
Foreign Data Wrappers 設定步驟
- 以 PostgreSQL 10 為例
- role totem 自 totem DB 連線到 insect DB 為例
- 需安裝 postgresql10-contrib 套件。
- 設定連線驗証方式 pg_hba.conf
- 安裝 postgres_fdw Extension 擴充功能
- 設定 Foreign Server
- 設定 User Mapping: 當前 Role 與遠端 DB role 建立關聯。
- Local 設定 Foreign Table 代理人
- Grant Authority of Foreign Table to Role
- 查詢 Foreign Server / Foreign Fable
- Local 查詢遠端資料使用範例
- 其他
安裝 postgresql10-contrib 套件。
# 列出已安裝的 postgresql 套件
$ yum list installed | grep postgresql
# 安裝 contrib 套件
$ yum install postgresql10-contrib
pg_hba.conf 設定連線驗証方式
- 預設驗証方式為 trust (只能讓 role postgres 使用 FDW)
- trust 改 md5 做為連線驗証方式
pg_hba.conf 設定範例:
# TYPE DATABASE USER ADDRESS METHOD
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# IPv6 local connections:
#host all all ::1/128 md5
host all all 192.168.X.0 255.255.255.0 md5
安裝 postgres_fdw Extension
- 以 postgres 權限 在 totem DB 進行 extension 安裝
- 並授權給指定 Role totem 使用
--login
psql -U postgres
--connection to totem
\c totem
--install fdw
CREATE EXTENSION postgres_fdw;
--讓 role totem 可以執行 FDW
GRANT USAGE ON FOREIGN DATA WRAPPER postgres_fdw to totem;
設定 Foreign Server
- 在 totem DB 建立遠端 DB 代理 server (此處命名為 foreign_insect_server)
- 可依需要設為 read only / use_remote_estimate(統計)
--by role totem on database totem
CREATE SERVER foreign_insect_server
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (host '192.168.XX.XXX', port '5432', dbname 'insect');
--on database totem set read only
ALTER SERVER foreign_insect_server OPTIONS (ADD updatable 'false');
--在 local 端紀錄 remote table 的統計值, 大型 query 會需要
ALTER SERVER foreign_insect_server OPTIONS (ADD use_remote_estimate 'true');
設定 User Mapping
- 當前 Role 與遠端 DB role 建立關聯。
- => local role totem 與 remote role insect 建關聯
--user mapping
CREATE USER MAPPING FOR totem
SERVER foreign_insect_server
OPTIONS (user 'insect', password 'pwOfInsect');
Local 設定 Foreign Table
- 在本地端(totem DB)建立與遠端(insect DB) table / view 相襯的資料表
- 欄位的 data type 應配合遠端設定
- 可依需要為欄位單獨設為唯讀
- local table name insect_category_substitute:
- remote table name : insect_classicfication_category
--create insect_category_substitute
--constraints are not supported
CREATE FOREIGN TABLE insect_category_substitute (
"class_name" text,
"order_name" text,
"family_name" text,
"genus_name" text
)
SERVER foreign_insect_server
OPTIONS (schema_name 'public', table_name 'insect_classicfication_category',
updatable 'false', use_remote_estimate 'true');
--設定為 read only / use_remote_estimate
Grant Authority of Foreign Table to Role
- 將 select insect_category_substitute 的權限給予 totem
grant select on insect_category_substitute to totem;
查詢 foreign server / foreign table
- pgAdmin 下只會顯示 foreign server,table / view 細節要下 sql 得知
--foreign server / table
select * from pg_foreign_data_wrapper;
SELECT * FROM pg_foreign_server;
SELECT * FROM pg_foreign_table;
Local 查詢遠端資料使用範例
select * from species sp
left join insect_category_substitute cat
on sp.genus_name = cat.genus_name;
其他
持續整合測試時重建資料庫 vs FDW 權限設定問題
- 讓 totem 有 superuser 權限
alter role totem superuser;
* template1 安裝 postgres_fdw
psql -U postgres -d template1
CREATE EXTENSION postgres_fdw;
--讓 role totem 可以執行
GRANT USAGE ON FOREIGN DATA WRAPPER postgres_fdw to totem;
--CI 重建 database 時, 預設就是 template1, 不需指定
CREATE DATABASE totem WITH ENCODING='UTF8' OWNER=totem
--TEMPLATE=template0
TABLESPACE=totem;