【问题标题】:Sync SQL Server 2014 and SQL Server 2014 Express database using stored procedure or C#使用存储过程或 C# 同步 SQL Server 2014 和 SQL Server 2014 Express 数据库
【发布时间】:2018-02-07 18:09:37
【问题描述】:

我有一个 C# Windows Forms 应用程序(用 Visual Studio 2013 编写),并且在 SQL Server(用于主用户)和 SQL Server Express(用于客户端)中都有相同的数据库架构。我的每个客户端的数据库大小约为 2 GB。

我想每天或在需要时同步此数据库一次。在 SQL Server 2008 中,我们使用了 RMO,但该 API 在 SQL Server 2012 中已被弃用。

我曾尝试使用Merge Replication using T-SQL 并能够创建发布、将文章添加到发布、创建订阅者以及注册订阅者到发布,但数据未同步。

是否有任何适用于 SQL Server 2014 或更高版本的好示例(合并复制),然后请提出建议。

谢谢!

【问题讨论】:

  • 我也在dba.stackexchange.com/questions/183823/… 上发布了这个但没有得到正确的解决方案。
  • 您确实得到了解决方案 - 合并复制
  • 合并复制出了什么问题?您基本上只是要求人们将您指向在线资源
  • 这个问题和其他问题都在问“有没有什么好的例子”,这太笼统了,无法回答(它没有专门指合并复制)。现在您几乎已经完成了合并复制,您需要关闭这些模糊的开放式问题并打开一个新问题,该问题解释了您如何设置合并复制以及您遇到的问题。如果您花时间解释您的设置和遇到的问题,您很有可能自己找到答案。
  • 考虑使用 replmerg.exe (Google it) 将初始快照交付给 pull 订阅者并定期执行数据同步。

标签: c# sql-server database-replication data-synchronization merge-replication


【解决方案1】:

这绝不是一个全面的答案,但它会给你一些指导,然后你将能够独立研究。

以下是 如何将复制与 匿名 拉订阅者合并:

  • 配置发布者和分发者(在我的例子中是同一个 SQL Server 实例)。
  • 为快照创建一个空的本地 Windows 目录或 UNC 共享(我们稍后会生成它)。
  • 为快照代理(通常称为 Snapshot)创建一个本地/域 Windows 用户帐户,授予其 db_owner 访问您将要发布的数据库的权限,并确保它具有 write 对您为快照设置的 Windows 目录(或共享)的权限
  • (可选)创建将在同步期间访问数据库的本地/域 Windows 用户帐户。订阅者上的合并代理将直接模拟此帐户以连接到发布者,或者订阅者将连接到您的 Web Sync 服务器,然后该服务器将模拟此帐户以连接到发布者)。授予此帐户 db_owner 访问您在发布者上的数据库的权限。确保此帐户对快照目录/UNC 共享具有读取权限。
  • 使用 TSQL 或 SQL Server Management Studio 中的“新建发布”向导创建合并发布。
  • 将文章添加到出版物中。
  • 将用户添加到发布访问列表 (PAL):这应包括 Snapshot 用户和在步骤 4 中创建的可选 Windows 用户。
  • 在发布属性中配置快照位置(将其指向在步骤 2 中创建的本地/UNC 路径)和快照代理安全性(将其指向在步骤 3 中创建的 Windows 用户)。
  • 通过右键单击 SQL Server Management Studio 中的发布来生成快照 -> 查看快照代理状态 -> 启动。等待它成功完成。使用复制监视器 (sqlmonitor.exe) -> 发布 -> 代理选项卡来调试任何问题。
  • 连接到订阅服务器
  • 创建一个新的空数据库(或恢复以前在发布者上进行的备份 - 但请记住,如果您在发布中的不同文章之间存在限制,即外键,则从备份创建的订阅者数据库可能会失败)。李>
  • 运行 sp_addmergepullsubscription 以在新创建的订阅者数据库上创建匿名拉取订阅
  • 确保订阅者(或者,更具体地说,将运行复制合并代理的 Windows 用户)有权访问发布者/分发者上的快照目录/UNC 共享;或者,您可以将快照 (unc) 文件复制到订阅服务器上的本地目录 - 在这种情况下,请确保在执行初始同步时为复制合并代理指定 AltSnapshotFolder
  • 在订阅服务器上运行 Replication Merge Agent 以传递初始快照并执行第一次同步;我知道有一种方法可以通过 SQL Server Management Studio 来完成,但我个人通常直接调用replmerg.exe。对于 SQL Server 2014,您可以在 C:\Program Files\Microsoft SQL Server\120\COM\replmerg.exe 中找到它(在订阅者上)。
  • 定期调用 replmerg.exe 以保持数据和架构更改在您的发布者和订阅者之间流动。
  • 不要忘记记录 replmerg.exe 输出,因为在分发服务器上的复制监视器中看到的复制历史远不如从订阅服务器上的 replmerg.exe 获得的准确。

上面大致描述了订阅者可以直接连接到SQL Server分发器实例的过程。如果您打算使用 Web 同步连接到分发服务器,那将是一个更难以驯服的野兽(尤其是使用 IIS 7 或更高版本),我将留到下一次。

【讨论】:

  • :感谢详细解释。 Flow 对执行复制很有用。我使用了来自code.msdn.microsoft.com/SQL-Server-Express-05c73322 的 RMO 字母组合,并且能够在 SQL Server 2014 中同步数据。可以吗,或者我必须使用 replmerg.exe
  • @JJs,RMO 在 SQL Server 2012 中已被弃用。如果它“仍然有效”,我不会感到惊讶,但我的公司做了正确的事情,并通过编写一个瘦身完全摆脱它replmerg.exe 上的 .NET 包装器。这样做的好处是我们的 replmerg.exe 包装器可与 SQL Server 2008 到 2016 一起使用,因为没有特定于 SQL Server 版本的 DLL 依赖项 - 每当我们在不同版本的 SQL 上部署订阅时,我们只需更改 replmerg。 exe 路径,我们准备好了。
【解决方案2】:

如果您正在寻找事务/合并复制的替代方案,您可以使用 Service Broker 作为传输,并根据存储过程和触发器编写您自己的数据传输。在您的情况下,这并不是很难(单向)。我们在生产中使用这种数据传输 - 无需重新初始化订阅即可轻松过滤“订阅者”的表数据,并且可以使用 Service Broker 进行顺序数据传输。此外,它还保证了数据传输——即使没有连接服务代理将在连接建立后传递消息。当您拥有一个付费的 SQL Server 实例并且其他实例可以是 Express 时,服务代理可以正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多