PostgreSQL外部数据插件:mysql_fdw

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 概述PostgreSQL具有插件功能,通过不同的插件拓展,实现数据库本身不包含的功能,以满足用户的需求。mysql_fdw 就是一个强大的外部表功能,所谓外部表,就是在PG数据库中通过SQL访问外部数据源数据,就像访问本地数据库一样,下面就来测试一下使用mysql_fdw 来访问mysql中的数...

概述

PostgreSQL具有插件功能,通过不同的插件拓展,实现数据库本身不包含的功能,以满足用户的需求。mysql_fdw 就是一个强大的外部表功能,所谓外部表,就是在PG数据库中通过SQL访问外部数据源数据,就像访问本地数据库一样,下面就来测试一下使用mysql_fdw 来访问mysql中的数据

安装使用步骤

下载安装插件

可以直接下载rpm包进行安装,编译需要各种依赖,比较麻烦,下面链接,选择mysql_fdw 的包下载
https://download.postgresql.org/pub/repos/yum/11/redhat/rhel-7-x86_64/

下载完成后安装:

[root@stephen ~]# rpm -ivh mysql_fdw_11-2.5.0-1.rhel7.x86_64.rpm 
Preparing... ################################# [100%]
Updating / installing...
   1:mysql_fdw_11-2.5.0-1.rhel7 ################################# [100%]
AI 代码解读

安装完成之后创建拓展:

postgres=# create extension mysql_fdw ;
CREATE EXTENSION
postgres=# \dx
                            List of installed extensions
   Name | Version | Schema | Description                    
-----------+---------+------------+--------------------------------------------------
 mysql_fdw | 1.1 | public | Foreign data wrapper for querying a MySQL server
 plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
(2 rows)
AI 代码解读

可以看到插件拓展就安装完成了

创建server

在PG端创建sever,外部服务定义了具体外部数据源的连接信息,如果外部源是数据库,通常会包含数据库的IP,端口号,数据库名称等信息,如下:

postgres=# CREATE SERVER mysql_server_test FOREIGN DATA WRAPPER mysql_fdw OPTIONS (HOST '172.16.21.167', PORT '3306');
CREATE SERVER

postgres=# \des
               List of foreign servers
       Name | Owner | Foreign-data wrapper 
-------------------+----------+----------------------
 mysql_server_test | postgres | mysql_fdw
(1 row)
AI 代码解读

创建用户映射

OPTIONS 是指外部拓展的选项,指定了访问外部数据标的本地用户和远程用户信息

postgres=# CREATE USER MAPPING FOR PUBLIC SERVER mysql_server_test OPTIONS (username 'root', password 'xxxxx');
CREATE USER MAPPING
AI 代码解读

如果想修改

alter user MAPPING FOR public server mysql_server options ( set password 'xxxxxx');
AI 代码解读

注:一些高版本的mysql需要修改密码策略
将mysql的密码策略改为mysql_native_password

alter user root@localhost identified with mysql_native_password by 'password';
AI 代码解读

创建外部表

理论上外部表的字段只要包含于远程mysql表字段内就可以,但是一般的,都建议将外部表与远程表的字段一致。但是mysql和pg字段类型有时会有些许区别,需要确认好字段类型,如下:

postgres=# create foreign table test01(id int,name text,age int,wherefrom text ) server mysql_server_test options(dbname 'test',table_name 'test01');
CREATE FOREIGN TABLE

postgres=# \d
             List of relations
 Schema | Name | Type | Owner   
--------+--------+---------------+----------
 public | test01 | foreign table | postgres
(1 row)
AI 代码解读

可以看到表的类型是外部表,和普通的表有区别

创建完成后,时就可以在PG端访问这个表

postgres=# select * from test01 ;
 id | name | age | wherefrom 
----+----------+-----+-----------
  1 | dwqdw | 34 | dadsa
  2 | dwdsaqdw | 24 | dsadadsa
  3 | dwdsaqdw | 20 | dsadadsa
  4 | dwdsdadw | 20 | dsadaadsa
(4 rows)
AI 代码解读

此时mysql端发生的变化

mysql> insert into test01 values(122,'测试',20,'再次测试');
Query OK, 1 row affected (0.01 sec)
AI 代码解读

PG 再次查询时这边马上就能看到

postgres=# select * from test01 ;
 id | name | age | wherefrom 
-----+----------+-----+-----------
   1 | dwqdw | 34 | dadsa
   2 | dwdsaqdw | 24 | dsadadsa
   3 | dwdsaqdw | 20 | dsadadsa
   4 | dwdsdadw | 20 | dsadaadsa
 122 | 测试 | 20 | 再次测试
(5 rows)
AI 代码解读

反写数据

一般情况下,如果没有唯一键限制,反写数据就会报错

ERROR: first column of remote table must be unique for INSERT/UPDATE/DELETE operation
AI 代码解读

如果想反写到mysql,需要在mysql上添加表的限制

ALTER TABLE test01 ADD CONSTRAINT idx_id UNIQUE (id);(示例)
AI 代码解读

我这边是ID已经是主键唯一键了,所以直接能使用

postgres=# insert into test01 values(123,'反写测试',221,'再次测试');
INSERT 0 1

mysql> select * from test01;
+-----+--------------+------+--------------+
| id | name | age | wherefrom |
+-----+--------------+------+--------------+
| 1 | dwqdw | 34 | dadsa |
| 2 | dwdsaqdw | 24 | dsadadsa |
| 3 | dwdsaqdw | 20 | dsadadsa |
| 4 | dwdsdadw | 20 | dsadaadsa |
| 122 | 测试 | 20 | 再次测试 |
| 123 | 反写测试 | 221 | 再次测试 |
+-----+--------------+------+--------------+
6 rows in set (0.00 sec)
AI 代码解读

事实上现在不仅仅是支持insert语句,update与delete语句均支持,前提是提供给PG的mysql用户是有这些权限的。

物化数据

mysql_fdw 实现的一个关键特性就是支持持久连接的能力。查询执行后,不会删除与远程MySQL的连接。相反,它保留来自同一会话的下次查询连接。然而,在某些情况下,因为网络查询等原因不能及时查询数据,则可以考虑在本地实现数据保留。可以通过外部表创建物化视图,如下

postgres=# CREATE MATERIALIZED VIEW test_view as select * from test01;
SELECT 6
postgres=# \d
                 List of relations
 Schema | Name | Type | Owner   
--------+-----------+-------------------+----------
 public | test01 | foreign table | postgres
 public | test_view | materialized view | postgres
(2 rows)

postgres=# select * from test_view;
 id | name | age | wherefrom 
-----+----------+-----+-----------
   1 | dwqdw | 34 | dadsa
   2 | dwdsaqdw | 24 | dsadadsa
   3 | dwdsaqdw | 20 | dsadadsa
   4 | dwdsdadw | 20 | dsadaadsa
 122 | 测试 | 20 | 再次测试
 123 | 反写测试 | 221 | 再次测试
(6 rows)
AI 代码解读

可以将刷新任务放到定时任务中,定时去刷新视图

REFRESH MATERIALIZED VIEW test_view;
AI 代码解读

新特性

如今mysql_fdw 已经支持
Where子句下推:
最新版本将外部表where子句下推到外部服务器。外部表上的where条件将在外部服务器上执行,因此将有更少的行传递给PostgreSQL。这是一个性能功能。
列下推:
以前的版本是从目标外表中获取所有列。最新版本执行列下推,仅返回属于选择目标列表的列。这是一个性能功能。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
2
2
2
23844
分享
相关文章
【YashanDB 知识库】从 PostgreSQL 迁移到 YashanDB 如何进行数据行数比对
【YashanDB 知识库】从 PostgreSQL 迁移到 YashanDB 如何进行数据行数比对
【YashanDB知识库】从PostgreSQL迁移到YashanDB如何进行数据行数比对
本文介绍了通过Oracle视图`vsqlvsql_plan`分析SQL性能的方法。首先,可通过`plan_hash_value`从`v$sql_plan`获取SQL执行计划,结合示例展示了具体查询方式。文章还创建了一个UDF函数`REPEAT`用于格式化输出,便于阅读复杂执行计划。最后,通过实例展示了如何根据`plan_hash_value`获取SQL文本及其内存中的执行计划,帮助优化性能问题。
【YashanDB知识库】字符集latin1的MySQL中文数据如何迁移到YashanDB
本文探讨了在使用YMP 23.2.1.3迁移MySQL Server字符集为latin1的中文数据至YashanDB时出现乱码的问题。问题根源在于MySQL latin1字符集存放的是实际utf8编码的数据,而YMP尚未支持此类场景。文章提供了两种解决方法:一是通过DBeaver直接迁移表数据;二是将MySQL表数据转换为Insert语句后手动插入YashanDB。同时指出,这两种方法适合单张表迁移,多表迁移可能存在兼容性问题,建议对问题表单独处理。
【YashanDB知识库】字符集latin1的MySQL中文数据如何迁移到YashanDB
Redis和Mysql如何保证数据⼀致?
1. 先更新Mysql,再更新Redis,如果更新Redis失败,可能仍然不⼀致 2. 先删除Redis缓存数据,再更新Mysql,再次查询的时候在将数据添加到缓存中 这种⽅案能解决1 ⽅案的问题,但是在⾼并发下性能较低,⽽且仍然会出现数据不⼀致的问题,⽐如线程1删除了 Redis缓存数据,正在更新Mysql,此时另外⼀个查询再查询,那么就会把Mysql中⽼数据⼜查到 Redis中 1. 使用MQ异步同步, 保证数据的最终一致性 我们项目中会根据业务情况 , 使用不同的方案来解决Redis和Mysql的一致性问题 : 1. 对于一些一致性要求不高的场景 , 不做处理例如 : 用户行为数据 ,
【YashanDB知识库】MySQL迁移至崖山char类型数据自动补空格问题
**简介**:在MySQL迁移到崖山环境时,若字段类型为char(2),而应用存储的数据仅为'0'或'1',查询时崖山会自动补空格。原因是mysql的sql_mode可能启用了PAD_CHAR_TO_FULL_LENGTH模式,导致保留CHAR类型尾随空格。解决方法是与应用确认数据需求,可将崖山环境中的char类型改为varchar类型以规避补空格问题,适用于所有版本。
基于SQL Server / MySQL进行百万条数据过滤优化方案
对百万级别数据进行高效过滤查询,需要综合使用索引、查询优化、表分区、统计信息和视图等技术手段。通过合理的数据库设计和查询优化,可以显著提升查询性能,确保系统的高效稳定运行。
58 9
MySQL和SQLSugar百万条数据查询分页优化
在面对百万条数据的查询时,优化MySQL和SQLSugar的分页性能是非常重要的。通过合理使用索引、调整查询语句、使用缓存以及采用高效的分页策略,可以显著提高查询效率。本文介绍的技巧和方法,可以为开发人员在数据处理和查询优化中提供有效的指导,提升系统的性能和用户体验。掌握这些技巧后,您可以在处理海量数据时更加游刃有余。
150 9
【YashanDB 知识库】MySQL 迁移至崖山 char 类型数据自动补空格问题
问题分类】功能使用 【关键字】char,char(1) 【问题描述】MySQL 迁移至崖山环境,字段类型源端和目标端都为 char(2),但应用存储的数据为'0'、'1',此时崖山查询该表字段时会自动补充空格 【问题原因分析】mysql 有 sql_mode 控制,检查是否启用了 PAD_CHAR_TO_FULL_LENGTH SQL 模式。如果启用了这个模式,MySQL 才会保留 CHAR 类型字段的尾随空格,默认没有启动。 #查看sql_mode mysql> SHOW VARIABLES LIKE 'sql_mode'; 【解决/规避方法】与应用确认存储的数据,正确定义数据
MySQL进阶突击系列(09)数据磁盘存储模型 | 一行数据怎么存?
文中详细介绍了MySQL数据库中一行数据在磁盘上的存储机制,包括表空间、段、区、页和行的具体结构,以及如何设计和优化行数据存储以提高性能。
MySQL底层概述—4.InnoDB数据文件
本文介绍了InnoDB表空间文件结构及其组成部分,包括表空间、段、区、页和行。表空间是最高逻辑层,包含多个段;段由若干个区组成,每个区包含64个连续的页,页用于存储多条行记录。文章还详细解析了Page结构,分为通用部分(文件头与文件尾)、数据记录部分和页目录部分。此外,文中探讨了行记录格式,包括四种行格式(Redundant、Compact、Dynamic和Compressed),重点介绍了Compact行记录格式及其溢出机制。最后,文章解释了不同行格式的特点及应用场景,帮助理解InnoDB存储引擎的工作原理。
MySQL底层概述—4.InnoDB数据文件

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等