事务复制通常以发布数据库中的对象和数据的快照开始。 创建初始快照后,发布服务器上所做的后续数据更改和架构修改通常会在发生时(几乎实时)传送到订阅服务器。 数据更改按相同的顺序应用于订阅服务器,并在发布服务器上发生的相同事务边界内;因此,在发布中,保证事务一致性。
事务复制通常用于服务器到服务器环境,在以下每种情况下都适用:
- 希望增量更改在发生时传播到订阅服务器。
- 应用程序需要在发布服务器上进行更改的时间和更改到达订阅服务器之间的低延迟。
- 应用程序需要访问中间数据状态。 例如,如果行更改了五次,事务复制允许应用程序响应每个更改(例如触发触发器),而不仅仅是对行的净数据更改。
- 发布服务器具有大量插入、更新和删除活动。
- 发布服务器或订阅服务器是非 SQL Server 数据库,例如 Oracle。
默认情况下,事务性发布的订阅者应被视为只读,因为不会将更改传播回发布者。 但是,事务复制确实提供了允许在订阅者上进行更新的选项。
事务复制的工作原理
事务复制由 SQL Server 快照代理、日志读取器代理和分发代理实现。 快照代理准备包含已发布表和数据库对象的架构和数据的快照文件,将这些文件存储在快照文件夹中,并在分发者的分发数据库中记录同步任务。
日志读取器代理会监控每个配置了事务复制的数据库的事务日志,然后将标记为复制的事务从事务日志复制到分发数据库中,该数据库作为一个可靠的存储和转发队列。 分发代理将快照文件夹中的初始快照文件以及分发数据库表中保存的事务复制到订阅服务器。
在发布者处进行的增量更改会根据分发代理的计划流向订阅者。分发代理可以连续运行以确保最小延迟,或按预定时间间隔运行。 由于必须在发布服务器上对数据进行更改(在使用事务复制时无需立即更新或排队更新选项),因此可以避免更新冲突。 最终,所有订阅者将与发布者实现相同的价值观。 如果立即更新或排队更新选项用于事务复制,则可以在订阅服务器上进行更新,并且通过排队更新,可能会发生冲突。
下图显示了事务复制的主体组件。
初始数据集
在新的事务复制订阅服务器能够从发布服务器接收增量更改之前,订阅服务器必须包含与发布服务器上的表具有相同架构和数据的表。 初始数据集通常是快照代理创建的快照,并由分发代理分发和应用。 初始数据集也可以通过备份或其他方式(例如 SQL Server Integration Services)提供。
当快照分发并应用于订阅者时,只有那些等待初始快照的订阅者会受到影响。 该出版物的其他订阅者(那些已初始化的订阅者)将不受影响。
并发快照处理
在快照生成期间,快照复制会将共享锁放在所有作为复制一部分发布的表上。 这可以防止对发布表进行更新。 并发快照处理(事务复制的默认值)不会在整个快照生成期间保留共享锁,这允许用户在复制创建初始快照文件时继续不间断工作。
快照代理
快照代理在事务复制中实现初始快照的过程与快照复制中使用的过程相同(除了上面提到过的关于并发快照处理的内容之外)。
生成快照文件后,可以使用 Microsoft Windows 资源管理器在快照文件夹中查看它们。
修改数据和日志读取器代理
日志读取器代理在分发服务器上运行;它通常持续运行,但也可以根据你建立的计划运行。 执行时,日志读取器代理首先读取发布事务日志(在常规 SQL Server 数据库引擎作期间用于事务跟踪和恢复的相同数据库日志),并标识任何 INSERT、UPDATE 和 DELETE 语句,或者对标记为复制的事务中的数据进行的其他修改。 接下来,代理将这些事务批量复制到分发服务器上的分发数据库。 日志读取器代理使用内部存储过程 sp_replcmds 来获取从日志中标记为复制的下一组命令。 然后,分发数据库成为用于向订阅者发送更改的存储和转发队列。 仅将已提交的事务发送到分发数据库。
将整个批次事务成功写入分发数据库后,即提交该事务。 在向分发服务器提交每批命令后,日志读取器代理将调用 sp_repldone 来标记上次完成复制的位置。 最后,代理在事务日志中标记那些准备被清除的行。 仍在等待复制的行不会被删除。
事务命令存储在分发数据库中,直到传播到所有订阅服务器或达到最大分发保留期为止。 订阅服务器接收事务的顺序与在发布服务器上应用事务的顺序相同。
分发代理
对于推送订阅,分发代理在分发服务器上运行;对于请求订阅,分发代理在订阅服务器上运行。 代理将事务从分发数据库移到订阅服务器。 如果订阅标记为验证,分发代理还会检查发布服务器和订阅服务器上的数据是否匹配。
发布类型
事务复制提供四种发布类型:
| 发布类型 | DESCRIPTION |
|---|---|
| 标准交易发布 | 适用于订阅服务器中的所有数据都是只读的拓扑(事务复制不会在订阅服务器上强制执行此作)。 使用 Transact-SQL 或复制管理对象(RMO)时,会默认创建标准的事务性发布。 使用“新建发布向导”时,通过在“发布类型”页上选择事务发布来创建它们。 有关创建发布的详细信息,请参阅 发布数据和数据库对象。 |
| 具有可更新订阅的事务性发布 | 此发布类型的特征包括: - 每个位置都有相同的数据,一个发布服务器和一个订阅服务器。 - 可以在订阅服务器上更新行 - 此拓扑最适合需要高可用性和读取可伸缩性的服务器环境。 有关详细信息,请参阅 可更新订阅。 |
| 对等拓扑 | 此发布类型的特征包括: - 每个位置都具有相同的数据,并充当发布服务器和订阅服务器。 - 同一行一次只能在一个位置更改。 - 支持 冲突检测 - 此拓扑最适合需要高可用性和读取可伸缩性的服务器环境。 如需更多信息,请参阅 对等事务复制。 |
| 双向事务性复制 | 此发布类型的特征包括: 双向复制类似于对等复制,但是,它不提供冲突解决。 此外,双向复制限制为 2 个服务器。 有关详细信息,请参阅 双向事务复制 |