Babelfish简介
开源数据库替换ms-sql-server,不需要改动应用,也不需要改端口 (port 1433)
Babelfish是在PostgreSQL的基础之上实现了类似Microsoft SQL Server部分功能。为了实现这个目标,PostgreSQL核心内部的几个部分必须被修改。PostgreSQL 没有提供这种开箱即用的功能,因此必须提供附加组件才能实现这一点。
Babelfish实现Microsoft SQL Server功能的方式是使用hooks(我们一般称之为钩子),主要做这意味着 PostgreSQL可以呈现为不同的数据库状态,比如Oracle、MS SQL SERVER。而事实上在同一时间可以同时支持多个协议,会使数据库的设置更加灵活和易于处理。
图1 babelfish整体结构图
Babelfish从整体上共分为六个部分,前两个部分即patch和Extension组成的babelfish的核心功能,其中插件功能如下:
lbabelfishpg_common: Microsoft SQL Server数据类型
Babelfish模仿 Microsoft SQL Server的特定数据类型。以下是这些类型的完整列表:
sys.BBF_BINARY: 二进制数据的数据类型。
sys.BIT: 将1或0转换为t或f。
sys.BPCHAR和sys.VARCHAR:Microsoft SQL Server特定varchar实现
sys.DATETIME: 时间和日期的简单数据类型。为了更精确地使用DATETIME2。
sys.DATETIME2:DATETIME具有更高精度和功能的扩展。
sys.DATETIMEOFFSET:很像DATETIME2,但具有时区概念。
sys.SMALLDATETIME:定义与一天中的时间相结合的日期。时间基于24小时制,秒数始终为零 (:00),没有小数秒。
sys.SQL_VARIANT:使这些数据库对象能够支持其他数据类型。
sys.UNIQUEIDENTIFIER:16字节GUID(例如6F9619FF-8B86-D011-B42D-00C04FC964FF)
lbabelfishpg_money: 固定精度数字类型
还有一种数据类型出于许可原因打包到单独的扩展中:fixeddecimal.
lbabelfishpg_tds: TDS 协议扩展
此扩展处理TDS客户端-服务器协议。它必须在服务器启动时使用加载shared_preload_libraries,以便它可以开始在TDS端口上侦听传入连接。
lbabelfishpg_tsql: T-SQL 扩展
此扩展的目的是提供T-SQL处理所需的所有代码。如果没有可能无法编写存储过程代码。包含实现 Microsoft SQL Server 功能所需的大量函数、系统视图和其他基础结构。
Compass作为Babelfish的迁移评估工具,可以对源端的多个SQL脚本进行迁移评估,并给出评估报告;
WebSite是文档相关内容,与官网是一致的,包括介绍Babelfish的架构、兼容性、安全等等;
Tools主要是可以访问Babelfish的客户端工具,包括psql、tsql以及MS SQL SERVER自带的smss;
最后一部分是Client,这部分主要是客户端编程,除了支持不同编程语言,如C、C#、Python、Java以外,还支持不同的驱动,如下:
lOLEDB Provider/MSOLEDBSQL
lOLEDB Driver/SQLOLEDB (deprecated by Microsoft)
l.NET Data Provider for SQL Server
l SQL Server Native Client 11.0 (deprecated by Microsoft)
l Microsoft SqlClient Data Provider for SQL Server
l Open Database Connectivity (ODBC)
l Java Database Connectivity (JDBC)
也就是说我们可以像使用MS SQL SERVER一样来使用Babelfish,当时具体兼容性会有很多差异。
下面简单介绍一下Babelfish的整体架构:
图2:babelfish系统架构图
从图中可以了解到,一旦TDS处理程序接受了来自端口 1433的请求,处理了请求就会通过pltds传递到标准的PostgreSQL后端(支持MS SQL SERVER的功能)。而PostgreSQL仍将在端口5432(默认)上向客户端公开,提供原生PG的相关功能。
总结一下就是:
l客户端连接到端口1433,处理SQL Server方言。
l客户端连接到端口5432,处理PostgreSQL方言。
换句话说,启用Babelfish的数据库将侦听两个 TCP 端口上的连接,而不是一个。
处理流程是TDS侦听器捕获来自客户端的请求,并通过 Microsoft SQL Server的SQL方言的解析器发送,然后查询将由常规PostgreSQL后端处理。
数据库与模式
PostgreSQL 提供以下对象的逻辑结构:
l实例:一个正在运行的 PostgreSQL 服务器
l数据库:用户连接到什么
l模式:数据库中表和其他对象的逻辑分组
l表:数据真正存储的地方
Microsoft SQL Server也具有相同的结构。可以通过使用USE命令切换数据库。另外与PostgreSQL相比,可以从另一个数据库查询表并连接来自不同数据库的表。要启用跨库联接,可以使用multi-dbBabelfish 中的迁移模式。在这种模式下,TDS 连接中的数据库(我们简称为“T-SQL 数据库”)已被建模为 PostgreSQL 中的模式。
在multi-db模式下,如果调用USE可以从一个数据库切换到另一个数据库,实际上是连接到同一个PostgreSQL数据库的不同模式。