我在(研讨会上)尝试使用Babelfish for Aurora PostgreSQL
首先
2022年11月4日我参加了AWS举办的“介绍Babelfish for Aurora PostgreSQL”研讨会,并于2022年11月5日参加了Babelfish for Aurora PostgreSQL的工作坊,为了备忘起见,我记录下来。
巴别鱼是什么?
Babelfish for PostgreSQL是一个开源项目,根据Apache 2.0和PostgreSQL许可证可供使用。它在2021年10月28日发布了1.0版本,因此相对较新。截至2022年11月4日,最新版本2.1.2已发布。通过理解SQL Server的网络协议和T-SQL(Microsoft SQL Server查询语言),Babelfish使得PostgreSQL能够执行针对Microsoft SQL Server应用程序的查询。
Babelfish for Aurora PostgreSQL 是 Amazon Aurora PostgreSQL 兼容版,并且可以理解由 Aurora 开发的适用于 Microsoft SQL Server 的应用程序的命令。
可以这样说,SQL Server的查询可以直接在Aurora PostgreSQL上运行。
巴贝尔鱼的原始资料
顺便提一句,Babelfish 的名字的灵感来源于一本名为《银河系漫游指南》的小说中的全能翻译鱼。
工作坊概述
参加者将使用SQL Server客户端(SQL Server Management Studio:SSMS)和PostgreSQL客户端(psql)通过开启Babelfish功能的Aurora for PostgreSQL来访问工作坊。
工作坊的资料可以从这里的GitHub上下载。
以中文母语进行改写:
工作坊的流程如下,只需花费不到一小时即可尝试,适合在有点空闲时间的时候试一试。
-
- 创建SQL Server客户端实例:大约10分钟
-
- 创建用于Babelfish Aurora PostgreSQL的实例(创建Aurora实例):大约20分钟
-
- 创建psql客户端环境:大约10分钟
- 分别从SQL Server客户端和psql客户端连接到Aurora:大约10分钟
请参考Github的工作坊材料获取详细的步骤。
需要注意的是,似乎只能在创建Aurora时选择Babelfish for Aurora PostgreSQL功能,目前创建后无法更改,因此需要注意。(因为在从快照恢复时没有提到Babelfish本身,所以不可行)
如果要关闭该功能,可以通过更改参数组来实现。
创建用于 SQL Server 客户端的实例
因为需要作为SQL Server客户端的功能,所以希望使用已安装SQL Server的映像来启动EC2实例。
虽然也有安装在Linux上的映像可供使用,但根据工作坊的步骤,假定是使用Windows系统。
2. 创建用于Aurora PostgreSQL的Babelfish (创建Aurora实例)
创建用于 psql 客户端的环境。
在工作坊中使用了Cloud9环境,但由于有安装了PostgreSQL的EC2,所以决定使用那个。
通过SQL Server客户端和psql客户端分别连接到Aurora。
如果从SQL Server客户端连接,请连接到SQL Server端点;如果从psql客户端连接,请连接到PostgreSQL端点。
- SQL Server エンドポイントへの接続(ワークショップではSSMSを利用しているが、コマンドラインで十分なのでsqlcmdで接続)
PS C:\Windows\system32> sqlcmd -S database-2.cluster-xxxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -U postgres -P xxxxxxx
1> select @@version;
2> go
version
---------------------------------------------------------------------------------------------------------------------
Babelfish for Aurora Postgres with SQL Server Compatibility - 12.0.2000.8
Sep 28 2022 00:39:06
Copyright (c) Amazon Web Services
PostgreSQL 13.7 on aarch64-unknown-linux-gnu
(1 rows affected)
1> SELECT CAST(SERVERPROPERTY('Babelfish') AS VARCHAR)
2> go
serverproperty
------------------------------
1
(1 rows affected)
- PostgreSQL エンドポイントへの接続
$ psql -h database-2.cluster-xxxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -p 5432 -U postgres -d postgres
Password for user postgres:
psql (13.7)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES128-GCM-SHA256, bits: 128, compression: off)
Type "help" for help.
postgres=>
- SQL Server 側でテストデータのインサート
1> USE [master]
2> DROP DATABASE IF EXISTS MySSMSTest
3> CREATE DATABASE MySSMSTest
4> Go
Changed database context to 'master'.
1>
2>
3>
4>
5> USE [MYSSMSTest]
6> CREATE TABLE [dbo].[Student] (
7> [StudentId] [int] NOT NULL,
8> [Name] [nvarchar](50) NOT NULL,
9> [Age] [tinyint] NOT NULL,
10> CONSTRAINT [PK_Student] PRIMARY KEY
11> (
12> [StudentId] ASC
13> )
14> ) ON [PRIMARY]
15> GO
Changed database context to 'myssmstest'.
1>
2>
3>
4>
5> INSERT INTO [dbo].[Student]([StudentId],[Name],[Age]) VALUES (1,'John',15)
6> INSERT INTO [dbo].[Student]([StudentId],[Name],[Age]) VALUES (2,'Kate',20)
7> INSERT INTO [dbo].[Student]([StudentId],[Name],[Age]) VALUES (3,'Sara',65)
8> INSERT INTO [dbo].[Student]([StudentId],[Name],[Age]) VALUES (4,'Mike',19)
9> INSERT INTO [dbo].[Student]([StudentId],[Name],[Age]) VALUES (5,'Ruby',35)
10> GO
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
1>
1> select * from [dbo].[Student]
2> go
StudentId Name Age
----------- -------------------------------------------------- ---
1 John 15
2 Kate 20
3 Sara 65
4 Mike 19
5 Ruby 35
(5 rows affected)
1>
- PostgreSQL 側での確認
postgres=> \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
--------------+----------+----------+-------------+-------------+--------------------------
babelfish_db | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =Tc/postgres +
| | | | | postgres=CTc/postgres +
| | | | | sysadmin=C*T*c*/postgres+
| | | | | master_dbo=CTc/sysadmin +
| | | | | tempdb_dbo=CTc/sysadmin +
| | | | | msdb_dbo=CTc/sysadmin +
| | | | | dbo=CTc/sysadmin
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
rdsadmin | rdsadmin | UTF8 | en_US.UTF-8 | en_US.UTF-8 | rdsadmin=CTc/rdsadmin
template0 | rdsadmin | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/rdsadmin +
| | | | | rdsadmin=CTc/rdsadmin
template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
(5 rows)
postgres=> \c babelfish_db
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES128-GCM-SHA256, bits: 128, compression: off)
You are now connected to database "babelfish_db" as user "postgres".
babelfish_db=> select * from dbo.student;
studentid | name | age
-----------+------+-----
1 | John | 15
2 | Kate | 20
3 | Sara | 65
4 | Mike | 19
5 | Ruby | 35
(5 rows)
每个终端点解释的SQL也会发生变化。
概括
通过使用Babelfish,确认可以将Aurora for PostgreSQL像SQL Server一样操作。
目前具体的用例还想不出来,但考虑到有很多限制,将这些限制考虑在内可以扩大将来的选择余地。
在海豚鱼中可以进行以下数据库操作。
-
- master / tempdb ユーザー DB / sysdatabase & sp_helpdb
- CREATE DATABASE / USE / SELECT DB_NAME()
以下是在Babelfish的Aurora PostgreSQL上的实现(摘自“Babelfish for Aurora PostgreSQL介绍”)。
-
- Aurora PostgreSQL 上に Babelfish 用の database : babelfish_db が作成される
-
- Babelfish エンドポイントからの接続は 自動的に babelfish_db に接続
-
- SQL Server の DB / スキーマ は babelfish_db 内の スキーマにマッピング
-
- 上記のマッピングは SQL Server エンドポイントを利用するアプリケーションからは透過的
- Babelfish 構成時に シングルデータベースモード か マルチデータベースモードを選択
请特别留意
-
- バージョンごとに Babelfish でサポートされている機能
-
- Babelfish でサポートされていない機能
-
- Babelfish システムカタログからの情報の入手
- Babelfish がサポートする照合順序