PostgreSQL使用MySQL作为外部表(mysql_fdw)

目录
  • 下载安装
  • 使用示例
  • 配置参数

PostgreSQL 提供了一种访问和操作外部数据源的机制,称为外部数据包装器(Foreign Data Wrapper)。利用这种外部数据管理机制,我们可以在 PostgreSQL 中访问各种同构数据库(PostgreSQL)、异构数据库(MySQL、Oracle、SQL Server、SQLite、HBase、Cassandra、ClickHouse、CouchDB、MongoDB、Neo4j、Redis、Hadoop、HIve等)以及文本文件(CSV、JSON、XML等)。

本文我们要介绍的就是连接 MySQL 数据库的外部数据包装器:mysql_fdw。mysql_fdw 提供了读写 MySQL 外部表、连接池、WHERE 条件下推、返回字段下推、预编译语句、JOIN 下推、聚合函数(min、max、sum、avg、count)下推、ORDER BY 下推以及 LIMIT OFFSET 下推等功能。

下载安装

点击 GitHub 下载 mysql_fdw 源代码。

编译 mysql_fdw 之前,需要安装 MySQL C 语言客户端库。这个程序库可以从 MySQL 官方网站下载。

对于 POSIX 兼容系统,运行 make 进行编译时需要确保 pg_config 程序位于 path 环境变量中。该程序通常位于 PostgreSQL 安装目录下的 bin 目录中,例如:

$ export PATH=/usr/local/pgsql/bin/:$PATH

另外,mysql_config 程序页需要位于 path 环境变量中:

$ export PATH=/usr/local/mysql/bin/:$PATH

然后,使用 make 命令编译程序:

$ make USE_PGXS=1

最后,安装 mysql_fdw:

$ make USE_PGXS=1 install

运行回归测试:

$ make USE_PGXS=1 installcheck

注意确保 MYSQL_HOST、MYSQL_PORT、MYSQL_USER_NAME 以及 MYSQL_PWD 环境变量的设置。默认设置可以参考 mysql_init.sh 脚本。

使用示例

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

-- 加载扩展插件
CREATE EXTENSION mysql_fdw;

-- 创建服务器对象
CREATE SERVER mysql_server
	FOREIGN DATA WRAPPER mysql_fdw
	OPTIONS (host '127.0.0.1', port '3306');

-- 创建用户映射
CREATE USER MAPPING FOR postgres
	SERVER mysql_server
	OPTIONS (username 'foo', password 'bar');

-- 创建外部表
CREATE FOREIGN TABLE warehouse
	(
		warehouse_id int,
		warehouse_name text,
		warehouse_created timestamp
	)
	SERVER mysql_server
	OPTIONS (dbname 'db', table_name 'warehouse');

-- 插入数据
INSERT INTO warehouse values (1, 'UPS', current_date);
INSERT INTO warehouse values (2, 'TV', current_date);
INSERT INTO warehouse values (3, 'Table', current_date);

-- 查询数据
SELECT * FROM warehouse ORDER BY 1;

warehouse_id | warehouse_name | warehouse_created
-------------+----------------+-------------------
           1 | UPS            | 10-JUL-20 00:00:00
           2 | TV             | 10-JUL-20 00:00:00
           3 | Table          | 10-JUL-20 00:00:00

-- 删除数据
DELETE FROM warehouse where warehouse_id = 3;

-- 更新数据
UPDATE warehouse set warehouse_name = 'UPS_NEW' where warehouse_id = 1;

-- 查看执行计划
EXPLAIN VERBOSE SELECT warehouse_id, warehouse_name FROM warehouse WHERE warehouse_name LIKE 'TV' limit 1;

                                   QUERY PLAN
--------------------------------------------------------------------------------------------------------------------
Limit  (cost=10.00..11.00 rows=1 width=36)
	Output: warehouse_id, warehouse_name
	->  Foreign Scan on public.warehouse  (cost=10.00..1010.00 rows=1000 width=36)
		Output: warehouse_id, warehouse_name
		Local server startup cost: 10
		Remote query: SELECT `warehouse_id`, `warehouse_name` FROM `db`.`warehouse` WHERE ((`warehouse_name` LIKE BINARY 'TV'))

配置参数

以下参数用于 MySQL 外部服务器对象:

  • host:MySQL 服务器的地址或者主机名,默认为 127.0.0.1;
  • port:MySQL 服务器的端口,默认为 3306;
  • secure_auth:启用或者禁用安全认证,默认为 true;
  • init_command:连接 MySQL 服务器之后执行的初始 SQL 语句;
  • use_remote_estimate:是否执行远程 EXPLAIN 命令获取成本评估,默认为 false;
  • reconnect:启用或者禁用自动重新连接功能,默认为 false;
  • sql_mode:设置 MySQL sql_mode 变量,默认为 ANSI_QUOTES;
  • ssl_key:客户端私钥文件名;
  • ssl_cert:客户端公钥认证文件名;
  • ssl_ca:证书授权(CA)认证文件名。如果使用该选项,必须和 MySQL 服务器的证书一致;
  • ssl_capath:包含可信 SSL CA 认证文件的目录;
  • ssl_cipher:SSL 加密允许的密码列表;
  • fetch_size:指定每次读取的数据行数。该参数可以基于外部表或者外部服务器进行指定,基于外部表指定的参数优先级更高。默认为 100;
  • character_set:MySQL 连接使用的字符集。默认为 auto,表示基于操作系统设置进行自动配置。在引入该选项之前,字符集设置为 PostgreSQL 数据库字符集. To get this 。如果想要兼容历史配置,可以将 character_set 设置为特殊值 PGDatabaseEncoding。

以下参数用于 MySQL 外部表对象:

  • dbname:MySQL 数据库名,这是一个必填项;
  • table_name:MySQL 表名,默认与 PostgreSQL 外部表同名;
  • max_blob_size:不会被截断读取的最大 blob 大小;
  • fetch_size:与外部服务器对象的 fetch_size 参数相同。

以下参数用于创建用户映射:

  • username:连接 MySQL 服务器的用户名;
  • password:连接 MySQL 服务器的密码。

以下参数用于 IMPORT FOREIGN SCHEMA 命令:

  • import_default:导入外部表定义时是否包含字段的 DEFAULT 属性,默认为 false;
  • import_not_null:导入外部表定义时是否包含字段的 NOT NULL 约束,默认为 true;
  • import_enum_as_text:导入外部表定义时将 MySQL ENUM 类型映射为 PostgreSQL TEXT 类型,或者创建一个新的枚举类型并提示警告,默认为 false;
  • import_generated:导入外部表定义时是否包含字段的 GENERATED 表达式,默认为 true。如果生成列表达式中使用了 PostgreSQL 中不存在的函数或者操作符,IMPORT 将会失败。

到此这篇关于PostgreSQL使用MySQL作为外部表(mysql_fdw)的文章就介绍到这了,更多相关PostgreSQL使用MySQL外表内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • docker环境下数据库的备份(postgresql, mysql) 实例代码

    posgresql 备份/恢复 1.备份 DATE=`date +%Y%m%d-%H%M` BACK_DATA=xxapp-data-${DATE}.out # 这里设置备份文件的名字, 加入日期是为了防止重复 docker exec pg-db pg_dumpall -U postgres > ${BACK_DATA} # pg-db 是数据库的 docker 名称 2.恢复 docker cp ${BACK_DATA} pg-db:/tmp docker exec pg-db psql -U

  • PostgreSQL使用MySQL外表的步骤详解(mysql_fdw)

    浅谈 postgres不知不觉已经升到了版本13,记得两年前还是版本10,当然这中间一直期望着哪天能在项目中使用postgresql,现在已实现哈-: 顺带说一下:使用postgresql的原因是它的生态完整,还有一个很重要的点儿是速度快这个在第10版的时 这么说也许还为时过早, 但是在13这一版本下一点儿也不为过,真的太快了,我简单的用500w的数据做聚合,在不建立索引(主键除外)的情况下 执行一个聚合操作,postgres 的速度是mysql的8倍,真的太快了-:好了,这一章节我就聊一聊我实

  • 基于PostgreSQL和mysql数据类型对比兼容

    1.数值类型 整数: mysql中的整数类型和pg相比,两者有以下区别: mysql:mysql中支持int 1,2,3,4,8 字节,同时支持有符号,无符号.并且mysql中支持在数值列中指定zerofill,用来将存储的数值通过填充0的方式达到指定数据类型的长度(mysql8开始不建议使用ZEROFILL属性,并且在将来的MySQL版本中将不再支持该属性). pg:pg支持 int 2,4,8 字节,且数值都是有符号的. mysql整数类型: pg整数类型: 那么对于mysql中的1,3字节

  • 将MySQL数据库移植为PostgreSQL

    在北美,人们对于 PostgreSQL 的热情不断升温.随着 PostgreSQL 的发展, PostgreSQL 8.x 已经从技术上超越 MySQL 5.x ,而市场的超越相信只是时间问题.而最终,用户也许有机会享受到可媲美 Oracle 的开源数据库也未尝没有可能. 我供职的互联网公司,服务约 50 万商务用户,经过多次的升级移植,目前公司已经全部将后台数据库从 MySQL 移植到 PostgreSQL ,而个人完成了其中一半的数据库移植工作,所以对数据库从 MySQL 移植到 Postg

  • Spring Boot整合MybatisPlus逆向工程(MySQL/PostgreSQL)

    目录 一.创建表 二.创建Spring Boot工程 三.引入逆向工程依赖 四.代码中完成逆向工程配置 五.测试 MyBatis-Plus是MyBatis的增强工具,Generator通过MyBatis-Plus快速生成Entity.Mapper.Mapper XML.Service.Controller等模块的代码,方便快捷. 一.创建表 我们先创建数据库表:sys_log.sys_user CREATE TABLE `sys_log` ( `id` bigint(20) NOT NULL A

  • PostgreSQL使用MySQL作为外部表(mysql_fdw)

    目录 下载安装 使用示例 配置参数 PostgreSQL 提供了一种访问和操作外部数据源的机制,称为外部数据包装器(Foreign Data Wrapper).利用这种外部数据管理机制,我们可以在 PostgreSQL 中访问各种同构数据库(PostgreSQL).异构数据库(MySQL.Oracle.SQL Server.SQLite.HBase.Cassandra.ClickHouse.CouchDB.MongoDB.Neo4j.Redis.Hadoop.HIve等)以及文本文件(CSV.J

  • 浅谈MySQL user权限表

    MySQL 在安装时会自动创建一个名为 mysql 的数据库,mysql 数据库中存储的都是用户权限表.用户登录以后,MySQL 会根据这些权限表的内容为每个用户赋予相应的权限. user 表是 MySQL 中最重要的一个权限表,用来记录允许连接到服务器的账号信息.需要注意的是,在 user 表里启用的所有权限都是全局级的,适用于所有数据库. user 表中的字段大致可以分为 4 类,分别是用户列.权限列.安全列和资源控制列,下面主要介绍这些字段的含义. 用户列 用户列存储了用户连接 MySQL

  • MySQL执行外部sql脚本文件的命令

    目录 1.创建包含sql命令的sql脚本文件 2.执行sql脚本文件(介绍三种方式) sql脚本是包含一到多个sql命令的sql语句,我们可以将这些sql脚本放在一个文本文件中(我们称之为"sql脚本文件"),然后通过相关的命令执行这个sql脚本文件. 1.创建包含sql命令的sql脚本文件 在D盘根目录下新建一个文本文档,并改名为day01.sql(名字自己取,最好不要有中文,特殊符号,以.sql结尾)   day01.sql文件中包含一些列的sql语句,每条语句最后以;结尾,文件内

  • 如何设置mysql允许外部连接访问

    1.设置mysql允许外部连接访问(授权): grant all privileges on *.* to root@'%' identified by '123456' with grant option; flush privileges; 例子:查询mysql用户权限.授权.刷新使生效 select host, user from user; grant all privileges on *.* to root@'%' identified by '密码' with grant opti

  • 浅谈mysql 针对单张表的备份与还原

    A.MySQL 备份工具xtrabackup 的安装 1. percona 官方xtrabackup 的二进制版本:二进制版本解压就能用了. 2. 解压xtrabackup & 创建连接 tar -xzvf percona-xtrabackup-2.3.4-Linux-x86_64.tar.gz -C /usr/local/ ln -s /usr/local/percona-xtrabackup-2.3.4 /usr/local/xtrabackup 3. 设置PATH环境变量 export P

  • 浅谈mysql中多表不关联查询的实现方法

    大家在使用MySQL查询时正常是直接一个表的查询,要不然也就是多表的关联查询,使用到了左联结(left join).右联结(right join).内联结(inner join).外联结(outer join).这种都是两个表之间有一定关联,也就是我们常常说的有一个外键对应关系,可以使用到 a.id = b.aId这种语句去写的关系了.这种是大家常常使用的,可是有时候我们会需要去同时查询两个或者是多个表的时候,这些表又是没有互相关联的,比如要查user表和user_history表中的某一些数据

  • 详解MySQL导出指定表中的数据的实例

    详解MySQL导出指定表中的数据 要求: 1. 不导出创表的语句,因为表已经建好:默认会导出,先drop table然后create table: 2. 导出的insert语句加上ignore,允许重复执行:默认不会加上ignore: 3. insert语句中列出表中的字段,看得更清楚:默认不会: 4. 分记录生成多条insert语句,修改起来比较容易:默认是一条: 最终结果如下: mysqldump -pxxxxxx qzt qf1_mail_account --no-create-info

  • MySQL中大数据表增加字段的实现思路

    前言 增加字段相信大家应该都不陌生,随手就可以写出来,给 MySQL 一张表加字段执行如下 sql 就可以了: ALTER TABLE tbl_tpl ADD title(255) DEFAULT '' COMMENT '标题' AFTER id; 但是线上的一张表如果数据量很大呢,执行加字段操作就会锁表,这个过程可能需要很长时间甚至导致服务崩溃,那么这样操作就很有风险了. 那么,给 MySQL 大表加字段的思路如下: ① 创建一个临时的新表,首先复制旧表的结构(包含索引) create tab

随机推荐