Babelfish简介
Babelfish是在PostgreSQL的基础之上实现了类似Microsoft SQL Server部分功能。为了实现这个目标,PostgreSQL核心内部的几个部分必须被修改。PostgreSQL 没有提供这种开箱即用的功能,因此必须提供附加组件才能实现这一点。
Babelfish实现Microsoft SQL Server功能的方式是使用hooks(我们一般称之为钩子),主要做这意味着 PostgreSQL可以呈现为不同的数据库状态,比如Oracle、MS SQL SERVER。而事实上在同一时间可以同时支持多个协议,会使数据库的设置更加灵活和易于处理。
Babelfish for PostgreSQL架构图
- Babelfish for PostgreSQL实例具备两个TCP端口,分别监听来自SQL Server和PostgreSQL客户端的SQL请求。
- TDS Listener:接收SQL Server协议端口(TDS)的SQL请求,默认端口号为1433。
说明 Babelfish支持TDS协议7.1及更高版本,即支持Microsoft SQL Server 2000及以上版本。
- PostgreSQL Listener:接收PostgreSQL协议端口的SQL请求,默认端口号为5432。
说明 当前支持RDS PostgreSQL 13和14。
- TDS Listener:接收SQL Server协议端口(TDS)的SQL请求,默认端口号为1433。
- Babelfish for PostgreSQL实例接收来自TDS Listener端口的SQL请求时,该请求被转发到T-SQL解析器,将SQL Server的T-SQL转换为PostgreSQL可识别的执行计划。
- Babelfish for PostgreSQL实例接收来自PostgreSQL Listener端口的SQL请求时,该请求被转发到PostgreSQL解析器,生成执行计划。
- PostgreSQL内部的SQL执行器统一处理,执行所有计划。
开启了Babelfish功能的PostgreSQL实例,使您同时具备了两个数据库引擎(PostgreSQL和SQL Server)的能力,既可以处理来自SQL Server的请求,又可以处理来自PostgreSQL的请求,在降低成本的同时获得更多的能力支持。
迁移模式简介
Babelfish for RDS PostgreSQL实例会预置一个名为babelfish_db
的PostgreSQL数据库,所有迁移的SQL Server对象和结构都会放置在该数据库下。
babelfish_db
数据库不可见。您可以选择Single-DB模式(单数据库模式)或Multi-DB模式(多数据库模式)。不同模式下,babelfish_db
内的SQL Server数据库模式及名称不同。
Single-DB模式
- 架构图:
- 说明:该模式下,babelfish_db数据库中用户数据库的Schema名称与SQL Server中的相同。
例如:通过TDS端口创建数据库DB_A,然后在DB_A下创建schema_A。
- 在PostgreSQL的babelfish_db数据库中,Schema名称为:dbo和schema_A。
- 在SQL Server的DB_A数据库中,Schema名称为:dbo和schema_A。
Multi-DB模式
- 架构图:
- 说明:该模式下,在PostgreSQL中,用户数据库的schema名称为
dbname_schemaname
。在SQL Server中,Schema名称保持不变。例如:通过TDS端口创建数据库DB_A,然后在DB_A下创建schema_A。- 在PostgreSQL的babelfish_db数据库中,Schema名称为:DB_A_dbo和DB_A_schema_A。
- 在SQL Server的DB_A数据库中,Schema名称为:dbo和schema_A。
其他
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,当时具体兼容性会有很多差异。
开源
PostgreSQL SQL Server 兼容插件 babelfish开源
AWS babelfish 开源了, 瞄准了SQL Server的存量数据库市场.
https://github.com/babelfish-for-postgresql/
https://babelfishpg.org/getstarted/
但是目前的使用方法比较复杂, PG内核还没有接收proxy protocol的patch, 所以要用babelfish必须使用aws开源的这个postgresql版本:
https://github.com/babelfish-for-postgresql/postgresql_modified_for_babelfish
本文来自博客园,作者:古道轻风,转载请注明原文链接:https://www.cnblogs.com/88223100/p/About_Babelfish.html