【问题标题】:SQL Server Transactional Replication: pushing a row to subscriber tablesSQL Server 事务复制:将行推送到订阅者表
【发布时间】:2016-02-09 18:55:46
【问题描述】:

我正在研究 SQL Server 事务复制。我们正在开发三个内部应用程序,每个应用程序都有自己的数据库。我们需要允许同一个用户访问不同的应用程序。

我们正在考虑拥有一个独立于应用程序数据库的User 数据库,因此我们不会在三个不同的数据库中复制用户数据。在复制过程中,我们希望User 数据库成为发布者,而三个应用程序数据库成为订阅者。我们认为发布者数据库会将push 新注册的用户@ 订阅者,因此我们正在复制用户数据(插入/更新/删除)。

用户从发布者到订阅者的发布是否会在事务中发生? transaction 事务复制是否保证从发布者到订阅者的推送成功完成?

注册的最终结果将是一个包含用户 GUID(以及其他数据点)的令牌。注册完成后创建的令牌将返回给调用应用程序,以便用户可以继续使用目标应用程序。

目标应用程序将解压令牌并使用用户的 GUID 来确保用户可以访问应用程序。因此,复制过程必须将用户的 GUID 推送到订阅者数据库,这样一旦目标应用解压令牌并检查用户的 GUID 在相应的应用程序数据库中是否存在,用户的 GUID 就可用。

我们是否正确看待这个问题?非常感谢有关此方法的任何指导。谢谢。

【问题讨论】:

    标签: sql-server sql-server-2012 database-replication transactional-replication


    【解决方案1】:

    将所有 3 个应用程序指向同一个用户数据库并让所有 3 个应用程序 insert/update 同一个表不是更容易吗?

    但是,假设您需要将它们分开,并回答您的问题...

    事务复制生效,只是在订阅者处对正在发布的文章进行日志重播,而且速度很快。在我的工作中,我们大量使用复制来实现 ETL/仓库/报告目的,并且我们每天几乎实时复制数千万行数据。有延迟,但只有一两秒。

    鉴于手头的信息,您所描述的内容绝对是可行的。插入新用户后,它几乎会在事务提交后立即出现在订阅者数据库中。

    来自 MSDN Transactional Replication

    "日志读取器代理在分发器上运行;它通常连续运行,但也可以根据您建立的时间表运行。执行时,日志读取器代理首先读取发布事务日志(用于事务的同一数据库日志)在常规 SQL Server 数据库引擎操作期间进行跟踪和恢复)并识别任何 INSERT、UPDATE 和 DELETE 语句,或对已标记为复制的事务中的数据进行的其他修改。接下来,代理将这些事务批量复制到分发中分发服务器上的数据库。日志读取器代理使用内部存储过程 sp_replcmds 从日志中获取标记为复制的下一组命令。分发数据库然后成为存储转发队列,更改从该队列发送到订阅服务器。只有提交的事务才会发送到分发数据库。"

    我认为在这里提到合并(双向)复制也很重要。

    您无法在事务(单向)复制中更新订阅者数据。这样做会破坏复制,并且订阅通常必须重新初始化以修复它。合并复制是双向的,订阅者可以更新,这些更新会传播到发布者和其他订阅者。

    合并复制配置起来更复杂,根据我的经验,维护起来也更困难,但是它可以让您灵活地让每个应用程序insert/update 拥有自己的用户数据库副本并拥有这些更改流向其他用户数据库。

    MSDN:Selecting the Appropriate Type of Replication

    【讨论】:

    • 感谢您的回复。我认为少数以用户为中心的表不需要双向复制。每个应用程序都允许更新用户数据,但它会直接保存到发布者数据库,然后复制出去。我们希望用户数据集中的原因是为用户建立一个全局 id。然后,全局 ID 将用于与每个应用程序数据库中的数据的关系。发布者数据库是用户身份的权威来源。听起来我对将用户推送给订阅者的担忧毕竟不是什么大问题。
    • 所以,我创建了一个示例发布者和 2 个示例订阅者数据库。我正在使用事务复制在一个简单的 Person 表上从发布者推送到订阅者。这是工作。我无法确定的是,从发布者到订阅者的数据推送是否发生在事务范围内。我的意思是,当发布者上的事务完成创建/更新记录时,该记录是否也会推送给订阅者?我必须保证用户的 GUID 存在于订阅者中,以便可以放心地创建令牌。
    • 假设你没有留下一个打开的(未提交的)事务,假设复制没有落后,它会在几秒钟内击中你的订阅者......如果对文章进行大规模操作,这是可能的(s)。
    猜你喜欢
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多