jdbc_fdw 是 PostgreSQL 的外部數據包裝器,基於 JDBC 驅動實現異構數據庫(DB2、Oracle、MySQL、SQL Server 等)的只讀/讀寫查詢。本文記錄編譯安裝、DB2/Oracle 連接配置、外部表創建全過程。
/usr/local/pg9.5.5)/usr/local/jdk1.6.0_45)db2jcc4.jarojdbc6.jar# 定位 libjvm.so locate libjvm.so # 選擇 server 版本(性能優於 client) ln -s /usr/local/jdk1.6.0_45/jre/lib/amd64/server/libjvm.so /usr/lib/libjvm.so ldconfig
git clone git://github.com/atris/JDBC_FDW.git cd JDBC_FDW # 使用 PostgreSQL 的 pgxs 編譯 sudo PATH=/usr/local/pg9.5.5/bin/:$PATH make USE_PGXS=1 # 安裝擴展文件 cp jdbc_fdw.control /usr/local/pg9.5.5/share/postgresql/extension/ cp jdbc_fdw--1.0.sql /usr/local/pg9.5.5/share/postgresql/extension/ cp jdbc_fdw.so /usr/local/pg9.5.5/lib/postgresql/
db2 describe table TABLEA # ID INTEGER, NAME CHAR(10), SALARY INTEGER
-- 1. 創建擴展
CREATE EXTENSION jdbc_fdw;
-- 2. 創建外部服務器(DB2)
CREATE SERVER jdbc_serv4 FOREIGN DATA WRAPPER jdbc_fdw
OPTIONS (
drivername 'com.ibm.db2.jcc.DB2Driver',
url 'jdbc:db2://108.88.3.106:60000/test',
querytimeout '15',
jarfile '/usr/local/pg9.5.5/lib/db2jcc4.jar',
maxheapsize '600'
);
-- 3. 用戶映射
CREATE USER MAPPING FOR postgres SERVER jdbc_serv4
OPTIONS (username 'db2inst4', password 'db2inst4');
-- 4. 創建外部表(列定義需與遠程表匹配)
CREATE FOREIGN TABLE ghan_table (
ID integer NOT NULL,
NAME varchar(30),
SALARY integer
) SERVER jdbc_serv4
OPTIONS (table 'TABLEA');
-- 5. 查詢驗證
SELECT * FROM ghan_table;
id | name | salary ----+------+-------- 1001 | SAM | 10000 ... (20 rows)
-- 1. 外部服務器(Oracle)
CREATE SERVER jdbc_serv5 FOREIGN DATA WRAPPER jdbc_fdw
OPTIONS (
drivername 'oracle.jdbc.driver.OracleDriver',
url 'jdbc:oracle:thin:@108.88.3.247:1521:orcl',
querytimeout '15',
jarfile '/usr/local/pg9.5.5/lib/ojdbc6.jar',
maxheapsize '600'
);
-- 2. 用戶映射
CREATE USER MAPPING FOR postgres SERVER jdbc_serv5
OPTIONS (username 'zabbix', password 'zabbix');
-- 3. 外部表
CREATE FOREIGN TABLE ghan_ora (
ID integer NOT NULL,
NAME varchar(30)
) SERVER jdbc_serv5
OPTIONS (table 'test');
-- 4. 查詢
SELECT * FROM ghan_ora;
| 參數 | 含義 |
|---|---|
| drivername | JDBC 驅動類全限定名 |
| url | JDBC 連接串 |
| jarfile | 驅動 JAR 文件絕對路徑(需 PostgreSQL 進程可讀) |
| maxheapsize | JVM 最大堆內存(MB),防止大結果集 OOM |
| querytimeout | 查詢超時(秒) |
| table | 遠程表名(支持 schema.table) |
client_encoding、JDBC URL characterEncoding、遠程數據庫字符集一致(建議 UTF-8)。CHAR -> PG varchar;Oracle NUMBER -> PG numeric;需手動對應。jdbc_fdw 目前不支持下推 WHERE 子句(版本依賴),全表掃描後在 PG 端過濾。大表建議在遠程創建視圖/物化視圖預聚合。| 方案 | 優點 | 缺點 |
|---|---|---|
| jdbc_fdw | 通用、標準 SQL、支持多種異構源 | 性能一般、無下推、JVM 依賴 |
| dblink + 異構驅動 | 輕量、無 JVM | 僅支持 PostgreSQL 間 |
| ETL 工具 | 調度、轉換、監控完善 | 非實時、架構複雜 |
| CDC (Debezium) | 實時同步、解耦 | 運維成本高 |
對於「 PostgreSQL 為主、異蹤源為輔、查詢量中等、實時性要求不極高」的場景,jdbc_fdw 是性價比最高的選擇。