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。
- 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对象和结构都会放置在该数据库下。
说明如果您通过TDS端口连接实例,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
lSQL Server Native Client 11.0 (deprecated by Microsoft)
lMicrosoft SqlClient Data Provider for SQL Server
lOpen Database Connectivity (ODBC)
lJava 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
《PostgreSQL devel preview – PROXY protocol support (支持代理协议解包, 源头client ip filter pg_hba.conf, 例如haproxy, balancer)》
《PostgreSQL 兼容 SQL Server – Babelfish – SQL Server 业务 无感使用PostgreSQL – 一份数据, 同时兼容SQL Server和PostgreSQL》
本文来自博客园,作者:古道轻风,转载请注明原文链接:https://www.cnblogs.com/88223100/p/About_Babelfish.html