单向数据库同步

2024-04-02

经常需要将一个数据库中的主表中的数据同步到其他数据库(通常位于其他服务器上)中的克隆表。例如,考虑这样一种情况:后端系统管理库存数据,并且库存数据最终必须推送到作为网站应用程序一部分的一个或多个数据库。

后端系统中的源数据高度规范化,有数十个表和外键约束。它是一个精心设计的OLTP RDBMS系统。许多相关表包含数百万行。需要定期将此数据推送到其他数据库。尽可能频繁;延迟是可以容忍的。最重要的是,后端和远程数据库的最大正常运行时间至关重要。

我正在使用 SQL Server,熟悉更改跟踪、行版本、触发器等。我知道 Microsoft 针对这些场景大力推动复制、SyncFx 和 SSIS。然而,供应商的白皮书和概述推荐的技术与解决方案的实际实施、部署和维护之间存在很大差异。在 SQL Server 领域,复制通常被视为交钥匙解决方案,但我正在尝试探索替代解决方案。 (有人担心复制难以管理,难以更改架构,并且如果需要重新初始化,关键系统将会出现大量停机时间。)

有很多陷阱。由于大量表之间存在复杂的外键关系,因此确定执行捕获或应用更新的顺序并非易事。由于唯一索引,两行可能会以这样的方式互锁,以至于一次行更新甚至无法工作(需要在最终更新之前对每行执行中间更新)。这些不一定是表演障碍,因为唯一索引通常可以更改为常规索引,并且可以禁用外键(尽管禁用外键是非常不可取的)。通常,您会听到“仅”使用 SQL 2008 更改跟踪和 SSIS 或 SyncFx。这样的回答确实没有反映实际困难。 (当然,客户确实很难理解复制数据为何如此困难,从而使困难的情况变得更糟!)

这个问题最终是非常普遍的:对许多具有大量行的高度相关的数据库表执行单向同步。几乎每个涉及数据库的人都必须处理此类问题。白皮书很常见,实用的专业知识很难找到。我们知道这可能是一个困难的问题,但工作必须完成。让我们听听什么对您有用(以及应该避免什么)。讲述您使用 Microsoft 产品或其他供应商产品的体验。但是,如果您个人没有使用大量密切相关的表和行对解决方案进行过实际测试,请不要回答。让我们保持实用性——而不是理论性。


最好在 serverfault.com 上询问(我无法发表评论,脚本已损坏,所以我必须发布完整的答案)

更新:(切换到 Safari,脚本再次工作,我可以正确发布)

没有灵丹妙药。为了易于使用和“一键式”部署,没有什么比复制更好的了。是唯一涵盖的解决方案deeply冲突检测和解决,支持推送模式更改,并附带一套用于设置和监控模式的全面工具。在这个“议程”被 .Net 群体接管之前,它多年来一直是 MS 数据同步的典型代表。我认为复制有两个根本问题:

  • 用于推动变革的技术原始、缓慢且不可靠。它需要文件共享来启动副本,并且依赖于 T-SQL 来实际复制数据,从而导致各种可扩展性问题:复制线程使用服务器工作线程,并且它们与任意表和应用程序查询交互,从而导致阻塞和僵局。我听说过的最大部署约为 400-500 个站点,由超人 MVP 和顶级顾问完成。这使许多项目停止了轨道start1500 个站点(远远超出了最大的已部署复制项目)。我很想知道我是否错了,并且您知道部署了 500 多个站点的 SQL Server 复制解决方案。
  • 复制比喻过于以数据为中心。它没有考虑分布式应用程序的要求:需要版本化和形式化的合同、数据的自治性”fiefdoms http://msdn.microsoft.com/en-us/magazine/cc164125.aspx',与可用性和安全性观点的松散耦合。因此,基于复制的解决方案解决了“使数据可用”的迫切需求,但未能解决“我的应用程序需要与您的应用程序对话”的真正问题。

另一方面,您将找到真正解决应用程序通信问题的解决方案,例如基于排队消息传递的服务。但要么速度慢得令人痛苦,要么充满了源于通信机制(Web 服务和/或 msmq)与数据存储(comm 和 db 之间的 DTC 事务、没有常见的高​​可用性故事、没有常见的可恢复性故事等)分离的问题。解决方案是MS 堆栈中速度极快且与 DB 完全集成 http://msdn.microsoft.com/en-us/library/ms166043(SQL.90).aspx,但没有人知道如何使用它们。在这些和复制之间的某个地方,您会发现各种中间解决方案,例如 OCS/Synch 框架和基于 SSIS 的自定义解决方案。没有一个能够提供复制设置和监控的便利性,但它们可能会扩展并表现得更好。

我参与了几个需要大规模“数据同步”的项目(+1200 个站点、+1600 个站点),我的解决方案是将问题转向“应用程序通信”问题。一旦思维方式改变,数据流不再被视为“带有表 Y 的键 X 的记录”,而是“传达客户 Y 购买商品 X 的消息”,解决方案将变得更容易理解和应用。您不再考虑“按 X-Y-Z 顺序插入记录,以免破坏 FK 关系”,而是考虑“按照消息 XYZ 的描述处理购买”。

在我看来,复制及其衍生产品(即数据跟踪和数据报传送)是植根于 80 年代技术和数据/应用程序视图的解决方案。过时的恐龙(并且绝不会变成鸟类)。

我知道这甚至还没有开始解决您所有的(非常合法的)担忧,但是写出我对这个主题的所有要说/咆哮/咆哮将填满大量平装本......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单向数据库同步 的相关文章

  • Spring Batch 死锁 - 无法增加身份;嵌套异常是 com.microsoft.sqlserver.jdbc.SQLServerException

    我们正在将 Spring Batch 应用程序从 Oracle DB 迁移到 Azure SQL Server 我在尝试执行时收到以下错误两个不同的工作同时更新不同的表 但使用相同的公共 BATCH 表 引起原因 org springfra
  • 将 MSSQL 中用于 Web 制图的投影(Leaflet、Openlayer、OpenStreetMaps、GoogleAPI...)更改为 WSG48 或任何其他格式

    我在 MSSQL 服务器中有一些像这样的 WKT WKB 数据 并希望借助 leaflet Openlayer OpenStreetMaps 或 GoogleAPI 将它们显示在地图上 我的数据如下所示 POLYGON 1736946 09
  • TSQL - 生成文字浮点值

    我理解比较浮点数时遇到的许多问题 并对它们在这种情况下的使用感到遗憾 但我不是表格作者 只有一个小障碍需要克服 有人决定使用浮点数 就像您期望使用 GUID 一样 我需要检索具有特定浮点值的所有记录 sp help MyTable Colu
  • 使用 MS Access 链接表连接到 SQL Server 后端时是否可能发生 SQL 注入

    我一直在对此进行一些研究 但到目前为止还是一片空白 情况是这样的 我正在开发一个链接到 SQL Server 后端的 MS Access 前端 我在某种程度上使用 Access 中的链接表 表单访问 SQL DB 这样 当用户更新表单中的值
  • 自动删除主键序列中的间隙

    我正在创建一个网页 该网页根据用户操作将数据存储到 MySQL 数据库中 数据库有很多行 行的主键是列 rowID 它只是按顺序对行进行编号 例如 1 2 3 4 用户可以选择删除行 问题是当用户删除最后一行以外的行时 rowID 中有一个
  • 计算 mysql 数据库行数的最佳方法

    在遇到 mysql 查询加载时间慢的问题后 我现在正在寻找计算行数的最佳方法 我曾经愚蠢地使用过mysql num rows 函数来做到这一点 现在意识到这是最糟糕的方法 我实际上正在制作一个分页来用 PHP 制作页面 我找到了几种计算行数
  • theta 连接、等值连接和自然连接之间的区别

    当涉及到 theta 连接 等值连接和自然连接时 我无法理解关系代数 有人可以帮助我更好地理解它吗 如果我在 theta 连接上使用 符号 它与使用自然连接完全相同吗 A 西塔加入允许任意比较关系 例如 An equijoin是使用相等运算
  • SQL Server - 将行连接到逗号分隔的列表中

    假设我有一个临时表 如下所示 Id Value 1 1 1 2 1 3 2 1 2 2 我希望我的桌子是这样的 Id ValueList 1 1 2 3 2 1 2 所以基本上我需要将我的值分组为逗号分隔的列表 我已经尝试过以下操作 SEL
  • SQL Server 中高效的字符串后缀搜索?

    我想找到与谓词匹配的所有行MyColumn LIKE FooBar 但通过使用索引查找而不是扫描 一种方法本质上是创建 MyColumn 的反向版本并搜索反向模式 ooF 在该列上 在反向列上有一个常规索引 然而 我不喜欢手动创建这个反向列
  • 从对象定义生成数据库表

    我知道有几种 自动 方法可以创建数据访问层来操作现有数据库 LINQ to SQL Hibernate 等 但我有点厌倦了 我相信应该有更好的做事方式 比如 在 Visio 中创建 更改表 使用 Visio 的 更新数据库 创建 更改数据库
  • SQL Server:为什么 ISO-8601 格式的日期依赖于语言?

    我需要一些帮助来理解 SQL Server 中的日期格式处理 如果您尝试以下操作 它将返回正确的结果 SET LANGUAGE English SELECT CAST 2013 08 15 AS DATETIME 2013 08 15 00
  • mysql表中的数据非常大。即使 select 语句也需要很多时间

    我正在开发一个数据库 它是一个相当大的数据库 有 13 亿行和大约 35 列 这是我检查表状态后得到的结果 Name Table Name Engine InnoDB Version 10 Row format Compact Rows 1
  • 使用存储过程中的 Select 查询将单个变量分配给多行

    我的查询是使用 Select 将单个变量分配给多行 存储过程中的查询 例如 我从 Employee 表中获取 10 个 比如 1 到 10 个员工 ID 声明 id int select id EmpId from Employee sel
  • 插入具有只读主键列的表

    我正在使用一个使用 sql server 数据库的应用程序 我试图在表中插入一行 如下所示 该表有一个主键 prodNum 这是自动生成的密钥 当我尝试向表中插入一行时 如下所示 在行中intResult oSglProdTableAdap
  • SQL Server 错误“隐式转换,因为值的排序规则由于排序规则冲突而无法解析。”

    我在开发存储过程时遇到此错误 无法执行 varchar 值到 varchar 的隐式转换 因为由于排序规则冲突而无法解析该值的排序规则 声明是这样的 Select City COLLATE DATABASE DEFAULT AS Place
  • 通过 C# SqlCommand 执行合并语句不起作用

    我正在第一次尝试使用临时表和MERGE语句通过更新 SQL 表SqlCommandC 中的对象 我正在开发的程序旨在首先将大量记录 最多 20k 导出到 Excel 电子表格中 然后 用户可以搜索并替换特定值 并根据需要更新任意多记录中的任
  • 将数据库与 Clojure 结合使用

    有哪些使用 Clojure 数据库的方法 我从 Clojure 知道你可以用 Java 做任何事情 但这意味着我最终可能会使用一些过于复杂的东西 比如 Hibernate 这与 Clojure 的简单性相冲突 有什么建议或意见吗 Cloju
  • 如何获得一列中的最大数量?

    我一直在尝试找到一个如何获取列中最大数字的示例 我想做的是 找到 TABLE A 中的最大列数 点 列 例如 我想输出这个 MAX 数字
  • 如何使用一个命令删除 SQL 数据库中的所有索引?

    那么 如何通过一条命令删除 SQL 数据库中的所有索引呢 我有这个命令可以获取所有 20 个左右的 drop 语句 但是如何从这个 结果集 运行所有这些 drop 语句呢 select from vw drop idnex 给我相同列表的另
  • SQL Server 中的 FIFO 查询

    我正在构建一个库存管理应用程序c with SQL server 我想做一个FIFO从我的表查询 我以可变价格购买了相同的产品 之后我卖掉了其中一些 我想根据 先进先出 进行查询BatchDate柱子 所以我想通过PurchasePrice

随机推荐

  • 属性。有什么有用的目的?

    Under System Runtime InteropServices the
  • Vim 显示:ImportError:没有名为 site 的模块。当我使用 Canopy1.1 时

    我在Windows Xp 32中安装了Canopy 1 1 express 并使用vim作为编辑器 当我打字时 python print hello 在vim命令行中显示 Importerror No module named site然后
  • Flutter Android SDK 版本 28 错误,但我使用的是 30

    当我创建一个新的 flutter 应用程序时 它启动 android sdk 版本 28 但我使用 android sdk 30 Flutter doctor 还显示了平台 android 30 build tools 30 0 2 当我尝
  • dll文件的描述

    您好 如何在 dll 文件中查找类的描述 在我的项目中 我在 imagealg dll 中使用 diff calss 告诉我如何找到那个的描述 plz 找到该类的描述的最佳位置是在文档中
  • Eclipse 自动建议并填写变量名称

    好的 所以我的问题是当我创建一个变量时 例如 Object o 当我输入 o 时 它会建议类似 object 的内容 没关系 但是当我按空格时 它会自动填充新名称 基本上我不想关闭自动完成 我只想禁用空格自动填充建议 甚至禁用变量命名建议也
  • 如何使用 C# 在 Excel 图表上添加多个系列

    我想添加一个如下图所示的图表 该图表有 3 个系列 黑色 红色 蓝色 以下是在图表上创建 一个 系列的代码块 Excel Workbook oWorkbook Excel Workbook oSheet Parent Excel Chart
  • 捕获最后一个 WM_SIZE

    当我调整窗口大小时 我想告诉程序的另一部分我的窗口大小已更改 我继续读下去MSDN http msdn microsoft com en us library ms632646 VS 85 aspx that WM 尺寸 留言WM SIZE
  • 将 less-plugin-glob 与 Webpack 结合使用

    我正在尝试将现有项目的构建系统从gulp to webpack 它当前有一个入口点 less 文件 可导入各种其他文件 如下所示 import bower components bootstrap less bootstrap less i
  • 即使在索引字段上,MongoDB 排序也非常慢

    今天我遇到了这个问题 我的 MongoDB 查询速度非常慢并且超时 我发布了这个问题 MongoDB 记录太多 https stackoverflow com questions 11701103 mongodb too many reco
  • iPhone 中的 jpg 图像和 2x 图像

    我正在开发 iphone 应用程序并定位iOS 4 0或稍后 我正在尝试将图像添加到 UIImageView 并且图像位于jpeg格式 这就是我到目前为止所做的 UIImageView bgImageView UIImageView all
  • Div 溢出滚动到底部:可能吗?

    如果我有一个div with overflow auto使其成为可滚动的div我加载它的信息会形成一个重要的滚动区域 有没有一种方法可以在我加载信息时 div显示底部结果 或者基本上滚动到底部 我见过 jQuery 解决方案 但这是在 HT
  • 如何让图片大小在滚动时平滑变化?

    我有带有大徽标的标题 我想在滚动超过 100px 后将其变小 这工作正常但不流畅 我怎样才能做到平滑 我的代码 function window scroll function if this scrollTop gt 100 header
  • AngularJS 登录表单与 ng-click 不起作用

    我在这个插件中写了一个基本的登录表单http plnkr co edit xQEN1ZNN5ZEw1CSwNw97 p preview http plnkr co edit xQEN1ZNN5ZEw1CSwNw97 p preview 单击
  • 如何在改造多部分请求中发送对象数组

    I want to send array objects with multipart data I tried many ways but it is not working My issue with the contributor p
  • 如何为Android Studio构建模板项目

    我使用 Android Studio 我必须创建许多始终包含三个模块的项目 应用程序 应用程序 图书馆 图书馆 壁纸 应用程序 我知道可以使用 ADT 来构建活动模板等 我找到了一些类似的教程this https android arsen
  • 在 C# 中使用 XSLT 将 RVML 转换为 SVG

    我有一个 C Web 应用程序 它使用以下命令生成 SVG 代码拉斐尔 JS http www raphaeljs com 然后我需要将其转换为 PNG 以实现用户之间的一般互操作性 请参阅我之前的问题在这里 https stackover
  • 如何从首选项屏幕返回到主要活动?

    我有一项主要活动和一项偏好活动 在我的第一个活动中 我调用菜单并通过调用startActivityForResult继续preferenceActivity case R id settings startActivityForResult
  • TCP 数据偶尔会以错误的顺序接收且不完整

    我用 Java 创建了 TCP 服务器应用程序 并用 C 创建了客户端应用程序 当我发送数据时 客户端有时会乱序接收数据 有时部分会完全丢失 基本上 我在服务器 java 中使用的代码如下 已删除 ServerSocket welcomeS
  • 将同步方法更改为异步方法

    我在谷歌上搜索了很多并阅读了不同的菜鸟教程 但我认为我不明白正确的做法是什么 基本上 现有的同步代码会在服务器启动并运行时执行某些操作 有时 很少见 服务器需要更长的时间才能启动 因此我想将其包装在一些重试逻辑中 我构建了一个完全愚蠢的控制
  • 单向数据库同步

    经常需要将一个数据库中的主表中的数据同步到其他数据库 通常位于其他服务器上 中的克隆表 例如 考虑这样一种情况 后端系统管理库存数据 并且库存数据最终必须推送到作为网站应用程序一部分的一个或多个数据库 后端系统中的源数据高度规范化 有数十个