Babelfish – SQL Server TDS on PostgreSQL (Demo)

Amazon, 2020 yılının sonunda Babelfish isminde bir proje duyurmuştu. Bu proje, TDS protokolünü kullanarak, SQL Server’a yöneltilen TDS paketlerini uygulama kodunuzda herhangi bir değişiklik yapmadan PostgreSQL üzerinde çalıştırmanızı sağlayacaktı.

28 Ekim 2021’de ilk sürüm erişilebilir duruma geldi ve aynı zamanda Amazon RDS’te Aurora PostgreSQL üzerinde kullanılabilir durumda. Duyuru için aşağıdaki linki ziyaret edebilirsiniz.

HIW-Diagram_Babelfish-for-PostgreSQL@2x(V2)_product-page-diagram_CN-Babel_rev
Kaynak: https://aws.amazon.com/rds/aurora/babelfish/

Tabi ki tam olarak T-SQL desteği henüz yok ancak birçok keyword desteği sunuyor. Detay için: https://babelfishpg.org/docs/usage/limitations-of-babelfish/

Yazıda yer alan adımlar tamamen test amacıyla oluşturulmuştur, productionda uygulamanız önerilmez. Dilerseniz test adımlarına geçelim.

Babelfish’in kurulum dökümanında yer alan stepler ve güncel paket gereksinimlerinden dolayı, Ubuntu Server 20.04 LTS tercih edildi. Dilerseniz RHEL/CentOS/Debian üzerinde test edebilirsiniz.

Henüz Babelfish için hazır bir paket olmadığından dolayı kaynaktan derleyip hazır hale getirmemiz gerekecek.

Adımlar için linki takip edebilirsiniz, karşılaştığım hatalar için yaptığım ekler nedeniyle sırasını takip etmeniz ve ek paketleri yüklemeniz faydalı olacaktır.

Başlamadan önce sisteminizin güncelliği için apt update komutuyla paketlerin ve bileşenlerin güncelliğini sağlayabilirsiniz.

Ek olarak eğer git yüklü değilse öncelikle yüklemeniz gerekiyor, fakat 20.04’te önyüklü olarak geldiği için bu adımı geçebilirsiniz.

apt install -y git

Yükleme işleminden sonra aşağıdaki repoları localinize clonelamanız gerekiyor.

git clone https://github.com/babelfish-for-postgresql/postgresql_modified_for_babelfish.git
git clone https://github.com/babelfish-for-postgresql/babelfish_extensions.git

Clone işleminden sonra bulunduğunuz pathe babelfish_extensions ve postgresql_modified_for_babelfish isminde dizinler oluşacaktır. $HOME dizininde olduğumuzu varsayarak, sonraki adımlar bu pathe göre set edilmiştir.

Derleme işleminden önce mevcut sistemimizi hazır hale getirmek ve derlemeyi konfigüre etmek için bazı paketlere ihtiyacımız olacak. Yükleme işlemi uzun sürebilir.

sudo apt install -y build-essential flex libxml2-dev libxslt-dev libssl-dev
sudo apt install -y libreadline-dev zlib1g-dev libldap2-dev libpam0g-dev bison
sudo apt install -y uuid uuid-dev lld pkg-config libossp-uuid-dev gnulib
sudo apt install -y libxml2-utils xsltproc icu-devtools libicu66 libicu-dev gawk

Derleme konfigürasyonu için:

cd postgresql_modified_for_babelfish/

./configure CFLAGS="${CFLAGS:--Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic}" \
  --enable-thread-safety \
  --enable-cassert \
  --enable-debug \
  --with-ldap \
  --with-python \
  --with-libxml \
  --with-pam \
  --with-uuid=ossp \
  --enable-nls \
  --with-libxslt \
  --with-icu \
  --with-python PYTHON=/usr/bin/python2.7 \
  --with-extra-version=" Babelfish for PostgreSQL"

Python ile ilgili hata alırsanız aşağıdaki komut ile yüklemeniz gerekiyor:

apt install python-dev -y

Konfigürasyon komutu ile varsayılan olarak /usr/local/pgsql yükleme dizini belirlenecektir. Eğer farklı bir dizin seçmek isterseniz, aşağıdaki komutu kullanabilirsiniz:

./configure CFLAGS="${CFLAGS:--Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic}" \
  --prefix=/usr/local/pgsql-13.4 \
  --enable-thread-safety \
  --enable-cassert \
  --enable-debug \
  --with-ldap \
  --with-python \
  --with-libxml \
  --with-pam \
  --with-uuid=ossp \
  --enable-nls \
  --with-libxslt \
  --with-icu \
  --with-python PYTHON=/usr/bin/python2.7 \
  --with-extra-version=" Babelfish for PostgreSQL"

Babelfish PostgreSQL Engine build işlemi için ilgili pathte aşağıdaki adımları izliyoruz. Bu işlem uzun sürebilir 🙂

INSTALLATION_PATH=/usr/local/pgsql
mkdir "$INSTALLATION_PATH"

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

Herhangi bir hata almanız durumunda sonraki steplerde ilerlemenizi engelleyeceği için çıktıyı kontrol etmelisiniz.

Babelfish extensionları yüklemek için ek araçlara ihtiyacımız var, bunların kurulum ve yapılandırması için:

sudo apt install -y openjdk-8-jre openssl python-dev libpq-dev pkgconf unzip libutfcpp-dev

# Cmake
sudo curl -L https://github.com/Kitware/CMake/releases/download/v3.20.6/cmake-3.20.6-linux-x86_64.sh --output /opt/cmake-3.20.6-linux-x86_64.sh
sudo chmod +x /opt/cmake-3.20.6-linux-x86_64.sh 
sudo /opt/cmake-3.20.6-linux-x86_64.sh --prefix=/usr/local --skip-license

# Antlr4 runtime
sudo curl https://www.antlr.org/download/antlr4-cpp-runtime-4.9.2-source.zip \
  --output /opt/antlr4-cpp-runtime-4.9.2-source.zip 

sudo unzip -d /opt/antlr4 /opt/antlr4-cpp-runtime-4.9.2-source.zip

sudo mkdir /opt/antlr4/build 
cd /opt/antlr4/build

EXTENSIONS_SOURCE_CODE_PATH=$HOME/babelfish_extensions

sudo 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

# Compile, install
make
sudo make install

# Copy antlr4 library to PostgreSQL engine lib
sudo cp /usr/local/lib/libantlr4-runtime.so.4.9.2 "$INSTALLATION_PATH/lib"

Tüm araçlar ve Babelfish eklentileri yüklendikten sonra environment değişkenleri set etmek için:

export PG_CONFIG=/usr/local/pgsql/bin/pg_config
export PG_SRC=$HOME/postgresql_modified_for_babelfish
export cmake=/usr/local/bin/cmake

Bu aşamadan sonra Babelfish extensionları build etmek için, aşağıdaki adımları izliyoruz:

# Babelfish extension dizinine geçmek için ($HOME dizinine indirdiğiniz varsayarak)
cd $HOME/babelfish_extensions/

# Install babelfishpg_money extension
cd contrib/babelfishpg_money
make
sudo make install

# Install babelfishpg_common extension
cd ../babelfishpg_common
make 
sudo make install

# Install babelfishpg_tds extension
cd ../babelfishpg_tds
make 
sudo make install

# Installs the babelfishpg_tsql extension
cd ../babelfishpg_tsql
make 
sudo make install

PostgreSQL initdb ve start işlemleri öncesinde postgres userı create edelim:

useradd -m -d /usr/local/pgsql/ postgres

PostgreSQL binary dizininin sahipliğini değiştirmek ve data dizinini oluşturmak için:

mkdir /usr/local/pgsql/data

chown -R postgres: /usr/local/pgsql/

postgres usera geçerek initdb ve start işlemlerini gerçekleştirelim:

/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data -U postgres
/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile start

[46798] LOG:  starting PostgreSQL 13.4 Babelfish for PostgreSQL on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0, 64-bit
[46798] LOG:  listening on IPv6 address "::1", port 5432
[46798] LOG:  listening on IPv4 address "127.0.0.1", port 5432
[46798] LOG:  database system is ready to accept connections

Babelfish, SQL Server için single ya da multi database seçeneği sunuyor. Aşağıdaki örnekte single-db tercih edildi.

Babelfish erişimi için user create edilmesi ve ilgili extensionın oluşturulması gerekiyor:

CREATE USER babelfish_user WITH CREATEDB 
	CREATEROLE PASSWORD 'Str0ngP3ssw0rd' INHERIT;
DROP DATABASE IF EXISTS demo;

CREATE DATABASE demo OWNER babelfish_user;

\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 = 'single-db';
CALL SYS.INITIALIZE_BABELFISH('babelfish_user');

Not: babelfishpg_tds extension create esnasında hata alırsanız, /usr/local/pgsql/postgresql.conf içerisindeki shared_preload_libraries‘e babelfishpg_tds‘i eklemelisiniz.

Ayrıca dışarıdan erişim için yine postgresql.conf’ta listen_address‘e *(yıldız) ekleyip restart etmeniz ve pg_hba.conf’a ilgili host-db-user satırını eklemeniz gerekiyor.

Şimdi Babelfish’in sunduğu TDS erişimini kontrol etmek için sqlcmd aracını yüklememiz gerekiyor. Microsoft’un sitesinde yer alan linki takip ederek yükleyebilirsiniz ya da aşağıdaki adımları izleyebilirsiniz.

curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -

curl https://packages.microsoft.com/config/ubuntu/20.04/prod.list | sudo tee /etc/apt/sources.list.d/msprod.list

sudo apt-get update 
sudo apt-get install 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

Erişimi test etmek için sqlcmd ya da Azure Data Studio kullanılabilir. SSMS ile erişmeye çalıştığımda aldığım hatayı aştığımda ekran görüntülerini ekleyeceğim.

sqlcmd -S 127.0.0.1 -U babelfish_user -P 'Str0ngP3ssw0rd'

Ekran görüntüsünde de görüldüğü gibi arka planda herhangi bir SQL Server olmamasına rağmen Babelfish PostgreSQL üzerinde, TDS paketlerini karşılayıp işliyor.

Hatamız varsa affola, daha detaylı Babelfish yazısında görüşmek üzere.

Sağlıcakla kalın.