Babelfish是在PostgreSQL的基礎之上實現了類似Microsoft SQL Server部分功能。為了實現這個目標,PostgreSQL核心內部的幾個部分必須被修改。PostgreSQL 沒有提供這種開箱即用的功能,因此必須提供附加組件才能實現這一點。 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。
- 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