本文将深入探讨如何利用 Babelfish 加速迁移,并在此过程中提及一些常见问题及其解决方法。
在讨论逐步迁移流程之前,让我们先了解 Babelfish 的架构。Babelfish 是一个迁移加速器,可以将 SQL Server 应用迁移至 Aurora PostgreSQLCompatible,且对 TSQL 代码或客户端连接驱动的更改最小。它允许用户从许可的专有本地数据库管理系统迁移至云中的开源 DBMS,为现代化铺平了道路。
Babelfish 使 PostgreSQL 可以理解为 SQL Server 编写的应用程序发送的查询。它支持 SQL Server Wire 协议和 TSQL,因此不用更换数据库驱动或重新编写所有应用程序查询。用户可以使用 SQL Server 连接库创建 TDS 连接以及标准 PostgreSQL 连接,如下图所示。
Babelfish 迁移的高层步骤如下:
使用 Babelfish Compass 工具生成 DDL 并执行分析。生成 DDL 的选项包括:使用 SQL Server Management Studio (SSMS) 导出数据库架构。从 Babelfish Compass v202308 开始,可选地直接为需要分析的 SQL Server 数据库执行 DDL 生成。
创建带有 Babelfish 扩展的 Aurora PostgreSQL 实例。
通过在 1433 端口上运行 DDL 脚本重新创建 Babelfish 架构。
使用 AWS DMS 将数据从 SQL Server 迁移至 Babelfish,并重新配置客户端应用程序以连接到 Babelfish TDS 端口而不是 SQL Server。
对于以 Babelfish 作为后端的 NET 应用程序,通常无需对应用程序代码进行修改。
接下来,我们提供从 SQL Server 迁移到 Babelfish for Aurora PostgreSQL 的详细步骤。
Babelfish Compass 是一个独立工具,支持 Windows、Mac 和 Linux,用于评估与 Babelfish 的兼容性。此工具分析 DDL 和 SQL 代码,并提供详尽的报告,列出所有受支持和不受支持的功能。
从 GitHub 下载最新版的 Babelfish Compass (zip 文件)。
解压缩文件到所需文件夹。文件夹内有三个 zip 文件。应解压缩 BabelfishCompassv202308zip。
Babelfish Compass 需要 64 位 Java/JRE 8 或更高版本;必须先安装它以运行 Compass 报告。

打开命令提示符CMD,并导航到解压缩 zip 文件的路径。
通过运行 BabelfishCompass help 验证安装。
使用 Compass v202308 或更高版本生成 DDL 的能力时非常有用,尤其是在 SQL Server 拥有多个实例或数据库的情况下。要让 Compass 执行 DDL 生成,必须指定以下命令行选项。Compass 将连接 SQL Server,生成 DDL 文件,并对生成的文件进行 Compass 分析。
选项描述sqlendpointSQL Server 的主机名或 IP 地址,可选指定端口号sqllogin连接 SQL Server 的登录名,通常应为 sysadmin 角色sqlpasswd对应的密码sqldblist可选;不指定或指定所有时,DDL 为所有用户数据库生成如果 DDL 生成持续时间过长,可以使用 CTRLC 取消该过程,并通过 SSMS 进行手动 DDL 生成,这可能会更快。
bashBabelfishCompass Northwindreport5 sqlendpoint ltendpointgt sqllogin ltlogingt sqlpasswd ltpasswordgt sqldblist Northwind optimistic reportoptions xref rewrite
如上所示的脚本生成 Babelfish Compass 报告,并默认保存到用户的 DocumentsBabelfishCompass 文件夹中。该脚本还为每个指定的数据库生成独立的 DDL 文件,存储在计算机的 TEMP 目录中。
其他生成 Compass 报告的方式是首先使用 SSMS 生成 DDL,然后运行 Babelfish Compass 命令来生成报告,详情请参见 深入了解 Babelfish Compass。
要评估整体迁移工作,首先查看报告顶部的摘要部分,其中报告了对象数量和 SQL 代码行数。这将给出应用程序的规模和所需工作量的初步印象。
接下来,专注于 SQL 功能部分摘要:不支持的功能、需手动审查的内容、语义审查、性能审查和被忽略的内容。
根据问题,可以开发可能的变通方案或通过缩减不必要的功能来降低迁移范围。缩减过程需要开发人员与应用程序所有者之间的协作。当我们在命令中使用 Optimistic 选项时,一些命令将列为被忽略,而不是不支持。如果未使用 Optimistic 子句生成报告,则下列特征将被报告为不支持。在使用乐观设置生成北风模式下的报告时,没有不受支持的功能。
创建 Babelfish 集群与创建 Aurora PostgreSQL 集群非常相似,但我们需要在 引擎版本 下展开过滤选项,并选择 显示支持 Babelfish for PostgreSQL 功能的版本。建议选择具有最新功能和性能改进版本的 Aurora PostgreSQL 最新主要发布版本。
在创建 Babelfish 集群时,可以选择使用单个迁移的 TSQL 用户数据库或多个迁移的 TSQL 用户数据库。如果指定 singledb,则只能在 Babelfish 中创建一个 TSQL 数据库,TSQL 架构将在 Babelfish 数据库中作为常规 PostgreSQL 架构创建。在多数据库模式下,用户数据库的架构名称在 PostgreSQL 中访问时变为 dbnameschemaname。在 TSQL 中访问时,架构名称保持不变。有关详细信息,请参见 使用 Babelfish 进行单个数据库或多个数据库。
我们建议在迁移模式中使用 multidb,因为这为 Babelfish 集群中的多个 TSQL 用户数据库提供了支持。创建集群后,就无法更改此值,因此即使最初仅需要一个 TSQL 用户数据库,拥有灵活性也是更好的选择。
为更接近 SQL Server,您可以选择 sa 作为主用户名。
创建 Babelfish 集群后,它将提供两个端点,一个用于读取,一个用于写入,并支持 PostgreSQL 和 TSQL 在不同端口的访问。
下一步是与 Babelfish 集群建立连接,并使用 SQL Server Management Studio (SSMS) 在新数据库中创建架构。SSMS 是一个基于 GUI 的客户端工具,用于连接 SQL Server,并具有有限的对象资源管理器支持以查看和编写对象。
输入 Babelfish 端点集群和凭据,然后选择 连接。
要在 Babelfish 中重新创建架构,请按照以下步骤操作:
使用以下查询检查 Babelfish 及 Aurora PostgreSQL 版本:sql 检查您的版本SELECT SERVERPROPERTY(babelfishversion) AS BabelfishVersion auroraversion() AS AuroraPostgreSQLVersion @@VERSION AS ClassicSQLServerVersionGO
配置 Babelfish 转义阀门以允许忽略 Babelfish 尽可能模仿 SQL 的控制流和事务状态行为。当 Babelfish 遇到错误时,它将返回与 SQL Server 错误代码相似的错误代码。为处理可能失败的语句,Babelfish 定义了一些称为转义阀门的选项。转义阀门是指当 Babelfish 遇到不受支持的功能或语法时,定义其行为的选项。使用以下语句将所有转义阀门设置为忽略严格行为:sqlEXECUTE spbabelfishconfigure ignore serverGO
创建 Northwind 数据库并使用 TSQL 目录视图进行验证:sql TSQL 目录视图显示数据库SELECT FROM sysdatabasesGO
检查 Babelfish 和 PostgreSQL 之间的架构映射,这些信息对为数据加载创建 DMS 任务非常重要。sqlSELECT pgdbname AS BabelfishDBName beorigname AS SchemaName pgnspname AS PGSchemaNameForDMS pgoid SCHEMAID(beorigname) AS MapsToPGOIDFROM syspgnamespaceext AS pgINNER JOIN sysbabelfishnamespaceext AS be ON pgnspname = benspnameWHERE dbname = DBNAME()ORDER BY SchemaName
根据所选的 multidb 或 singledb 配置,您将看到不同的结果,因为 PostgreSQL 在这两种选项中内部映射数据库和架构名称的方式不同。
将最终脚本运行在 Babelfish 中创建架构对象。Babelfish 目前支持使用 BYTEA 数据类型通过 DMS 迁移 BINARY、VARBINARY 和 IMAGE 数据类型。对 Northwind 数据库脚本进行修改,将任何 IMAGE 数据类型更改为 BYTEA。在原始 Northwind 数据库中,类别表 Picture 列使用 IMAGE 数据类型,员工表 Photo 列也使用 IMAGE 数据类型。在最终脚本中,查找并替换如下:
sql[image] with [bytea] / [image] /
运行仅带有主键和唯一键的表脚本,这会加速数据加载过程,在数据加载完成后可以创建附加索引和约束。使用以下脚本验证在上一步中创建的表:
sql 使用 TSQL 视图 SELECT FROM systables
飞鱼加速npv官网AWS DMS 版本 351 提供了对 Aurora PostgreSQL 和 Babelfish 的更好数据类型支持。以下是如何开始使用 DMS 的 SQL Server 源和 Aurora PostgreSQL 目标端点。
在 AWS DMS 控制台中创建一个复制实例,根据您的工作量选择实例大小。创建 源和目标端点。 源端点 源端点指向 SQL Server。目标端点 Aurora PostgreSQL 目标端点 是迁移数据到 Babelfish 的优选方式。在使用 AWS DMS 控制台、API 或 CLI 命令创建目标端点时请注意以下事项:
将目标引擎指定为 Amazon Aurora PostgreSQL数据库命名为 babelfishdb。在 端点设置 部分,添加设置以将 DatabaseMode 设置为 Babelfish 并将 BabelfishDatabaseName 设置为目标 Babelfish TSQL 数据库的名称。注意:如果您使用的是较早的 Aurora PostgreSQL 与 Babelfish 版本,则不要使用这些端点设置。创建并启动复制任务,以加载目标数据库中所需的表。有关将 Babelfish 作为 AWS DMS 端点的更多信息,请参见 使用 Babelfish 作为 AWS 数据库迁移服务的目标。此处为迁移北风数据库的任务设置:
目标表准备 “不执行任何操作”。在此模式下,AWS DMS 将不会对目标数据库进行任何更改。您应选择完整 LOB 模式以充分利用 DMS 351 与 Babelfish 320 及 250 发布版本的新功能。
表映射规则 添加以下规则以包括 dbo 架构中所有表,其中架构名称类似于 ‘dbo’ ,源表名称类似于 ‘’ 或您源 SQL Server 数据库中的特定表。
转换规则 根据 multidb 或 singledb 配置,可能需要的转换规则如下:
如果使用 multidb 模式,则将 dbo 架构重命名为与 PostgreSQL 架构相匹配,即 northwinddbo。对于这两种模式,将表重命名为小写。查看表统计信息以确认数据加载准确性。在 DMS 复制任务成功完成后,可以查看表统计信息。
也可以通过运行查询验证数据。
sqlSELECT TOP 10 FROM categories ORDER BY [CategoryID]
大多数应用程序可以正常使用 BYTEA,但如有需要将其更改回 IMAGE,可使用以下脚本添加一个新的 IMAGE 数据类型列,然后复制数据,删除原始列,最后重命名为匹配原始列名。
sqlALTER TABLE [dbo][Categories] ADD [PictureImage] IMAGE NULLUPDATE [dbo][Categories]SET [PictureImage] = [Picture]
sqlSELECT[CategoryID] CASE WHEN CAST( [Picture] AS Image ) = [PictureImage] THEN Match ELSE No Match END AS [Compare]FROM [dbo][Categories]
sqlALTER TABLE [dbo][Categories] DROP COLUMN [Picture] 重命名列
EXEC sprename categoriespictureimage Picture COLUMN
在从 DMS 加载数据后,重置 IDENTITY 列。在 SQL Server 中,通常会使用 IDENTITY 列实现主键或其他需要自增值的列。在迁移到使用 IDENTITY 列或 SERIAL 数据类型的 PostgreSQL 后,使用以下脚本重置 PostgreSQL 中的序列对象:
sql 以下 TSQL 查询生成语句以播种相关序列对象。
USE NorthwindGO
DECLARE @schemaprefix NVARCHAR(200) =
IF currentsetting(babelfishpgtsqlmigrationmode) = multidb SET @schemaprefix = dbname()
SELECT SELECT setval(pggetserialsequence( @schemaprefix schemaname(tablesschemaid) tablesname ) (select max( columnsname ) from schemaname(tablesschemaid) tablesname ))FROM systables tablesJOIN syscolumns columns ON tablesobjectid = columnsobjectidWHERE columnsisidentity = 1
UNION ALL
SELECT SELECT setval(pggetserialsequence( @schemaprefix tableschema tablename columnname )(select max( columnname ) from tableschema tablename ))FROM informationschemacolumnsWHERE columndefault LIKE nextval(
前述查询生成的语句将在 Northwind 数据库中运行:
sql 生成的语句SELECT set
电话:13594780107
联系人:周经理
邮箱:addictive@hotmail.com
网址:https://www.ghcyd.com
地址:泉州市刊舌入口209号