跳至主要内容
  • AWS
  • 入门资源中心

如何使用 Babelfish for Aurora PostgreSQL 进行快速的数据库迁移

前言

Babelfish for Aurora PostgreSQL 是 Amazon Aurora PostgreSQL 兼容版本的一项新功能,它让 Aurora 能够理解来自为 Microsoft SQL Server 编写的应用程序命令。借助 Babelfish,Aurora PostgreSQL 现在可以理解 SQL Server 专有的 SQL 语言 T-SQL,并支持相同的通信协议,您最初为 SQL Server 编写的应用程序现在可以与 Aurora 一起使用,并且所需进行的代码更改更少。因此,修改 SQL Server 2005 或更高版本上运行的应用程序并将其移动到 Aurora 所需的工作量将减少,从而可实现更快、风险更低且更具成本效益的迁移。您将通过本教程学习如何使用 Babelfish for Aurora PostgreSQL 进行快速的数据库迁移。

关于本教程

时间: 50分钟
费用: 预估使用小于 $10
相关行业: 通用
相关产品: Amazon Aurora PostgreSQL 兼容版
受众: DBA/应用开发人员
级别: 初级
上次更新日期: 2022 年 6 月

实验说明

全部打开

数据库是通用应用系统的核心模块之一,在过去几十年里,商业数据库一直占据主导地位,但随着近些年来开源数据库的不断发展,其功能和性能几乎和商业数据库并驾齐驱,已经有越来越多的企业,选择使用开源数据库产品。
从商业的 Microsoft SQL Server 数据库迁移到开源数据库可能非常耗时且需耗费大量资源。迁移数据库时,您可以使用 AWS Database Migration Service (DMS) 自动迁移数据库架构和数据,但迁移应用程序本身时,通常需要完成更多的工作,包括重写与数据库交互的应用程序代码。
Babelfish for Aurora PostgreSQL 是 Amazon Aurora PostgreSQL 兼容版本的一项新功能,它让 Aurora 能够理解来自为 Microsoft SQL Server 编写的应用程序命令。借助 Babelfish,Aurora PostgreSQL 现在可以理解 SQL Server 专有的 SQL 语言 T-SQL,并支持相同的通信协议,您最初为 SQL Server 编写的应用程序现在可以与 Aurora 一起使用,并且所需进行的代码更改更少。因此,修改 SQL Server 2005 或更高版本上运行的应用程序并将其移动到 Aurora 所需的工作量将减少,从而可实现更快、风险更低且更具成本效益的迁移。
为了让您更深入地体验 Babelfish 的功能和熟悉相关操作,我们设计了这一个“使用  Babelfish 迁移 .NET 应用”的实验课程,通过这个实验,您将了解到以下内容:

  • Babelfish for Aurora PostgreSQL 的架构和组件
  • Babelfish 为应用迁移带来的快捷性和简便性
  • 应用迁移到 Babelfish for Aurora PostgreSQL  的功能支持在完成了相应的动手实验后,您将掌握以下内容:
  • 如何通过 Babelfish Compass 工具评估迁移的兼容性
  • 应用切换及代码转换事宜
  • Babelfish for Aurora PostgreSQL 平台的兼容性
  • 如何在 Babelfish for Aurora PostgreSQL 平台上使用新的开发模式

  • 环境架构

整个实验环境部署在亚马逊云科技公有云美国东部区域(us-east-1),整体架构如下图所示,主要的组件包括:

  • VPC:包含公有和私有子网的虚拟私有网络环境
  • EC2 实例:部署了.NET 应用以及数据库客户端工具的 Windows Server
  • SQL Server 实例: RDS SQL Serves 数据库的节点
  • Aurora for PostgreSQL 实例:Aurora for PostgreSQL 数据库集群的单节点

  • 账号密码

操作类型

用户

密码

Windows on EC2远程桌面连接

administrator

Work_123*$!

RDS SQL Server 数据库连接

admin

admin123

Aurora PostgreSQL数据库连接

postgres

admin123

.net Web 应用登陆

0000

123456

  • 工具和用途

以下工具已经在 EC2 上的 Windows server 中下载并安装配置好,无需下载

Windows 桌面图标               
工具 SQL Server Management Studio dbeaver IIS 管理器
用途 连接 RDS SQL Server 连接 Aurora PostgreSQL 管理.net web 应用
  • 主要使用文件

以下文件和目录已经在 EC2 上的 Windows server 中放置好

  • C:\Demo\lab.txt - 内容包含实验1命令、实验4代码
  • C:\Demo\BabelfishCompass - Babelfish Compass 评估工具
  • C:\Demo\Data\init-data -SQL Server 和 Aurora PG 共用的初始化加载 SQL 脚本
  • C:\Demo\Data\pg-fix -Aurora PG 使用的 SQL 更正脚本

2. 实验环境配置

全部打开

Event Engine 是 AWS 创建的一个工具,可为 Workshop 活动预置 AWS 账户。这些帐户将在workshop 开始后 24 小时自动终止,参与者不必担心留下任何东西。每个参与者都将收到他们自己的 Event Engine AWS 帐户。以下为激活实验账号的操作全过程。

  1. 登陆 Event Engine 控制台
    登陆 https://dashboard.eventengine.run/login,输入主持者发送的 Hash 号码,并点击下方的“Accept Terms & Login”

2.点击 Email One-Time Password (OTP)/ 电子邮件一次性密码(OTP)

3. 输入您的电子邮件地址并点击 Send passcode / 发送密码

4. 检查您的邮箱,复制一次性密码,粘贴到页面中,点击 Sign in / 登陆

5. 登陆后在 Team Dashboard 面中点击 AWS Console

6. 在打开的页面中点击 Open AWS Console

现在您可以在 AWS 服务控制台中查看并创建相关的服务以完成实验。

在开始动手实验前,我们需要配置好实验环境,环境配置需要有 AWS Global 区域账号,具体的配置过程主要有以下几个步骤:

  • 如果没有 AWS Global 区域账号,请通过 Event Engine 申请临时的 AWS 操作权限以完成实验
  • 通过AWS Cloudformation完成环境组件的部署
  • 初始化数据导入及应用连接配置

AWS CloudFormation 是在 AWS 上实践基础设施即代码的重要服务之一,使用该服务,我们能够使用模板定义创建、配置云服务资源的操作,利用模板进行资源的创建能够减少重复的劳动,提高效率。本次实验使用 CloudFormation 部署 VPC 和相关的各个实例,实验中的所有操作都是在 us-east-1 区域中操作,请首先在账户的区域中确认当前使用区域为 us-east-1

接下来的具体操作过程如下:

1.创建新的CloudFormation堆栈任务

  • 进入 CloudFormation 主页,在左侧菜单点击“Stacks”,在出现的页面中点击“Create stack”并选择“With new resources(standard)”,再点击页面中间的“Create stack”按钮 

2. 第一步:准备模版

  • 选择模版来源于“Amazon S3 URL”,输入 S3 中的地址:https://xiekl.s3.cn-northwest-1.amazonaws.com.cn/bingbing-dbwebniar/demo.yml 并点击下一步

3. 第二步:配置堆栈信息

  • 输入 CloudFormation 堆栈任务名称

4. 第三步:配置堆栈选项

  • 默认设置无需改动

5. 第四步:审查堆栈任务

  • 检查相关参数,并点击“Create stack”

6. stack 创建过程基于网络状态大概等待十五分钟后,堆栈任务创建成功

7. 查看 CloudFormation 堆栈任务的输出

  • 点击堆栈名显示详细信息,点击“Output”页面,查看实例的连接 Endpoint,并记录以备后续使用。这里有三个 Endpoint ,具体连接用途如下:
  • WinInstanceEndpoint: Windows Server on EC2 远程桌面连接地址
  • PGInstanceEndpoint: Aurora PostgreSQL 连接端点
  • SQLInstanceEndpoint:RDS SQL Server 连接端点

1. 实验的开始前,我们需要初始化环境,将应用配置为 .net + SQL Server 的架构。在上一步通过Cloudformation部署的EC2实例中已包含了相关的 .net 应用和数据库客户端,为了正常启动应用服务,需要连接RDS SQL Server数据库初始化数据。
  • 如使用Windows操作系统的话,打开远程桌面程序连接EC2实例(通常在Windows运行对话框中输入 mstsc 即可打开),如使用MacOS系统的话,安装微软远程桌面工具并连接EC2实例
  • 连接地址:查看stack中输出的 WinInstanceEndpoint 信息
  • 登陆用户:查看1.2 实验环境中 "Windows on EC2远程桌面连接用户" 信息

2. 在远程桌面使用SQL Server Management Studio (SSMS) 登陆RDS SQL Servers

  • 连接地址:查看stack中输出的 SQLInstanceEndpoint 信息,手工输入地址
  • 登陆用户:查看1.2 实验环境中“RDS SQL Server 数据库连接”信息

3.  登陆后,在菜单中依次选择“File”→“Open”→“File”

4  选择“C:\Demo\Data\init-data”文件打开

5. 光标移到打开文件的最后,然后点击“Execute”执行

6. 等待 SQL 脚本执行完毕

7. 修改 APP 应用的配置文件 C:\web\Web.conf

  • 在 23 行修改数据库连接设置为 RDS SQL Server 的内容(参考步骤 2 所查看信息)
    Data Source= 数据库连接端点 ;Initial Catalog=demo;Persist Security Info=True; User ID= 数据库用户名 ;Password= 密码;

8. 打开 IIS 服务管理,启动 DEMO 的网站,并点击下面的“Browse Website”

9..在自动打开的 Edge 浏览器地址中使用 WEB 应用账号登陆应用也可以手工输入应用的网址 http://localhost:9901

  • 登陆用户:查看 1.2 实验环境中“.net Web 应用登陆”信息

3. 实验 1 - Babelfish Compass 做迁移评估

全部打开

数据库的迁移是一项需要谨慎对待和全面考虑的工作,数据结构部分能较容易地评估迁移可行性,而更多的 SQL 程序对象如存储过程,函数,触发器等迁移则需要丰富的技术经验以及大量的时间成本才能完成。
Babelfish Compass 是一个开源工具,这个评估工具能评估 SQL Server 的 SQL/DDL 代码对 Babelfish 的支持级别。它会列出被评估的 SQL/DDL 代码中所有的 SQL 功能,还会告诉你最新版本的 Babelfish 是否支持这些功能。软件可在GITHUB页面下载,支持 Windows 和 Linux 平台,运行时需要预装 JAVA 环境。Babelfish Compass 工具和 JAVA 在此 Workshop 环境中已经下载并安装完毕,不需要其他的操作。
在第一个实验中,我们使用 Babelfish Compass 对当前的应用进行评估,熟悉如何生成评估结果并解读评估报告。完整的流程主要有以下几步:

  • 在源库(SQL Server)上生成 DDL 脚本
  • 执行 Babelfish Compass 程序生成评估报告
  • 解读并分析评估报告

1. 使用SQL Server Management Studio (SSMS) 登陆 SQL Servers

  • 选中数据库并按鼠标右键,菜单中依次选择“Tasks”→“Generate Scripts”

2. 在 Choose Objects(选择对象)页面中,选择整个数据库或特定对象。

3. 在 Set Scripting Options(设置脚本选项)页面上,选择 Save as script files(保存为脚本),同时选择 Advanced(高级)按钮

4. 在 Options 中由上至下设置以下选项:

  • Script Extended Properties – 选择 False
  • Script Logins – 选择 True
  • Script Object-Level-Permissions – 选择 True
  • Script Owner – 选择 True
  • Script Indexes – 选择 True
  • Script Triggers – 选择 True

5. 在脚本选项设置页面中点击"Next"按钮

6. 在 Summary 页面中点击"Next"按钮

7. 所有导出步骤完成后点击"Finish"按钮结束任务

8. 执行 Babelfish Compass 程序生成报告 (可拷贝 C:\Demo\lab.txt 的相关命令)

  • 进入Babelfish Compass目录:cd C:\Demo\BabelfishCompass
  • 执行命令:
    .\BabelfishCompass.bat demo-report C:\Users\Administrator\Documents\script.sql -reportoption xref
  • 命令执行后生成报告并自动打开浏览器显示报告
9. 报告解读
  • 先查看Assessment Summary(评估总结)和Object Count(对象统计)这一段显示总体情况:DDL 行数,支持和不支持的特性数量等信息,以及根据对象所列出的支持和不支持的特性数量

再查看不支持特性的描述

  • Alter table…check 启用约束语法当前不支持,默认就是启用的
  • ALTER AUTHORIZATION 语法不支持,可以直接注释屏蔽
  • SET ROWCOUNT 语法不支持,需改写

查看不支持特性涉及的具体 SQL 语句

  • 回到报告目录中,选择“X-ref: 'Not Supported' by SQL feature"

10. 根据评估报告进行相应调整

  • 对于不支持的特性,需要调整的,改写相关语句或寻找替代方法,下图显示的即为修改后的结果,在下一个实验中我们学习如何修改

通过这个实验,让我们体会到 Babelfish Compass 是一个简单易用,快捷高效的针对 Babelfish 平台迁移的评估工具,它有助我们从总体上把握迁移的复杂性和进度。对于不支持的特性,即语法或语句,我们可以尝试通过改写或寻找替代方案的方式解决。

4. 实验 2 – 应用切换到 Aurora 平台

全部打开

迁移项目中,经过前期的迁移评估和相应的代码调整及小数据量的测试后,可以启动正式的迁移过程。首先需要在目标库创建相关的 SCHEMA 及程序代码,数据的迁移可以使用 AWS Database Migration Service (AWS DMS)导入并设置 CDC 增量同步,并选择合适的时机进行数据库和应用的切换。
在这个实验中,我们使用从源库导出的包含数据的 DDL 脚本在目标库执行,并对不支持特性的部分 DDL 进行修改并应用到目标库上,最后通过修改数据库连接的方式完成整体应用的切换。

1. 使用 SQL Server Management Studio 连接 Aurora for PostgreSQL 实例

  • 点击左侧的数据库连接,连接地址请查看 stack中output的PGInstanceEndpoint 信息,登陆用户请查看 1.2 实验环境中“Aurora PostgreSQL 数据库连接”信息

2. 菜单中依次选择“File”→“Open” →“File”,打开“C:\Demo\Data\init-data”文件

3. 光标移到打开文件的最后,点击“Execute”执行

4. 执行完毕,查看执行结果有错误
错误:“'ALTER TABLE WITH [NO]CHECK ADD' is not currently supported in Babelfish.”此错误即 Babelfish Compass 评估提示的兼容性问题之一

5. 解决DDL兼容性问题

  • SQL Server 中的 WITH CHECK ADD CONSTRAINT 语句即添加一个约束,并将其应用到已存在的数据中,当前 Babelfish for Aurora PostgreSQL  不支持此语句,在保证已有数据引用正确的情况下,可去掉 WITH CHECK,同时删除启用约束的语句 ALTER TABLE .. CHECK 
  • SQL Server 中的 set rowcount 语句是在返回指定的行数之后停止处理查询,当前 Babelfish for Aurora PostgreSQL 不支持此语句,无法生效,但可编译通过。此种情况可以使用 TOP 语句改写。
6. SMSS 中打开“C:\Demo\Data\pg-fix”文件执行修改脚本

7. 修改应用配置文件 C:\web\Web.conf

  • 在 23 行修改数据库连接设置为 Aurora for PostgreSQL

8. 在 IIS 管理中重新启动 DEMO 站点并登陆测试

通过应用切换实验,让我们进一步了解应用迁移的正确步骤:首先要结合 Babelfish Compass 的评估,对不兼容特性做好修复。迁移过程中,结合 SSIS/DMS 等数据迁移工具,可以做到大数据量情况下最小化停机时间,避免影响生产业务。

5. 实验 3 – Aurora 平台的兼容性

全部打开

Babelfish 是一种扩展,它的存储库是 PostgreSQL。Babelfish 支持 T-SQL 协议、T-SQL 语言、TDS 协议等。这就使我们可以使用 T-SQL 语法对 PostgreSQL 数据库进行操作。而这个插件的最强优势就是,以最大兼容性/最小更改去迁移 MSSQL 到 PostgreSQL。
Babelfish for Aurora PostgreSQL 试图尽可能兼容 Microsoft SQL Server,但当前仍有一些限制。要了解有关这些限制的更多信息,请查看 AWS 的官方文档以获取更详细的说明:https://docs.amazonaws.cn/AmazonRDS/latest/AuroraUserGuide/babelfish-compatibility.html
在本次实验中,我们会在.net应用中调用以下存储过程,这些存储过程从 SQL Server 源库中迁移而来,除了 p_test1 有修改外,其他都没有更改。下表为过程说明:

过程名

参数

效果

说明

p_test1

数字

显示指定的记录数

如何转换不支持语法 set rowcount

p_test2

日期

判断给定时间的时段

过程中调用自定义函数

p_test3

任意

显示连接数据库信息

显示当前连接的实例信息

p_getsal

字符%

显示员工工资

显示sql server支持的货币类型数据

p_sumsal

字符%

显示部门工资汇总

显示汇总货币字段数据

p_runtimes

数字

插入数据

按次循环,1次1千条数据插入

  • p_test1 代码

• p_test2 和调用的自定义函数代码

• p_test3 代码

• p_getsal代码

• p_sumsal 代码

• p_runtimes 代码

1. 在远程桌面上打开 Edge 浏览器,输入 http://localhost:9901,登陆 Web 应用登陆后在 Web 应用的左侧选择“数据库管理”→“存储过程管理” 菜单

2. 在运行框中输入存储过程名,参数,然后点击“运行”,运行改写兼容性测试:输入 p_test1, 整数参数值,指定显示的行数

3. 运行自定义函数兼容测试:输入 p_test2, 时间日期格式参数

4. 运行后端数据连接检测:输入 p_test3,任意数值参数

5. 运行 money 字段兼容性测试:输入 p_getsal, 字符加 % 为参数

6. 运行 money 字段函数操作兼容性测试:输入 p_sumsal, 任意字符加 %

7. 运行性能测试:输入 p_runtimes, 插入执行次数

运行后显示插入记录数和执行时间

通过这个实验,使我们体会到 Babelfish for Aurora PostgreSQL 能兼容大部分的 T-SQL 代码,可以非常方便地将基于 SQL Serve 开发的应用迁移过来,迁移后的 .NET Web 应用使用功能正常,顺滑无感。对于当前不支持的某些 T-SQL 代码,可以使用改写等方式进行替换。

6. 实验 4 – 两种平台的开发模式

全部打开

随着业务的发展及应用现代化的需求,您可以选择在 Babelfish for Aurora PostgreSQL 平台的开发模式。通常来说,有以下几种开发模式:

  • 使用 SQL Server 驱动开发 T-SQL 代码
  • 使用开源驱动开发 PL/pgSQL 代码
  • 在 PostgreSQL 开发的代码,使用 SQL Server 驱动调用

在这一个实验中,首先我们在 Aurora PostgreSQL 中创建一个自定义函数,然后用 SMSS 连接到 SQL Server 中调用此函数;另外,我们在 PostgreSQL 中创建第二个自定义函数,使用 T-SQL 语法和函数,并在 PostgreSQL 中调用。通过验证这些代码是否调用执行成功,来展示不同开发模式的可行性。

1. 在远程桌面上打开 dbeaver,通过 PostgreSQL 驱动登陆 Aurora PostgreSQL

  • 连接地址请查看 stack 中 output 的 PGInstanceEndpoint 信息
  • 登陆用户请查看 1.2 实验环境中 Aurora PostgreSQL 数据库连接”信息
  • 登陆的数据库选择 babelfish_db

2. 在dbeaver的查询页面中输入以下代码,创建自定义函数 getcity()(代码可从C:\Demo\lab.txt 中拷贝)

  • 此函数返回数组为查询 dept 表的所有内容
create or replace function dbo.getcity() returns setof dbo.dept as $$ begin return query select * from dbo.dept; end; $$ language plpgsql;

3. 使用 SMSS 通过 SQL Server 驱动登陆

  • 登陆后选择 master 数据库,点击鼠标右键,打开一个新的查询
  • 注意:登陆后点击数据库时会出现以下错误,此为 Babelfish 和 SSMS 的兼容性问题,点击 ok 忽略错误即可。
  • 注意将使用的数据库更换为“demo”
  • 调用在 PostgreSQL 中创建的自定义函数 getcity(),显示执行成功 select * from dbo.getcity()

4. 打开 dbeaver,通过 PostgreSQL 驱动登陆 Aurora PostgreSQL

  • 在 dbeaver 的查询页面中输入以下代码(代码可从C:\Demo\lab.txt 中拷贝),创建自定义函数 check_date(), 此函数显示当前时间和输入的N天前的时间差
CREATE FUNCTION public.check_date("@rq" int) RETURNS int LANGUAGE pltsql AS '{"version_num": "1", "typmod_array": ["-1", "-1"], "original_probin": ""}', 'BEGIN DECLARE @h1 int set @h1 = datediff(hour,getdate()-@rq,getdate()); RETURN(@h1) END';

5. 在 Aurora PostgreSQL 中执行含有 T-SQL 函数的代码

  • select public.check_date(1) as "1 Day", public.check_date(5) as "5 Days"
执行后显示正确的结果

通过这个实验,让我们了解到 Babelfish for Aurora PostgreSQL 支持不同的开发模式:支持 SQL Server 或者 PostgreSQL 上的代码开发,也可以在 SQL Server 中调用 PostgreSQL 上开发的代码,客户可以根据业务发展需求而灵活选择。同时,这种开发模式也提供了多一种 Babelfish 不支持特性的改写方式,即使用 PostgreSQL 支持特性来开发,再在 Babelfish 中调用。

7. 清理实验环境

全部打开

完成全部实验后,需要清理相关的实验环境。清理步骤如下:

1. 在 CloudFormation 控制台的堆栈页面中,选择要删除的堆栈。该堆栈当前必须处于运行状态。在堆栈详细信息窗格中,选择 Delete (删除)

2. 在系统提示时,选择 Delete stack (删除堆栈)

3. 等待大约 10分 钟后,查看堆栈信息显示删除成功栈,此实验正式完成。

现在就开始在亚马逊云上构建

无论您是在寻找计算能力、数据库、存储、内容分发、人工智能与机器学习,大数据分析还是其他功能,亚马逊云科技都有相应的服务来帮助您建立具有更高灵活性、可扩展性和可靠性的复杂应用。

企业出海或个人体验

超过 200 项服务

包含 100 余种产品免费试用

发展中国业务

近百项服务

包含宁夏区域 30 余种产品免费试用