简介

ODBC是微软提倡的一套数据库的开放标准接口,广泛应用于数据库的应用程序中。许多商业数据库也提供了标准的ODBC驱动。
FDW是PostgreSQL数据库的一个数据源的抽象框架,使得开发人员能使用远程数据源的接口,开发出一套对应的实现。最终以插件的形式部署到PG数据库中,运行时,自动加载到PG的后台进程中,提供对远程数据源的访问。
原有ODBC_FDW的实现,代码过于古老,缺乏维护和开发,存在着多种bug和缺陷,并且无法支持最新的PG版本(9.6 10 11)。但是目前在很多数据迁移场景中,特别是从SQL server迁移到PG时,极其需要使用ODBC_FDW来同步数据。
因此,我们针对当前的需求,在原有的ODBC_FDW的基础上,开发出了能够支持当前主流PG版的ODBC_FDW,并且修复了原有ODBC_FDW的诸多缺陷和BUG。在某客户的数据迁移过程中,已经稳定运行了1年时间。
目前,该代码公开在了github上:
https://github.com/hangzhou-cstech/odbc_fdw

编译安装

下面的编译安装,假设都是linux X86_64机器上,操作系统是CentOS6或者7版本,都有完整的gcc make等编译开发工具。

其他依赖安装

  1. unixODBC,可以采用源码安装或是yum安装,安装之后,就能看到odbcinst 和isql等ODBC命令
  2. 相关数据库的ODBC驱动,例如sql server的ODBC驱动msodbcsql,PG的驱动是psqlodbc

    ODBC_FDW的编译安装

    ODBC_FDW的编译安装有两种:一种是放置到PG的源码下的contrib下面,进行编译安装;一种是直接依赖目前操作系统环境中安装好的二进制PG进行编译安装(执行make USE_PGXS =1 以及make USE_PGXS =1 install) ,不需要PG的源码。我们一般采用前一种,当然后一种也支持,但是后一种无法进行回归测试。
    所以,我们先需要下载一个PG的源码,编译安装之后,再使用git 将ODBC_FDW的代码克隆到contrib目录下,进行编译安装:
    1. git clone https://github.com/hangzhou-cstech/odbc_fdw
    2. cd odbc_fdw
    3. make
    4. sudo make install

    部署使用

    在部署时,主要分两部分工作:一部分是配置unixODBC的数据源,确保最终isql能够访问到数据源;另外一部分,就是在PG实例中创建相关的server user mapping 以及foreign table,最终通过SQL来访问到远程数据源上的表。
    现在在本地启动一个PG实例,来模拟远程数据源,当然这个实例上也会部署ODBC_FDW插件,最终,在这个PG实例上,我们会通过foreign table来访问这个实例上的普通表。

    配置unixODBC

    unixODBC的配置文件有两个,我们通过odbcinst可以看到:
    1. $ odbcinst -j
    2. unixODBC 2.3.1
    3. DRIVERS............: /etc/odbcinst.ini
    4. SYSTEM DATA SOURCES: /etc/odbc.ini
    其中odbcinst.ini中是各个数据库的驱动配置,在安装了psqlodbc之后,我们可以看到自动增加了PG的odbc驱动的配置:
    1. [PostgreSQL]
    2. Description = ODBC for PostgreSQL
    3. Driver = /usr/local/lib/psqlodbca.so
    4. Setup = /usr/local/lib/psqlodbcw.so
    5. FileUsage = 1
    在odbc.ini文件中则是对于某个数据库实例的配置,我们的配置如下:
    1. [REMOTE_PG]
    2. Driver = PostgreSQL
    3. Description = Test on PostgreSQL
    4. Database = postgres
    5. Servername = localhost
    6. UserName = postgres
    7. Port = 5432
    在启动了数据库实例之后,我们可以通过isql来验证是否配置成功。

    部署使用odbc_fdw

    使用psql连接上本地数据库实例,执行下列SQL创建extension:
    1. CREATE EXTENSION odbc_fdw;
    创建一个server以及user mapping:
    1. CREATE SERVER loopback FOREIGN DATA WRAPPER odbc_fdw
    2. OPTIONS (dsn 'REMOTE_PG');
    3. CREATE USER MAPPING FOR CURRENT_USER SERVER loopback OPTIONS (odbc_UID 'postgres', odbc_PWD '');

我们可以简单的在创建一个普通表,和一个对应的远程表:

  1. CREATE TABLE test (c1 int NOT NULL, c2 text);
  2. CREATE FOREIGN TABLE remote_test (
  3. c1 int NOT NULL, c2 text
  4. ) SERVER loopback OPTIONS (schema 'public', table 'test');

最后,可向test表插入条数据,在remote_test表可以查出这条数据。

ODBC_FDW特点

ODBC_FDW目前支持将投影、选择、过滤、聚集、排序、连接等操作下推到远程数据源,极大的提高了SQL的效率。并且支持多种标准的数据类型,除了原来老的ODBC_FDW支持的数据类型外,还支持二进制数组(等价于PG中的bytea类型),这个数据类型可以用来存储照片等二进制文件。

0 评论  
添加一条新评论