zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

Babelfish for PostgreSQL

2023-09-14 08:57:37 时间

 

 

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代码。