PostgreSQL 通过 mysql_fdw连通MySQL实战

📢📢📢📣📣📣

作者:IT邦德

中国DBA联盟(ACDU)成员,15年DBA工作经验

Oracle、PostgreSQL ACE

CSDN博客专家及B站知名UP主,全网粉丝15万+

擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复,

安装迁移,性能优化、故障应急处理

文章目录

  • [1. 安装插件](#1. 安装插件)
  • [2. 启用插件服务](#2. 启用插件服务)
  • [3. 建立用户映射](#3. 建立用户映射)
  • [4. 处理数据](#4. 处理数据)
  • 5.运维管理
  • 总结

mysql_fdw 就像是 PostgreSQL 和 MySQL 数据库之间的一座双向桥梁。它允许你在 PostgreSQL 中创建一个"外部表",这个表直接映射到远程 MySQL 数据库中的真实表。之后,你就可以像操作本地 PostgreSQL 表一样,对这个外部表进行查询(SELECT)、插入(INSERT)、更新(UPDATE)和删除(DELETE)​ 操作,而 mysql_fdw 会在背后自动完成所有与 MySQL 数据库的通信和数据转换工作。

1. 安装插件

你需要在 PostgreSQL 所在的服务器上安装 mysql_fdw,它依赖 MySQL 的客户端开发库。从GitHub或PGXN网站下载mysql_fdw源码包。

mysql_fdw GitHub下载地址:

https://github.com/EnterpriseDB/mysql_fdw

复制代码
1)使用yum安装依赖和开发包
yum install postgresql-server-devel mysql-devel
2) 解压编译安装
unzip /opt/mysql_fdw-REL-2_9_3.zip -d /home/postgres
cd myql_fdw-REL-2_9_3
make USE_PGXS=1
make USE_PGXS=1 install

安装成功后,你需要重启 PostgreSQL服务,
或者至少让正在使用的数据库重新加载共享库。

2. 启用插件服务

以下是一个简单的使用示例,所有命令在 PoatgreSQL 中执行:

复制代码
1)加载扩展插件
CREATE EXTENSION mysql_fdw;
2)创建服务器对象
CREATE SERVER mysql_server 
FOREIGN DATA WRAPPER mysql_fdw 
OPTIONS (host '192.168.3.11', port '3306');
3) 授权
GRANT USAGE ON FOREIGN 
SERVER mysql_server TO postgres;

3. 建立用户映射

复制代码
CREATE USER MAPPING FOR postgres
SERVER mysql_server
OPTIONS (username 'root', password 'root@A123');

4. 处理数据

桥梁已经接通,最后一步就是在 PostgreSQL 这端创建一个"入口",也就是外部表(Foreign Table)。这张表的列名和数据类型应该与 MySQL 中的源表相对应。

复制代码
CREATE FOREIGN TABLE warehouse (
warehouse_id int,
warehouse_name text,
warehouse_created timestamp
)SERVER mysql_server
OPTIONS (dbname 'aidb', table_name 'warehouse');

这里要注意,mysql_fdw 的一个核心限制是为了确保能准确追踪和操作远程表中的特定行,它要求外部表定义中的第一列,必须对应远程MySQL表中的一个唯一列(如主键或具有唯一约束的列)。

接下里我们就可以在PostgreSQL 中 处理相关的数据了

复制代码
1)插入数据 
INSERT INTO warehouse values (1, 'UPS', current_date);
INSERT INTO warehouse values (2, 'TV', current_date);
INSERT INTO warehouse values (3, 'Table', current_date);
2)删除更新数据
DELETE FROM warehouse where warehouse_id = 3;
UPDATE warehouse set warehouse_name = 'UPS_NEW' where warehouse_id = 1;
3)查看 执行计划
EXPLAIN VERBOSE 
SELECT warehouse_id, warehouse_name 
FROM warehouse 
WHERE warehouse_name LIKE 'TV' limit 1;

如果需要映射一个模式(Schema)下的多张表,使用 IMPORT FOREIGN SCHEMA命令会非常高效,它可以自动为你创建所有表的外部表定义 。

复制代码
IMPORT FOREIGN SCHEMA someschema
FROM SERVER mysql_server
INTO public;

5.运维管理

当通过 mysql_fdw 连接 MySQL 进行运维时,可以查询以下 PostgreSQL 系统表和目录视图来查看和管理外部对象

复制代码
查看所有外部表的定义
SELECT * FROM pg_foreign_table;
以标准 SQL 视角查看外部表
SELECT * FROM 
information_schema.foreign_tables;
查看 mysql_fdw 服务器的连接配置
SELECT * FROM pg_foreign_server;
查看连接到 MySQL 所用的用户名映射
SELECT * FROM pg_user_mappings;

总结

mysql_fdw 是一个极其便捷的"数据桥梁"工具。 它让跨数据库的数据访问变得像访问本地表一样自然,特别适合混合架构下的数据查询、迁移过渡期以及临时的数据整合需求。

相关推荐
YOU OU9 小时前
Redis基础常识与命令
数据库·redis·缓存
Database_Cool_12 小时前
OLTP 和 OLAP 区别详解:分析型数据库和事务型数据库怎么选(附阿里云 AnalyticDB MySQL 选型指南)
数据库·mysql·阿里云
爱写代码的阿森12 小时前
鸿蒙三方库 | harmony-utils之KvUtil键值型数据库操作详解
数据库·华为·harmonyos·鸿蒙·huawei
Database_Cool_12 小时前
单机 MySQL 迁移到分布式数据库方便吗?阿里云 PolarDB-X 100% MySQL 协议兼容零改造平滑迁移
数据库·分布式·mysql
姜太小白13 小时前
【MySQL】 索引优化实战:解决 WHERE 等值 + IS NULL 查询,TEXT 字段报错 1167 的完整指南
数据库·mysql
窝子面14 小时前
手搓最简前后端协作-node
javascript·数据库
吳所畏惧14 小时前
宝塔面板Redis密码修改指南:SSH命令修改 vs 面板UI界面修改,哪个更靠谱?
运维·服务器·数据库·redis·缓存·ssh
DFT计算杂谈14 小时前
无 Root 权限在 Tesla K80 零门槛部署 DeepSeek 大模型
linux·服务器·网络·数据库·机器学习
HPFBoy14 小时前
log4net 数据库存日志正确配置
数据库