我正在寻找一种在本地Microsoft SQL Server到 AWS RDS PostgreSQL 之间设置连续数据复制的方法。源表每 24 小时更新一次。这里的挑战是我无法控制源(本地)数据库。我所拥有的只是一个可以用来查询数据库的数据库用户。简而言之,我正在寻找以下要求:
- 不应以任何方式修改源机器(即对源机器应用配置)
- 便宜(不需要迁移服务器 24/7 运行)且易于管理(设置一次就忘记了)
- 理想情况下,解决方案应该只迁移对源数据库表所做的更改,例如添加/删除记录。换句话说,避免清空目标表并用源表记录重新填充它(这就是 AWS DMS“ Full-Load ”会做的事情)
我正在查看 AWS DMS Ongoing Replication,但它需要更改源计算机,因此我不得不放弃该解决方案(请参阅使用 Microsoft SQL Server 数据库作为 AWS DMS 的源)。此外,该解决方案将需要一个“复制实例”来运行 24/7。
还有什么我应该看的满足上述要求的吗?或者我唯一的选择是使用“全负载”AWS DMS 迁移,如果提供源数据库表的更新频率,这可能是一种成本高昂的解决方案?
我会很感激任何关于这个问题的想法,请。
对于您可以做的一件事,这是一个非常粗略的思考过程(我确信有办法微调这个想法,我会在想到它们时继续更新),但您可以利用 MS 的一些东西SQL Server 和 AWS 可满足您的大部分需求。
按事件顺序,这是您可以采取的步骤:
可能使用SQL Server Express Edition扩展额外的 Microsoft SQL Server :该服务器将容纳一个作业,该作业将处理从您的主 MS SQL Server 提取数据并将其与您的 AWS PostgreSQL 实例进行比较,以生成更改。
SQL Server Express Edition 有很多限制,因此您必须阅读它,但它是 Microsoft SQL Server 的免费版本,因此如果您能够利用它,它会勾选便宜的复选框。如果你不能,那么一个比较便宜的替代方案是在两核服务器上使用 SQL Server Standard Edition。确保在安装 SQL Server 期间安装 Integration Services 组件(无论您选择哪个版本)。
您可以选择在 AWS、VM 或您认为合适的任何方式中进行扩展。(在 AWS 中,您可以创建一个根据需要打开和关闭此服务器的作业。)
创建一个SQL Server Integration Services项目:这将被编译成一个 SSIS 包,该包将存在于上面的服务器作业服务器上。在 SSIS 项目中,您将能够连接到您的主 Microsoft SQL Server,从源表中提取数据,然后在 AWS PostgreSQL 实例上提取表的目标副本,然后比较两个数据集变化。如何实现比较器取决于您,但 Microsoft SQL Server 中可能有用的一个功能是HASHBYTES(). 您可以散列整行并将其散列与您的 AWS PostgreSQL 实例的散列行进行比较。(我不确定 PostgreSQL 中是否有等效功能,但如果没有,那么您可以先将 PostgreSQL 的表数据导入 MS SQL 作业服务器,然后将两个数据集与 HASHBYTES 进行比较。)然后您就可以输出了已更改为目标的结果行。不幸的是,我认为您不能直接将它们输出到您的 AWS PostgreSQL 实例,因此下一步将是一个中间步骤。
向您的 SSIS 项目添加一个步骤,以将更改的行输出到作业服务器上的另一个临时表或 CSV 等原始文件。(这将由您决定如何实施,因为临时表意味着您需要利用 AWS 中更复杂的流程来提取数据。我认为 CSV 是更简单的路线,您只需要确保您为要保存到的文件设置文件共享。)
将 SSIS 项目作为包部署到 Microsoft SQL 作业服务器。然后使用SQL 代理来安排每天运行的作业以执行 SSIS 包。
在您的 AWS 云中创建一个 S3 存储桶(或替代 AWS 存储解决方案),用于将步骤 3 中的原始文件复制到其中。
创建一个计划作业,将您的原始文件从步骤 3 迁移到步骤 5 中的 S3 存储桶。这再次取决于您,并且可以通过多种方式完成,例如以下示例:
利用 AWS 开发工具包或它们提供的替代服务创建一个 AWS 作业,将您导入 S3 存储桶的文件中的数据上传到您的 PostgreSQL 实例中。我建议先将其导入 PostgreSQL 中的单独临时表(但这取决于您最终如何实现它)。(您也许可以将步骤 6 滚动到您为此步骤创建的同一作业中。)有关更多信息,请参阅此 AWS 文档:将数据导入 Amazon RDS 上的 PostgreSQL
将上述数据导入 PostgreSQL 中的临时表后,您可以(在同一作业或新作业中)从目标表中删除与临时表中的记录具有相同主键的记录。然后将临时表中的记录插入到目标表中。(虽然这在技术上是对已更新的记录执行 DELETE / INSERT,但它仍然比截断整个表并插入所有内容要好,所以我认为它应该足以满足您不进行完全加载的要求。)
实施这个过程需要做很多工作(比阅读更多:),所以如果实施的时间太多,你可以考虑只付钱给 AWS 合作公司为你实施解决方案,但那是你的决定。
在 Microsoft SQL Server 中可能需要注意的另一件事是更改数据捕获 (CDC)。这是 SQL Server 中记录表更改的过程(本质上维护数据库中每个表的事务日志表)。它可能与 SSIS 结合使用或代替 SSIS 有用,并且是 Microsoft SQL Server 的主要组件,AWS 开箱即用的 DMS 用于从 SQL Server 迁移数据。
Microsoft SQL Server 中的另一个类似组件称为临时表,它具有与更改数据捕获类似的功能(但可能较少使用)。
如果您有任何疑问,我很乐意详细说明上述粗略解决方案中的任何步骤。