AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 279906
Accepted
Georgi Koemdzhiev
Georgi Koemdzhiev
Asked: 2020-11-19 08:27:25 +0800 CST2020-11-19 08:27:25 +0800 CST 2020-11-19 08:27:25 +0800 CST

如何在不重新配置源计算机的情况下设置从本地 MS SQL 服务器到 AWS RDS 上的 PostgreSQL 的连续数据库复制?

  • 772

我正在寻找一种在本地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 迁移,如果提供源数据库表的更新频率,这可能是一种成本高昂的解决方案?

我会很感激任何关于这个问题的想法,请。

sql-server postgresql
  • 1 1 个回答
  • 1605 Views

1 个回答

  • Voted
  1. Best Answer
    J.D.
    2020-11-19T17:27:40+08:002020-11-19T17:27:40+08:00

    对于您可以做的一件事,这是一个非常粗略的思考过程(我确信有办法微调这个想法,我会在想到它们时继续更新),但您可以利用 MS 的一些东西SQL Server 和 AWS 可满足您的大部分需求。

    按事件顺序,这是您可以采取的步骤:

    1. 可能使用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 中,您可以创建一个根据需要打开和关闭此服务器的作业。)

    2. 创建一个SQL Server Integration Services项目:这将被编译成一个 SSIS 包,该包将存在于上面的服务器作业服务器上。在 SSIS 项目中,您将能够连接到您的主 Microsoft SQL Server,从源表中提取数据,然后在 AWS PostgreSQL 实例上提取表的目标副本,然后比较两个数据集变化。如何实现比较器取决于您,但 Microsoft SQL Server 中可能有用的一个功能是HASHBYTES(). 您可以散列整行并将其散列与您的 AWS PostgreSQL 实例的散列行进行比较。(我不确定 PostgreSQL 中是否有等效功能,但如果没有,那么您可以先将 PostgreSQL 的表数据导入 MS SQL 作业服务器,然后将两个数据集与 HASHBYTES 进行比较。)然后您就可以输出了已更改为目标的结果行。不幸的是,我认为您不能直接将它们输出到您的 AWS PostgreSQL 实例,因此下一步将是一个中间步骤。

    3. 向您的 SSIS 项目添加一个步骤,以将更改的行输出到作业服务器上的另一个临时表或 CSV 等原始文件。(这将由您决定如何实施,因为临时表意味着您需要利用 AWS 中更复杂的流程来提取数据。我认为 CSV 是更简单的路线,您只需要确保您为要保存到的文件设置文件共享。)

    4. 将 SSIS 项目作为包部署到 Microsoft SQL 作业服务器。然后使用SQL 代理来安排每天运行的作业以执行 SSIS 包。

    5. 在您的 AWS 云中创建一个 S3 存储桶(或替代 AWS 存储解决方案),用于将步骤 3 中的原始文件复制到其中。

    6. 创建一个计划作业,将您的原始文件从步骤 3 迁移到步骤 5 中的 S3 存储桶。这再次取决于您,并且可以通过多种方式完成,例如以下示例:

    • AWS SFTP 托管服务
    • AWS REST API
    • 使用您选择的编程语言的 AWS 开发工具包
    • AWS CLI 或他们提供的任何其他替代方案
    • 另一种非 AWS 解决方案(以编程方式等)
    1. 利用 AWS 开发工具包或它们提供的替代服务创建一个 AWS 作业,将您导入 S3 存储桶的文件中的数据上传到您的 PostgreSQL 实例中。我建议先将其导入 PostgreSQL 中的单独临时表(但这取决于您最终如何实现它)。(您也许可以将步骤 6 滚动到您为此步骤创建的同一作业中。)有关更多信息,请参阅此 AWS 文档:将数据导入 Amazon RDS 上的 PostgreSQL

    2. 将上述数据导入 PostgreSQL 中的临时表后,您可以(在同一作业或新作业中)从目标表中删除与临时表中的记录具有相同主键的记录。然后将临时表中的记录插入到目标表中。(虽然这在技术上是对已更新的记录执行 DELETE / INSERT,但它仍然比截断整个表并插入所有内容要好,所以我认为它应该足以满足您不进行完全加载的要求。)

    实施这个过程需要做很多工作(比阅读更多:),所以如果实施的时间太多,你可以考虑只付钱给 AWS 合作公司为你实施解决方案,但那是你的决定。

    在 Microsoft SQL Server 中可能需要注意的另一件事是更改数据捕获 (CDC)。这是 SQL Server 中记录表更改的过程(本质上维护数据库中每个表的事务日志表)。它可能与 SSIS 结合使用或代替 SSIS 有用,并且是 Microsoft SQL Server 的主要组件,AWS 开箱即用的 DMS 用于从 SQL Server 迁移数据。

    Microsoft SQL Server 中的另一个类似组件称为临时表,它具有与更改数据捕获类似的功能(但可能较少使用)。

    如果您有任何疑问,我很乐意详细说明上述粗略解决方案中的任何步骤。

    • 1

相关问题

  • 存储过程可以防止 SQL 注入吗?

  • 死锁的主要原因是什么,可以预防吗?

  • PostgreSQL 中 UniProt 的生物序列

  • 如何确定是否需要或需要索引

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve