文章转载自公众号:SQLServer
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代码。
新闻|Babelfish使PostgreSQL直接兼容SQL Server应用程序
中国PostgreSQL分会入选工信部重点领域人才能力评价机构
更多新闻资讯,行业动态,技术热点,请关注中国PostgreSQL分会官方网站
https://www.postgresqlchina.com
中国PostgreSQL分会生态产品
https://www.pgfans.cn
中国PostgreSQL分会资源下载站
https://www.postgreshub.cn
点击此处阅读原文
↓↓↓