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等编译开发工具。
git clone https://github.com/hangzhou-cstech/odbc_fdwcd odbc_fdwmakesudo make install
其中odbcinst.ini中是各个数据库的驱动配置,在安装了psqlodbc之后,我们可以看到自动增加了PG的odbc驱动的配置:
$ odbcinst -junixODBC 2.3.1DRIVERS............: /etc/odbcinst.iniSYSTEM DATA SOURCES: /etc/odbc.ini
在odbc.ini文件中则是对于某个数据库实例的配置,我们的配置如下:
[PostgreSQL]Description = ODBC for PostgreSQLDriver = /usr/local/lib/psqlodbca.soSetup = /usr/local/lib/psqlodbcw.soFileUsage = 1
在启动了数据库实例之后,我们可以通过isql来验证是否配置成功。
[REMOTE_PG]Driver = PostgreSQLDescription = Test on PostgreSQLDatabase = postgresServername = localhostUserName = postgresPort = 5432
创建一个server以及user mapping:
CREATE EXTENSION odbc_fdw;
CREATE SERVER loopback FOREIGN DATA WRAPPER odbc_fdwOPTIONS (dsn 'REMOTE_PG');CREATE USER MAPPING FOR CURRENT_USER SERVER loopback OPTIONS (odbc_UID 'postgres', odbc_PWD '');
我们可以简单的在创建一个普通表,和一个对应的远程表:
CREATE TABLE test (c1 int NOT NULL, c2 text);CREATE FOREIGN TABLE remote_test (c1 int NOT NULL, c2 text) SERVER loopback OPTIONS (schema 'public', table 'test');
最后,可向test表插入条数据,在remote_test表可以查出这条数据。
ODBC_FDW目前支持将投影、选择、过滤、聚集、排序、连接等操作下推到远程数据源,极大的提高了SQL的效率。并且支持多种标准的数据类型,除了原来老的ODBC_FDW支持的数据类型外,还支持二进制数组(等价于PG中的bytea类型),这个数据类型可以用来存储照片等二进制文件。