SQL 服务器事务复制:将行推送到订阅者表
SQL Server Transactional Replication: pushing a row to subscriber tables
我正在研究 SQL 服务器事务复制。我们正在开发三个内部应用程序,每个应用程序都有自己的数据库。我们需要允许同一用户访问不同的应用程序。
我们正在考虑拥有一个与应用程序数据库分开的 User
数据库,这样我们就不会在三个不同的数据库中重复用户数据。我们希望 User
数据库成为发布者,三个应用程序数据库成为复制过程中的订阅者。我们认为发布者数据库将 push
新注册用户给订阅者,因此我们正在复制用户数据 (inserts/updates/deletes)。
用户从发布者到订阅者的发布会在交易中发生吗? transaction
事务复制是否保证从发布者到订阅者的推送成功完成?
注册的最终结果将是一个令牌,其中包含用户的 GUID(以及其他数据点)。注册完成后创建的令牌将返回给调用应用程序,以便用户可以继续使用目标应用程序。
目标应用程序将解压令牌并使用用户的 GUID 来确保用户有权访问该应用程序。因此,复制过程必须将用户的 GUID 推送到订阅者数据库,以便一旦目标应用程序解压缩令牌并检查相应应用程序数据库中是否存在用户的 GUID,用户的 GUID 就可用。
我们看对了吗?非常感谢有关此方法的任何指导。谢谢。
将所有 3 个应用程序指向同一个用户数据库并使所有 3 个应用程序 insert
/update
相同 table(s) 不是更容易吗?
但是,假设您需要将它们分开,并回答您的问题...
事务复制已生效,只是在订阅者处对正在发布的文章进行日志重播,而且速度很快。在我的工作中,我们出于 ETL/Warehouse/Reporting 目的大量使用复制,并且我们每天近乎实时地复制数千万行数据。有延迟,但只有一两秒。
鉴于手头的信息,您所描述的内容绝对可行。插入新用户后,它几乎会在事务提交后立即出现在订阅者数据库中。
来自 MSDN Transactional Replication:
"The Log Reader Agent runs at the Distributor; it typically runs continuously, but can also run according to a schedule you establish. When executing, the Log Reader Agent first reads the publication transaction log (the same database log used for transaction tracking and recovery during regular SQL Server Database Engine operations) and identifies any INSERT, UPDATE, and DELETE statements, or other modifications made to the data in transactions that have been marked for replication. Next, the agent copies those transactions in batches to the distribution database at the Distributor. The Log Reader Agent uses the internal stored procedure sp_replcmds to get the next set of commands marked for replication from the log. The distribution database then becomes the store-and-forward queue from which changes are sent to Subscribers. Only committed transactions are sent to the distribution database."
我认为在这里提及合并(双向)复制也很重要。
您不能在事务(单向)复制中更新订阅者数据。这样做会破坏复制,并且订阅通常必须重新初始化才能修复它。合并复制是双向的,其中订阅者是可更新的,并且这些更新被传播到发布者和其他订阅者。
合并复制配置起来更复杂,而且根据我的经验,更难维护,但是它会给你带来灵活性,让你的每个应用程序 insert
/update
都有自己的副本用户数据库并将这些更改流向其他用户数据库。
我正在研究 SQL 服务器事务复制。我们正在开发三个内部应用程序,每个应用程序都有自己的数据库。我们需要允许同一用户访问不同的应用程序。
我们正在考虑拥有一个与应用程序数据库分开的 User
数据库,这样我们就不会在三个不同的数据库中重复用户数据。我们希望 User
数据库成为发布者,三个应用程序数据库成为复制过程中的订阅者。我们认为发布者数据库将 push
新注册用户给订阅者,因此我们正在复制用户数据 (inserts/updates/deletes)。
用户从发布者到订阅者的发布会在交易中发生吗? transaction
事务复制是否保证从发布者到订阅者的推送成功完成?
注册的最终结果将是一个令牌,其中包含用户的 GUID(以及其他数据点)。注册完成后创建的令牌将返回给调用应用程序,以便用户可以继续使用目标应用程序。
目标应用程序将解压令牌并使用用户的 GUID 来确保用户有权访问该应用程序。因此,复制过程必须将用户的 GUID 推送到订阅者数据库,以便一旦目标应用程序解压缩令牌并检查相应应用程序数据库中是否存在用户的 GUID,用户的 GUID 就可用。
我们看对了吗?非常感谢有关此方法的任何指导。谢谢。
将所有 3 个应用程序指向同一个用户数据库并使所有 3 个应用程序 insert
/update
相同 table(s) 不是更容易吗?
但是,假设您需要将它们分开,并回答您的问题...
事务复制已生效,只是在订阅者处对正在发布的文章进行日志重播,而且速度很快。在我的工作中,我们出于 ETL/Warehouse/Reporting 目的大量使用复制,并且我们每天近乎实时地复制数千万行数据。有延迟,但只有一两秒。
鉴于手头的信息,您所描述的内容绝对可行。插入新用户后,它几乎会在事务提交后立即出现在订阅者数据库中。
来自 MSDN Transactional Replication:
"The Log Reader Agent runs at the Distributor; it typically runs continuously, but can also run according to a schedule you establish. When executing, the Log Reader Agent first reads the publication transaction log (the same database log used for transaction tracking and recovery during regular SQL Server Database Engine operations) and identifies any INSERT, UPDATE, and DELETE statements, or other modifications made to the data in transactions that have been marked for replication. Next, the agent copies those transactions in batches to the distribution database at the Distributor. The Log Reader Agent uses the internal stored procedure sp_replcmds to get the next set of commands marked for replication from the log. The distribution database then becomes the store-and-forward queue from which changes are sent to Subscribers. Only committed transactions are sent to the distribution database."
我认为在这里提及合并(双向)复制也很重要。
您不能在事务(单向)复制中更新订阅者数据。这样做会破坏复制,并且订阅通常必须重新初始化才能修复它。合并复制是双向的,其中订阅者是可更新的,并且这些更新被传播到发布者和其他订阅者。
合并复制配置起来更复杂,而且根据我的经验,更难维护,但是它会给你带来灵活性,让你的每个应用程序 insert
/update
都有自己的副本用户数据库并将这些更改流向其他用户数据库。