PostgreSQL外部数据插件:mysql_fdw

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 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%]

安装完成之后创建拓展:

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)

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

创建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)

创建用户映射

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

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

如果想修改

alter user MAPPING FOR public server mysql_server options ( set password 'xxxxxx');

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

alter user root@localhost identified with mysql_native_password by 'password';

创建外部表

理论上外部表的字段只要包含于远程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)

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

创建完成后,时就可以在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)

此时mysql端发生的变化

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

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)

反写数据

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

ERROR: first column of remote table must be unique for INSERT/UPDATE/DELETE operation

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

ALTER TABLE test01 ADD CONSTRAINT idx_id UNIQUE (id);(示例)

我这边是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)

事实上现在不仅仅是支持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)

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

REFRESH MATERIALIZED VIEW test_view;

新特性

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

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
12天前
|
SQL DataWorks 关系型数据库
DataWorks操作报错合集之如何处理数据同步时(mysql->hive)报:Render instance failed
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
8天前
|
关系型数据库 MySQL 数据库
RDS MySQL灾备服务协同解决方案构建问题之数据库备份数据的云上云下迁移如何解决
RDS MySQL灾备服务协同解决方案构建问题之数据库备份数据的云上云下迁移如何解决
|
2天前
|
SQL 存储 缓存
MySQL是如何保证数据不丢失的?
文章详细阐述了InnoDB存储引擎中Buffer Pool与DML操作的关系。在执行插入、更新或删除操作时,InnoDB为了减少磁盘I/O,会在Buffer Pool中缓存数据页进行操作,随后将更新后的“脏页”刷新至磁盘。为防止服务宕机导致数据丢失,InnoDB采用了日志先行(WAL)机制,通过将DML操作记录为Redo Log并异步刷新到磁盘,结合双写机制和合理的日志刷新策略,确保数据的持久性和一致性。尽管如此,仍需合理配置参数以平衡性能与数据安全性。
MySQL是如何保证数据不丢失的?
|
9天前
|
关系型数据库 MySQL Linux
在Linux中,如何配置数据库服务器(如MySQL或PostgreSQL)?
在Linux中,如何配置数据库服务器(如MySQL或PostgreSQL)?
|
12天前
|
分布式计算 DataWorks 关系型数据库
DataWorks产品使用合集之ODPS数据怎么Merge到MySQL数据库
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
12天前
|
DataWorks 关系型数据库 MySQL
DataWorks产品使用合集之mysql节点如何插入数据
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
14天前
|
关系型数据库 MySQL 数据库
MySQL 复制A的表结构和数据到表B
在MySQL中复制表A至表B可通过不同方法实现。一种是先用`CREATE TABLE B LIKE A;`复制结构,再用`INSERT INTO B SELECT * FROM A;`填充数据。另一种更简便的方法是直接使用`CREATE TABLE B AS SELECT * FROM A;`一次性完成结构和数据的复制。还有一种高级方法是通过`SHOW CREATE TABLE A;`获取表A的创建语句,手动调整后创建表B,如有需要再用`INSERT INTO ... SELECT`复制数据。注意权限问题、跨数据库复制时需指定数据库名,以及大表复制时可能影响性能。
|
2天前
|
SQL 关系型数据库 HIVE
实时计算 Flink版产品使用问题之如何将PostgreSQL数据实时入库Hive并实现断点续传
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
8天前
|
SQL 关系型数据库 MySQL
mysql误删数据后,你会怎么办?
mysql误删数据后,你会怎么办?
25 0
|
10天前
|
Kubernetes 关系型数据库 MySQL
k8s练习--通过NFS+PV+PVC+POD,部署一个MySQL服务,并将MySQL的数据进行持久化存储
本文档介绍了如何使用Kubernetes (K8s)、NFS、PersistentVolume (PV)、PersistentVolumeClaim (PVC)和Pod来部署并实现MySQL服务的数据持久化存储。Kubernetes是一个用于自动化部署、扩展和管理容器化应用的强大平台。NFS作为一种网络文件系统协议,能够使Kubernetes集群中的Pod跨节点访问共享文件。PV和PVC机制则提供了持久化的存储解决方案,确保数据即使在Pod生命周期结束后仍得以保留。
下一篇
云函数