PostgreSQL通過(guò)mysql_fdw實(shí)現(xiàn)?MySQL?透明查詢(xún)功能
在多數(shù)據(jù)源并存的企業(yè)環(huán)境中,常常需要在不同數(shù)據(jù)庫(kù)之間進(jìn)行聯(lián)合分析或數(shù)據(jù)遷移。PostgreSQL 作為功能強(qiáng)大的開(kāi)源關(guān)系型數(shù)據(jù)庫(kù),提供了 Foreign Data Wrapper(FDW,外部數(shù)據(jù)包裝器)機(jī)制,允許它像訪問(wèn)本地表一樣查詢(xún)遠(yuǎn)程數(shù)據(jù)庫(kù)。
本文將手把手帶你配置 mysql_fdw,實(shí)現(xiàn) PostgreSQL 對(duì) MySQL 表的透明讀寫(xiě)訪問(wèn),真正做到“一處查詢(xún),跨庫(kù)聯(lián)動(dòng)”。
一、什么是 mysql_fdw?
mysql_fdw 是一個(gè) PostgreSQL 的 FDW 擴(kuò)展,由 EnterpriseDB 開(kāi)發(fā)并開(kāi)源。它通過(guò) MySQL 客戶(hù)端庫(kù)(libmysqlclient)連接遠(yuǎn)程 MySQL 實(shí)例,并將遠(yuǎn)程表映射為 PostgreSQL 中的“外部表”(Foreign Table)。你可以在 PostgreSQL 中直接對(duì)這些外部表執(zhí)行 SELECT、INSERT、UPDATE、DELETE 等操作(取決于權(quán)限和配置)。
? 適用場(chǎng)景:
- 實(shí)時(shí)報(bào)表聚合(PG + MySQL 聯(lián)合查詢(xún))
- 數(shù)據(jù)遷移過(guò)渡期
- 微服務(wù)間臨時(shí)數(shù)據(jù)打通
- 避免 ETL 中間層,簡(jiǎn)化架構(gòu)
二、環(huán)境準(zhǔn)備
前提條件
- PostgreSQL 10+(推薦 12+)
- MySQL 5.7 或 8.0
- 操作系統(tǒng):Linux(本文以 Ubuntu 22.04 為例)
- 具備 sudo 權(quán)限
安裝依賴(lài)
# 安裝編譯工具和 PostgreSQL 開(kāi)發(fā)包 sudo apt update sudo apt install build-essential postgresql-server-dev-all libmysqlclient-dev git # 克隆 mysql_fdw 源碼(官方 GitHub) git clone https://github.com/EnterpriseDB/mysql_fdw.git cd mysql_fdw
?? 注意:確保 libmysqlclient-dev 版本與目標(biāo) MySQL 兼容。若使用 MySQL 8.0,可能需額外處理認(rèn)證插件(如 caching_sha2_password)。
三、編譯并安裝 mysql_fdw
# 編譯(自動(dòng)檢測(cè) pg_config) make # 安裝到 PostgreSQL 擴(kuò)展目錄 sudo make install
驗(yàn)證是否安裝成功:
# 查看 PostgreSQL 的 extension 目錄 pg_config --sharedir # 應(yīng)能在 $SHAREDIR/extension/ 下看到 mysql_fdw.control 和 .so 文件
四、在 PostgreSQL 中啟用 mysql_fdw
以 postgres 用戶(hù)登錄 psql:
-- 創(chuàng)建擴(kuò)展(每個(gè)需使用的數(shù)據(jù)庫(kù)都要執(zhí)行) CREATE EXTENSION mysql_fdw;
五、配置外部服務(wù)器與用戶(hù)映射
1. 創(chuàng)建外部服務(wù)器(Foreign Server)
CREATE SERVER mysql_server
FOREIGN DATA WRAPPER mysql_fdw
OPTIONS (
host '192.168.1.100', -- MySQL 主機(jī) IP
port '3306' -- MySQL 端口
);
2. 創(chuàng)建用戶(hù)映射(User Mapping)
將 PostgreSQL 用戶(hù)映射到 MySQL 的認(rèn)證憑據(jù):
CREATE USER MAPPING FOR postgres -- PostgreSQL 本地用戶(hù)
SERVER mysql_server
OPTIONS (
username 'remote_user',
password 'secure_password'
);
?? 安全建議:避免在 SQL 中明文寫(xiě)密碼,可結(jié)合
.pgpass或 Vault 等密鑰管理工具。
六、創(chuàng)建外部表(Foreign Table)
假設(shè) MySQL 中有數(shù)據(jù)庫(kù) sales_db,表 orders 結(jié)構(gòu)如下:
-- MySQL 表結(jié)構(gòu)示例
CREATE TABLE orders (
id INT PRIMARY KEY,
customer_name VARCHAR(100),
amount DECIMAL(10,2),
created_at DATETIME
);
在 PostgreSQL 中創(chuàng)建對(duì)應(yīng)的外部表:
CREATE FOREIGN TABLE foreign_orders (
id INTEGER,
customer_name TEXT,
amount NUMERIC(10,2),
created_at TIMESTAMP
)
SERVER mysql_server
OPTIONS (
dbname 'sales_db',
table_name 'orders'
);
?? 注意:
- 字段名必須一致(大小寫(xiě)敏感)
- 類(lèi)型需兼容(MySQL 的 VARCHAR → PG 的 TEXT,DATETIME → TIMESTAMP)
- 不支持所有 MySQL 特有類(lèi)型(如 JSON 需測(cè)試)
七、實(shí)戰(zhàn)查詢(xún)與寫(xiě)入
查詢(xún)數(shù)據(jù)
SELECT * FROM foreign_orders WHERE amount > 1000;
聯(lián)合本地表查詢(xún)
SELECT u.name, o.amount FROM local_users u JOIN foreign_orders o ON u.mysql_order_id = o.id;
寫(xiě)入操作(需 MySQL 用戶(hù)有寫(xiě)權(quán)限)
INSERT INTO foreign_orders (id, customer_name, amount, created_at) VALUES (1001, 'Alice', 1500.00, NOW()); UPDATE foreign_orders SET amount = 1600 WHERE id = 1001; DELETE FROM foreign_orders WHERE id = 1001;
?? 警告:寫(xiě)操作會(huì)直接修改 MySQL 數(shù)據(jù),請(qǐng)謹(jǐn)慎使用!
八、常見(jiàn)問(wèn)題與排查
1. 連接失敗:could not connect to MySQL
- 檢查 MySQL 是否允許遠(yuǎn)程連接(
bind-address) - 確認(rèn)防火墻開(kāi)放 3306 端口
- 驗(yàn)證 MySQL 用戶(hù)權(quán)限:
GRANT SELECT, INSERT... ON sales_db.* TO 'remote_user'@'%'
2. 認(rèn)證失?。∕ySQL 8.0)
MySQL 8 默認(rèn)使用 caching_sha2_password,而舊版 libmysqlclient 可能不支持。
解決方案:
- 升級(jí)
libmysqlclient-dev到 8.0+ - 或在 MySQL 中創(chuàng)建兼容用戶(hù):
CREATE USER 'remote_user'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
3. 性能問(wèn)題
- 外部表查詢(xún)無(wú)法使用 PostgreSQL 的索引優(yōu)化
- 復(fù)雜 JOIN 可能導(dǎo)致大量數(shù)據(jù)拉取
- 建議:對(duì)高頻查詢(xún)結(jié)果物化(Materialized View)或定期同步
九、替代方案對(duì)比
| 方案 | 優(yōu)點(diǎn) | 缺點(diǎn) |
|---|---|---|
| mysql_fdw | 實(shí)時(shí)、SQL 透明、支持讀寫(xiě) | 依賴(lài) libmysqlclient,部署復(fù)雜 |
| 邏輯復(fù)制 + ETL | 穩(wěn)定、可控 | 延遲高,需維護(hù)管道 |
| dblink(不支持 MySQL) | — | PostgreSQL 原生 dblink 僅支持 PG |
十、總結(jié)
通過(guò) mysql_fdw,PostgreSQL 成功打破了與 MySQL 的數(shù)據(jù)孤島。雖然它不適合高并發(fā)寫(xiě)入或超大規(guī)模分析場(chǎng)景,但在開(kāi)發(fā)調(diào)試、輕量級(jí)集成、臨時(shí)數(shù)據(jù)橋接等場(chǎng)景中極具價(jià)值。
到此這篇關(guān)于打通異構(gòu)數(shù)據(jù)庫(kù):PostgreSQL 通過(guò) mysql_fdw 實(shí)現(xiàn) MySQL 透明查詢(xún)實(shí)戰(zhàn)的文章就介紹到這了,更多相關(guān)postgresql mysql表透明查詢(xún)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PostgreSQL對(duì)GROUP BY子句使用常量的特殊限制詳解
這篇文章主要介紹了PostgreSQL對(duì)GROUP BY子句使用常量的特殊限制詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02
使用PostgreSQL創(chuàng)建高級(jí)搜索引擎的代碼示例
本文我們將探索PostgreSQL中的全文搜索功能,并研究我們能夠復(fù)制多少典型搜索引擎功能,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下2023-07-07
PostgreSQL自定義函數(shù)并且調(diào)用方式
這篇文章主要介紹了PostgreSQL如何自定義函數(shù)并且調(diào)用,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06
使用python-slim鏡像遇到無(wú)法使用PostgreSQL的問(wèn)題及解決方法
這篇文章主要介紹了使用python-slim鏡像遇到無(wú)法使用PostgreSQL的問(wèn)題及解決方法,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-08-08
PostgreSQL三種自增列sequence,serial,identity的用法區(qū)別
這篇文章主要介紹了PostgreSQL三種自增列sequence,serial,identity的用法區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02
PostgreSQL 實(shí)現(xiàn)查詢(xún)表字段信息SQL腳本
這篇文章主要介紹了PostgreSQL 實(shí)現(xiàn)查詢(xún)表字段信息SQL腳本,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01
postgresql中wal_level的三個(gè)參數(shù)用法說(shuō)明
這篇文章主要介紹了postgresql中wal_level的三個(gè)參數(shù)用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
PostgreSQL時(shí)間線(xiàn)(timeline)和History File的用法
這篇文章主要介紹了PostgreSQL時(shí)間線(xiàn)(timeline)和History File的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12

