【发布时间】:2015-11-22 12:35:58
【问题描述】:
在配置 SQL Server 时生成初始快照时 事务复制,有谁知道快照代理是否在您选择的表(文章)上加了锁?我有一些包含 2+ 百万行的表,并且想知道 SQL Server 是否真的在发布数据库在线时放置表锁以防止更新。如果放置了锁,那么我想在生产的非高峰时间运行初始快照。
谢谢!
【问题讨论】:
标签: sql-server transactional-replication
在配置 SQL Server 时生成初始快照时 事务复制,有谁知道快照代理是否在您选择的表(文章)上加了锁?我有一些包含 2+ 百万行的表,并且想知道 SQL Server 是否真的在发布数据库在线时放置表锁以防止更新。如果放置了锁,那么我想在生产的非高峰时间运行初始快照。
谢谢!
【问题讨论】:
标签: sql-server transactional-replication
在事务复制或任何其他类型的复制中,起点是数据库的快照。创建快照的初始步骤在任何类型的复制中都完全相同。
SQL Server 在创建快照时根本不会获取任何类型的锁,它实际上是数据库在某个时间点的快照,创建快照不会干扰任何事务。一旦创建快照,未提交的事务就会在快照中回滚。
要了解有关数据库快照如何工作的更多信息,请阅读来自 MSDN How Database Snapshots Work 的这篇文章
【讨论】:
How Transactional Replication Works 2008 R2 如果您阅读Concurrent Snapshot Processing 的部分,您将看到它在生成初始快照时根本没有获得任何锁。感谢您的建设性批评:)
create database [foo] ... as snapshot of [bar],而 OP 正在寻找复制快照(即一种初始化复制的方法)。具有讽刺意味的是,您可以在后者的服务中使用前者(请参阅我的在本页其他地方回答)。
如果您在支持数据库快照的 SQL Server 版本上运行(如在create database [foo]... as snapshot of [bar] 中),那么您可以选择将它们用作快照的基础。检查 sp_addpublication 的 @sync_method 参数。需要注意的是,由于数据库快照的工作方式,您可能仍然希望在一天中的非忙碌时间执行此操作(即,写入时复制会减慢任何写入活动),但您不会争用锁.
【讨论】:
从 SQL Server 2005 开始,sp_addpublication 的默认 @sync_method 值为“concurrent”,这意味着在 snaphsot 代理运行期间表未锁定。请注意,这并不完全正确 - 快照代理将模式锁放在表上,但该锁的持续时间最多只有几秒钟。
所以如果你设置@sync_method = "concurrent",那么不,理论上更新不会被阻止。如果@sync_method = "native"(SQL Server 2000 中的默认值)或 "character",那么是的,更新将被阻止。
【讨论】: