通常如果我们在使用多种数据库的时候,最头痛的是数据库不唯一,SQL SERVER 访问 ORACLE ,ORACLE 访问 MYSQL ,MYSQL 访问 SQL SERVER,这的确不是一件美好的事情, 而强大的PG的 FDW 可以解决这样的问题。通过 FDW ,foreign-data wrapper 来解决各种数据库的数据融合的问题。基本上市面上有的数据库,POSTGRESQL 都可以进行FDW的连接,例如创建数据表,读取,插入,更改数据表等等都是可以的。
而MYSQL 多物理数据库之间表的查询其实是比较麻烦的,我们可以通过POSTGRESQL 来解决这个问题。
安装的步骤就省略了,网上大量的文章,并且安装也比较简单,并不需要很高深的技术。
我们直接就来到 POSTGRESQL 如何用FDW的方式来操纵 MYSQL 数据库,并且能将查询比较好的完成。
1 创建与MYSQL 之间的数据连接
CREATE SERVER employee FOREIGN DATA WRAPPER mysql_fdw OPTIONS (host '192.168.198.88',port '3306');
employee 是FDW的名字标识, mysql_fdw 是采用的POSTGRESQL 的扩展对应的数据库是那个,这里是MYSQL ,options后面是数据库的连接的IP 和对应的 端口。
CREATE USER MAPPING FOR PUBLIC SERVER employee OPTIONS (username 'admin',password passwd');
创建与fdw对应的连接数据库的账户和密码,此用户名和密码应该已经在MYSQL 上建立。
我们在POSTGRESQL 上创建两个已经在 MYSQL employees 数据库中存在的表 ( employee 数据库是 MYSQL 的公用测试库)
在创建表时需要注意的是,有些字段的类型 MYSQL 和 POSTGRESQL 不是一一对应的,这里并未要求严格,例如如果MYSQL是 VARCHAR类型的
在POSTGRESQL 可以建立为 TEXT, 时间类型 POSTGRESQL 是timestamp 对应 MYSQL 的 datatime类型,具体的类型对应还需要仔细查询两种数据库的不同点,好在POSTGRESQL 兼容性高。
在POSTGRESQL 中创建对应的表结构
CREATE FOREIGN TABLE titles (
emp_no int ,
title varchar(50) ,
from_date timestamp,
to_date timestamp
) SERVER employee OPTIONS (dbname 'employees', table_name 'titles');
CREATE FOREIGN TABLE employee (
emp_no int ,
birth_date timestamp ,
first_name varchar(14) ,
last_name varchar(16) ,
gender varchar(2),
hire_date timestamp ) SERVER employee OPTIONS (dbname 'employees', table_name 'employees');
在创建完这两个数据库后
可以直接在postgresql 的数据库中看到两张相关的表
然后我们就可以直接进行查询,而语法也可以比较复杂。
通过上面的图片,所有的数据均在MYSQL 端,而查询语句的灌入都在POSTGRESQL端。
虽然查询的速度和在本地的MYSQL 查询的速度不能比较,但如果我们就需要多种数据库的联合查询,则POSTGRESQL 为多种数据库的数据互联提供的便利。并且由于支持的数据库种类较多,类似部分大数据库的平台也可以直接接入,这为快速部署多种数据库的查询平台提供了一种方案。
同时我们也可以从图中发现,POSTGRESQL 在上层还是走了一些特殊的语句查询的优化方式,并且在窗口函数,以及一些特殊的语句功能方面POSTGRESQL 相比较MYSQL 是有优势的。所以有时候在一些特殊的需求中我们或许可能找到多种数据库互补的方式来让工作变得更轻松。