Babelfish for PostgreSQL開源已快一月,不過全網還沒有實踐者總結。今天我們就測試看看,Babelfish到底是如何部署與使用的! ...
Babelfish for PostgreSQL開源已快一月,不過全網還沒有實踐者總結。今天我們就測試看看,Babelfish到底是如何部署與使用的!
Babelfish for PostgreSQL介紹
我們先回顧Babelfish for PostgreSQL的基本架構,如下圖:
Babelfish是一種擴展,它的存儲庫是PostgreSQL。Babelfish支持T-SQL協議、T-SQL語言、TDS協議等。這就使我們可以使用T-SQL語法對PostgreSQL資料庫進行操作。而這個插件的最強優勢就是,以最大相容性/最小更改去遷移MSSQL到PostgreSQL。當然,你也用在 MSSQL中操作PostgreSQL資料庫,功能類似MSSQL的鏈接伺服器或PolyBase。
Babelfish支持TDS協議版本7.1及更高版本,即支持Microsoft SQL Server 2000及以上版本。支持的PostgreSQL版本為PostgreSQL 13及以上版本。Babelfish作為PostgreSQL的一部分運行,預設情況下,資料庫伺服器將在埠5432上偵聽PostgreSQL,在預設情況下在埠1433上偵聽TDS。接下來,你就可以使用sqlcmd通過1433連接至TDS埠。
部署Babelfish for PostgreSQL
為了部署Babelfish,我專門下載了Ubuntu 21.10並使用虛擬機安裝了該系統。
筆者也曾使用CentOS 7編譯安裝,但是Babelfish似乎還不相容,編譯了一周也沒完成。否則當前文章該提早兩周面世。
跟著一步步來,即可實現Babelfish的使用,這比官網更詳細一些。
安裝相關依賴。我們需要一個具有root許可權的用戶,可以sudo切換。
apt-get update apt-get install -y build-essential flex libxml2-dev bison libreadline-dev zlib1g-dev libxslt-dev apt-get install -y uuid-dev pkg-config libossp-uuid-dev libssl-dev icu-devtools gettext apt-get install -y openjdk-8-jre unzip libutfcpp-dev curl openssl python-dev libpq-dev pkgconf
下載存儲庫。我們需要Babelfish for PostgreSQL引擎源碼及Babelfish擴展包源碼。
git clone https://github.com/babelfish-for-postgresql/postgresql_modified_for_babelfish.git git clone https://github.com/babelfish-for-postgresql/babelfish_extensions.git mv babelfish_extensions /opt/babelfish_extensions mv postgresql_modified_for_babelfish /opt/postgresql_modified_for_babelfish
接下來,我們就開始編譯安裝吧。
#創建安裝目錄 INSTALLATION_PATH=/usr/local/pgsql mkdir "$INSTALLATION_PATH" #構建配置 cd /opt/postgresql_modified_for_babelfish ./configure CFLAGS="-ggdb" \ --prefix=${INSTALLATION_PATH} \ --enable-debug \ --with-libxml \ --with-uuid=ossp \ --with-icu \ --with-extra-version="Babelfish for PostgreSQL" #編譯安裝 cd /opt/postgresql_modified_for_babelfish make # Compiles the Babefish PostgreSQL engine cd contrib make # Compiles the PostgreSQL default extensions cd .. make install # Installs the Babelfish PostgreSQL engine cd contrib make install # Installs the PostgreSQL default extensions
對於Antlr4 4.9.2 Runtime,Ubuntu中沒有可用的C++二進位文件,因此有必要從源代碼編譯它。4.9以下的版本官方尚未完全測試。要安裝Antlr4 Runtime,我們需要有Antlr4 .jar。
Babelfish擴展源代碼在路徑中包含這個
.jar(/contrib/babelfishpg_tsql/antlr/thirdparty/antlr)
現在我們安裝cmake和Antlr4:
#安裝 cmake curl -L https://github.com/Kitware/CMake/releases/download/v3.20.6/cmake-3.20.6-linux-x86_64.sh --output ~/cmake-3.20.6-linux-x86_64.sh chmod +x ~/cmake-3.20.6-linux-x86_64.sh ~/cmake-3.20.6-linux-x86_64.sh --prefix=/usr/local --skip-license cp /usr/local/bin/cmake /usr/bin/ #安裝 Antlr4 curl https://www.antlr.org/download/antlr4-cpp-runtime-4.9.2-source.zip --output ~/antlr4-cpp-runtime-4.9.2-source.zip unzip -d /opt/antlr4 ~/antlr4-cpp-runtime-4.9.2-source.zip mkdir /opt/antlr4/build cd /opt/antlr4/build EXTENSIONS_SOURCE_CODE_PATH="/opt/babelfish_extensions" cmake .. -DANTLR_JAR_LOCATION="$EXTENSIONS_SOURCE_CODE_PATH/contrib/babelfishpg_tsql/antlr/thirdparty/antlr/antlr-4.9.2-complete.jar" \ -DCMAKE_INSTALL_PREFIX=/usr/local -DWITH_DEMO=True make make install cp /usr/local/lib/libantlr4-runtime.so.4.9.2 "$INSTALLATION_PATH/lib"
編譯Antlr4時可能存在一個bug,因為文件gtest-death-test.cc中的變數dummy未賦值,make將報錯並終止,你可以給該變數賦值。
構建和安裝Babelfish擴展
我們已經安裝了Babelfish for PostgreSQL引擎,還需要設置幾個環境變數,接下來才繼續構建擴展。
-
PG_CONFIG:指向在Babelfish平臺PostgreSQL的引擎安裝pg_config文件的位置。
-
PG_SRC:指向Babelfish for PostgreSQL引擎源文件夾的位置。
-
cmake:指向包含cmake二進位文件的路徑
export PG_CONFIG=$INSTALLATION_PATH/bin/pg_config export PG_SRC=/opt/postgresql_modified_for_babelfish export cmake=/usr/local/bin/cmake
編譯擴展:
# Install babelfishpg_money extension cd /opt/babelfish_extensions/contrib/babelfishpg_money make make install # Install babelfishpg_common extension cd ../babelfishpg_common make make install # Install babelfishpg_tds extension cd ../babelfishpg_tds make make install # Installs the babelfishpg_tsql extension cd ../babelfishpg_tsql make make install
初始化及配置PostgreSQL
以上Babelfish引擎及Babelfish擴展部署完成後,現在我們就該初始化PostgreSQL資料庫實例了。在啟動Babelfish之前,我們需要在安裝文件夾中做一些更改。這是因為如果所有者具有root訪問許可權,PostgreSQL將不會啟動。此外,我們需要為PostgreSQL創建一個目錄和用戶。
#創建獨立用戶 postgres mkdir -p $INSTALLATION_PATH/data adduser --disabled-password --gecos "" postgres chown -R postgres:postgres $INSTALLATION_PATH # 初始化數據並配置 su postgres INSTALLATION_PATH=/usr/local/pgsql $INSTALLATION_PATH/bin/initdb -D $INSTALLATION_PATH/data vim $INSTALLATION_PATH/data/postgresql.conf listen_addresses = '*' port = 5432 shared_preload_libraries = 'babelfishpg_tds' vim $INSTALLATION_PATH/data/pg_hba.conf host all all 0.0.0.0/0 md5 #啟動 PostgreSQL $INSTALLATION_PATH/bin/pg_ctl -D $INSTALLATION_PATH/data start
連接Babelfish操作
都部署完成後,我們現在可以連接Babelfish了。在Linux環境下,可以使用psql、tsql、sqlcmd這三個客戶端工具連接。當然,你也可以在Windows環境使用SQL Server Management Studio(SSMS)來連接。
Ubuntu安裝3個客戶端工具:
apt-get install -y postgresql-client apt-get install -y freetds-bin lsb_release -a curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add - curl https://packages.microsoft.com/config/ubuntu/21.04/prod.list | sudo tee /etc/apt/sources.list.d/msprod.list apt-get update apt-get install -y mssql-tools unixodbc-dev echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc source ~/.bashrc
現在,我們先使用psql通過5432埠連接至PostgreSQL,同時創建一個用戶來進行測試。
其中migration_mode有2種模式,在single-db的情況下,MS SQL資料庫被映射到PostgreSQL中的模式。在multi-db情況下,可使用多個資料庫。
#使用psql連接Babelfish並創建用戶jeeson和資料庫demo psql -h 127.0.0.1 -p 5432 -d postgres -U postgres SELECT version(); create user jeeson superuser password 'YourNewStrong@Passw0rd'; create database demo owner jeeson; \c demo create extension if not exists "babelfishpg_tds" cascade; alter system set babelfishpg_tsql.database_name = 'demo'; alter database demo set babelfishpg_tsql.migration_mode = 'multi-db'; select pg_reload_conf(); call sys.initialize_babelfish('jeeson'); #使用tsql或sqlcmd連接至Babelfish tsql -S 127.0.0.1 -p 1433 -U jeeson -P "YourNewStrong@Passw0rd" sqlcmd -S 127.0.0.1,1433 -U jeeson -P "YourNewStrong@Passw0rd"
我們創建了一個資料庫demo,以及一個用戶jeeson。現在,我們使用tsql和sqlcmd通過1433埠連接到Babelfish看看。
是不是很神奇?不要以為僅僅是連接到PostgreSQL,它可是用SQL Server的T-SQL語法進行操作的。當你要把SQL Server資料庫遷移到PostgreSQL時,只需把SQLServer的生成的SQL腳本執行即可。
對於習慣使用SQL Server Management Studio的同學,也可以在Windows中直接連接哦。不過需要註意的是,不是通過資源管理器連接伺服器,而是只打開一個新查詢視窗進行連接!
對於用戶來說,Babelfish相容PostgreSQL語法。而對SQL Server來看,就像一個閹割版的雲產品一樣。
其實,對於非運維人員,常用的T-SQL已經足夠適用。
Babelfish有一個名為Babelfish Compass的評估工具,可幫助人們驗證SQLServer的遷移。
只需在DDL上運行 Compass工具,它能確認Babelfish對T-SQL代碼的支持程度、識別在執行Babelfish之前可能需要更改的T-SQL代碼。
本文來自博客園,作者:古道輕風,轉載請註明原文鏈接:https://www.cnblogs.com/88223100/p/Babelfish-for-PostgreSQL.html