从 SQL Server 到 Babelfish 进行 Aurora PostgreSQL 迁移的客户端 T-SQL 评估

适用于 Aurora PostgreSQL 的 Babelfish 是亚马逊 Aurora PostgreSQL 兼容版 的一项功能, 它为 PostgreSQL 添加了一个端点,该端点可以理解 SQL Server 有线协议表数据流 (TDS),以及来自为微软 SQL Server 编写的客户端应用程序的常用 T-SQL 语句。 从旧版 SQL Server 数据库迁移可能既耗时又占用资源。将数据库迁移到兼容 Amazon Aurora PostgreSQL 的版本时,您可以使用 亚马逊云科技 架构 转换工具 ( 亚马逊云科技 SCT) 自动迁移数据库架构 ,并使用 亚马逊云科技 数据库迁移服务 (亚马逊云科技 DMS) 自动迁移数据,但大部分精力、时间、成本和风险都集中在迁移客户端应用程序逻辑上。迁移应用程序逻辑通常需要重写大量代码以使用不同的接口,重构其他代码以处理语义差异,有时还需要重新设计代码,因为大量使用了旧版数据库提供商的专有功能。

有了 Babelfish,兼容 Aurora PostgreSQL 的版本可以理解 T-SQL ,即微软 SQL Server 的 SQL 方言,并支持相同的通信协议,因此最初为 SQL Server 编写的应用程序可以在很少或根本不更改 T-SQL 代码的情况下使用 Aurora。尽管 Babelfish 有助于减少修改客户端应用程序并将其移至 Aurora 所需的工作量,但需要进行适当的分析以确定更改范围。

在这篇文章中,我们将向您展示如何评估客户端应用程序中的 T-SQL 查询,以评估 SQL Server 到 Babelfish 迁移的复杂性。

Babelfish 架构概述

有了 Babelfish,兼容 Aurora PostgreSQL 的版本可以同时支持 Postgres PL/pgSQL 和 T-SQL。Babelfish 实例是双语的,在一个集群中同时使用协议和语言。您的客户端应用程序可以直接连接到 TDS 端点并使用 T-SQL。它还可以与 PostgreSQL 端点通信并使用 Pl/pgSQL。对 T-SQL 的支持包括 SQL 方言、游标、目录视图、数据类型、触发器、存储过程和函数等元素。这样,你可以将旧版应用程序基本保持用 T-SQL 编写的原样。如果需要,也可以在 T-SQL 中进行新的开发。随着时间的推移,你可以选择逐步迁移到 PostgreSQL。

下图显示了 Babelfish 架构的概述。

Babalefish Architecture

解决方案概述

Babelfish Compass 是 Babelfish 的 PostgreSQL 兼容性评估工具。使用 Babelfish Compass,你可以快速分析 T-SQL 数据定义语言 (DDL)、 数据操作语言 (DML) 和 SQL 代码,以识别与 Babelfish for PostgreSQL 不兼容的 SQL 功能。进行分析的原因是收集信息,以帮助您决定是否应该启动从 SQL Server 到 Babelfish 的迁移项目。Babelfish Compass 会生成一份评估报告,其中详细列出了你的 SQL/DDL 代码中的所有 SQL 功能,以及 Babelfish 是否支持这些功能。

请注意,Babelfish Compass 是一款独立工具,不存储任何机密或敏感信息。存储的所有信息都源自您作为输入提供的 SQL/DDL 脚本。尽管 Babelfish Compass 是 Babelfish 产品的一部分,但在技术上它与 Babelfish 本身以及 Babelfish 代码是分开的,并且位于单独的 GitHub 存储库中。

提取 DDL 和 DML 进行分析

Babelfish Compass 的使用通常从为分析的 SQL Server 脚本创建评估报告开始。但是,您首先需要从 SQL Server 数据库中提取 DDL 和 DML 以供 Compass 进行分析。

要从 SQL Server 数据库中提取 DDL,你可以使用 SQL Server 客户端工具,例如 微软 SQL Server 管理工作室 (SSMS)。无论使用哪种工具,我们都建议您分两个阶段导出 SQL Server DDL:

  1. 为没有外键、索引和约束的表生成 DDL。
  2. 为其他对象(例如视图和存储过程)生成 DDL。

有关从 SQL Server 实例中提取 DDL 的更多信息,请参阅 使用 SQL Server 管理工作室 (SSMS) 迁移到 Babelfish

捕获 T-SQL 查询

除了服务器端 DDL,我们还需要在数据库迁移期间考虑客户端 SQL 查询。通过使用 SQL Server Profiler 捕获客户端 T-SQL 查询,Babelfish Compass 可以从捕获的文件中提取查询并对其进行评估。

要使用 SQL Server P rofiler 捕获 T- SQL 语句 ,请执行以下步骤:

  1. 在 SQL Server Profiler 的 “ 跟踪属性 ” 下 ,使用 tsql_Replay 模板。

Trace Properties Dialog Box

  1. 在 SQL Server Profiler 中启动跟踪。
  2. 针对要迁移到 Babelfish 的 SQL Server 数据库运行客户端应用程序。
  3. 捕获完客户端应用程序的 T-SQL 后,通过选择 “另存为并 跟踪 XML 文件以供重播” 来 保存 捕获的结果(在 SQL Server Profiler 中)。

这将创建一个包含捕获的 SQL 查询的 XML 文件。

SQL Server Profiler Utility

  1. 选择 “ 保存”

Save Dialog Box

  1. 使用上一步中创建的 XML 文件作为输入运行 Babelfish Compass,然后指定命令行选项-importfmt mssqlProfilerXML。

有关 BabelfishCompass.bat 支持的各种命令行选项的详细信息,请参阅 Babelfish Compass 用户指南

  1. 从命令行导航到 Babelfish 脚本的位置。在我们的示例中,Babelfish Compass 版本为 v2022-12,安装路径为 c:\BabelfishCompass.
  2. 使用相应的参数运行 BabelfishCompass.bat。以下代码显示了该命令及其输出:
C:\BabelfishCompass_2022_12>BabelfishCompass.bat MyReport -importfmt MSSQLProfilerXML c:\temp\MyCapture.xml
Babelfish Compass v.2022-12, December 2022
Compatibility assessment tool for Babelfish for PostgreSQL
Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.

Reading BabelfishFeatures.cfg
Latest Babelfish version supported: 2.3.0: BabelfishFeatures.cfg
Creating user configuration file C:\Users\Administrator\Documents\BabelfishCompass\BabelfishCompassUser.cfg
Creating C:\Users\Administrator\Documents\BabelfishCompass
Creating C:\Users\Administrator\Documents\BabelfishCompass\MyReport

Run starting               : 01-Feb-2023 15:27:53 (Windows)
BabelfishFeatures.cfg file : v.2.3.0, Dec-2022
Target Babelfish version   : v.2.3.0
Command line arguments     : MyReport -importfmt MSSQLProfilerXML
Command line input files   : c:\temp\MyCapture.xml
User .cfg file (overrides) : C:\Users\Administrator\Documents\BabelfishCompass\BabelfishCompassUser.cfg
QUOTED_IDENTIFIER default  : ON
Report name                : MyReport
Report directory location  : C:\Users\Administrator\Documents\BabelfishCompass\MyReport 
Session log file           : C:\Users\Administrator\Documents\BabelfishCompass\MyReport\log\session-log-MyReport-bbf.2.3.0-2023-Feb-01-15.27.53.html

Importing c:\temp\MyCapture.xml, for application 'MyCapture'
Detected encoding 'UTF-16' for input file c:\temp\MyCapture.xml
Using input file format 'MSSQLProfilerXML'
Writing extracted SQL queries to
‘C:\Users\Administrator\Documents\BabelfishCompass\MyReport\extractedSQL\MyCapture.xml.extracted.sql’
Performing de-duplication of extracted batches...
Duplicate batches removed: 78
De-duplicated batches remaining: 13
Analyzing C:\Users\Administrator\Documents\BabelfishCompass\MyReport\extractedSQL\MyCapture.xml.extracted.sql, for application 'MyCapture'; #batches/lines: 13/175

Generating report C:\Users\Administrator\Documents\BabelfishCompass\MyReport\report-MyReport-bbf.2.3.0-2023-Feb-01-15.27.54.html.....................

--- Run Metrics ----------------------------------------------------------------
Run start            : 01-Feb-2023 15:27:53
Run end              : 01-Feb-2023 15:27:54
Run time             : 1 seconds
#Lines of SQL        : 183  (183 lines/sec)
SQL rewrite oppties  : 0
Batches extracted    : 91
Duplicates removed   : 78
Session log          : C:\Users\Administrator\Documents\BabelfishCompass\MyReport\log\session-log-MyReport-bbf.2.3.0-2023-Feb-01-15.27.53.html
Assessment report    : C:\Users\Administrator\Documents\BabelfishCompass\MyReport\report-MyReport-bbf.2.3.0-2023-Feb-01-15.27.54.html
================================================================================

Babelfish Compass 提取 SQL 批次并将其保存到 ExtractedSQL 目录下的文件中。在此示例中,MyCapture.xml 文件保存到 extractedSql/mycapture.xml.extracted.SQL。

Windows Explorer window showin the extracted SQL file

由于捕获的 SQL 通常包含几个相似的语句,这些语句仅在查找键的值上有所不同,因此默认情况下,Compass 会在分析之前对捕获的 SQL 进行重复数据删除。重复数据删除是通过屏蔽所有字符串/数字/十六进制常量的值来执行的。

要禁止重复删除,请指定命令行选项-nodedup。

捕获 SQL 服务器扩展事件

除了分析 SQL Server Profiler 的输出外,Compass 还支持处理通过扩展事件捕获的查询。

要使用 SQL Server 扩展事件捕获 SQL 语句,请完成以下步骤:

  1. 针对 SQL Server 数据库运行客户端应用程序。
  2. 使用 SQL 服务器扩展事件来捕获 SQL 查询。
  3. 将捕获的事件从.xel 文件中提取为包含 ... XML 文档的.xml 文件。

请注意,Compass 无法处理.xel 文件。

以下代码显示了将.xel 文件中的数据提取为 XML 格式的方法之一。您可以将以下查询的输出保存到.xml 文件中。在此示例中,我们已将其保存到 ClientQueries.xml:

select cast(event_data as XML) as event_data
from sys.fn_xe_file_target_read_file('C:\Temp\ClientQueries2_0_133198429586980000.xel', null, null, null)
  1. 使用 XML 文件作为输入运行 Babelfish Compass,然后指定命令行选项 — importfmt extendedEventsXML。

例如:

C:\BabelfishCompass_v.2022-12>BabelfishCompass MyExtEventsReport 

C:\temp\ClientQueries.xml -importfmt extendedEventsXML

查看评估报告

创建报告后,Babelfish Compass 会自动执行以下操作:

  • 在存储报告文件的目录中打开资源管理器窗口
  • 在默认浏览器中打开生成的评估报告
  • 将报告文件的完整路径名打印到 stdout

Assessment Report

或者,您可以生成其他交叉引用报告,以获取有关不支持的功能的详细信息。

您应该与应用程序所有者讨论 Babelfish Compass 评估的结果,并在要迁移的应用程序的背景下解释调查结果。在这些讨论中,通过识别应用程序中不需要迁移的过时或冗余部分,也许可以缩小迁移范围。

使用显示 SQL/DDL/DML 代码中不支持的 SQL 功能的评估结果来确定是否是启动 Babelfish 迁移项目的合适时机。如果认为当前版本的 Babelfish 与相关应用程序不够兼容,我们建议在 Babelfish 的未来版本可用时重新运行分析,这将提供更多功能。

如果继续进行迁移,请修改 SQL/DDL/DML 脚本或删除报告为不支持或需要审查的 SQL/DDL/DML 语句。然后调用针对 Babelfish 的 SQL/DDL/DML 脚本(使用 sqlcmd),在 Babelfish 中重新创建架构。

请记住,Babelfish 迁移涉及的不仅仅是服务器端 SQL/DDL 代码,例如,它还包括与其他系统的接口,例如 ETL 或 ELT、SSIS 或 SSRS、复制工具等。这些方面可能不会反映在 Babelfish Compass 提供的服务器端视图中。

结论

在这篇文章中,我们演示了如何在客户端应用程序中捕获和评估 T-SQL 代码。我们使用 SQL Server Profiler 从客户端应用程序中捕获了 T-SQL,并将其传递给 Babelfish Compass 以执行 Babelfish 兼容性评估。该评估会生成一份详细报告,其中包含 Babelfish 上支持和不支持的 SQL Server 功能。我们建议在生产部署之前在测试或开发环境中测试这个完整的解决方案。

在评论部分留下任何想法或问题。


作者简介

Aruna Gangireddy 是 亚马逊云科技 专业服务的顾问,在使用不同的微软技术方面拥有大约 19 年的经验。她的专长是 SQL Server 和其他数据库技术。Aruna 在在 亚马逊云科技 上运行 Microsoft 工作负载以及支持客户在 onprem 和 亚马逊云科技 云之间进行同构和异构迁移方面拥有深厚的 亚马逊云科技 知识和专业知识。

Jeevan Shetty 是 亚马逊云科技 专业服务团队的高级数据库顾问。他一直在支持和支持客户将其数据库从 OnPrem 数据中心迁移到 亚马逊云科技 云,还支持客户从商用数据库引擎迁移到亚马逊的开源数据库。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。