Babelfish for PostgreSQL
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