我有两个 SQL Server 数据库。一个是客户端(Windows 应用程序),第二个是服务器。我想每隔一段时间(例如每 2 分钟!)同步这两个数据库。
我已经了解了不同的同步方式,例如复制、时间戳、使用触发器的日志表、Microsoft Sync Framework 等等。
实际上,我不喜欢使用可能是黑盒(如复制)的同步方法,因为我不希望在更新 SQL Server 特定表并将它们与服务器同步时被阻止。
在这种情况下,您认为我应该使用哪种方法?请记住,每隔几分钟我必须从客户端向服务器发送几个表更改,并从服务器获取两个表更改。
我发现了一种奇怪但新的方法。是否有可能我在客户端记录所有已执行的(针对特定首选的)存储过程,并将它们与
.sql
文件中的参数一起发送到服务器并在那里执行它们?服务器上也会发生同样的情况并发送到客户端。你认为这是一个简单而有用的方法吗?如果可以的话,请向我推荐任何有用的方法。太感谢了。
编辑:请记住,这是一个实时同步,这使它变得特别。这意味着当客户端用户使用表时,与服务器的同步过程必须每隔几分钟发生一次,因此不必锁定任何表。
好吧,我可能不明白,但我试着回答它。
您说您需要一个经常运行的高性能解决方案(至少所有 2 分钟),并且您需要一个很好的方法,该方法应该快速而无需锁定。但是您不想要黑盒系统。
与在数百万安装中使用并获得良好结果的黑盒系统不同,您尝试再次发明轮子并构建自己的解决方案?嗯,听起来有点奇怪。
其实这些都是我的建议。
ISOLATION LEVEL
为READ_COMMITTED_SNAPSHOT
. 你可以在这里阅读更多关于它的信息。这将使用您的 tempdb 的一部分,但您的表始终是可读写的,并且复制可以在后台工作。请参见下面的示例:
CDC
在某些情况下可能很脆弱。CDC
将捕获监视表上的所有数据(您需要手动指定每个监视表)。INSERT
之后,您将获得,UPDATE
或之前的值和之后的值DELETE
。CDC
将保留这些信息一段时间(您可以自行指定)。该方法可能是CDC
在您需要监视的某些表上使用并将这些更改手动复制到其他数据库。顺便说一句,CDC
在后台也使用 SQL Server 复制。;-) 你可以在这里阅读更多关于它的信息。好吧,这些是我的 2 美分。希望您有一个很好的概述,也许您找到了一种适合您的解决方案。
我将尝试在这里列举一些我认为的优点和缺点的选项:
Microsoft Sync Framework - 在我看来更适合较小的移动应用程序数据库。它向您的数据库中添加了相当多的表,并且不如复制那么有效。由于它是作为组件在 SQL Server 外部实现的,因此配置起来会更加困难。我没有使用它的经验,只是尝试过并决定不使用它。
数据库更改跟踪。它是一个内置的 SQL Server 函数,可为您进行更改跟踪,包括插入、更新和删除。其他一切,例如发送和应用更改、解决冲突等,您都必须自己编写代码。
Ionic 的回答中提到的 CDC - 我没有使用它的经验,因为它仅在 Enterprise 或 Developer 版本中可用。
使用您自己的技巧来记录已执行的存储过程 - 很大程度上取决于您的数据库应用程序的性质。但是当程序变得有点不同时,你可能会得到一大堆数据。你会如何处理冲突?
从您的问题来看,您似乎只需要同步几个表而不是整个大型数据库。为此,您应该比您在问题中指定的更详细地分析您的需求,例如:
如果您最终发现,删除和冲突不是您的问题,并且您的结构不会发生太大变化,您可以考虑编写自己的逻辑,但它很容易增长到 1000 行代码。
谢谢大家的反馈。
我成功地解决了同步过程,方法是捕获执行的存储过程不是一堆而是一个一个,这在我的情况下效果很好。由于完整性和一切都经过仔细考虑,该系统到目前为止一直在实时运行。
迟到的答案,但它可能有助于线程访问者
我在尝试跨不同服务器分发数据时遇到了类似的挑战,并通过使用第三方工具(用于模式更改的Diff和用于数据更改同步的DataDiff)和遵循自动化流程所需的 PowerShell 脚本来解决它:
该方法计划两个数据库之间的比较并实时同步发现的更改。以下是一些提供分步说明的文章:
https://solutioncenter.apexsql.com/automatically-compare-and-synchronize-sql-server-data/ https://solutioncenter.apexsql.com/how-to-automatically-keep-two-sql-server-database-同步模式/
几年前我问过这个问题,我终于解决了,并在许多项目中使用了该解决方案
如果您的表完全相同(无论是否相同服务器),请使用跨国复制。设置非常简单,初始设置不会超过一个小时。但是,它可能需要一些技巧来更好地调试和理解您可以在许多网站上找到的机制。
如果你的目标表比你的源表有更多的列,我绝对推荐触发器,除非你在一秒钟内有这么多事务或者你的服务器很弱。
我在几个同步项目中使用了触发方法,它就像一个魅力。