【问题标题】:SQL Transactional Replication - initial snapshot places table locks?SQL 事务复制 - 初始快照放置表锁?
【发布时间】:2015-11-22 12:35:58
【问题描述】:

在配置 SQL Server 时生成初始快照时 事务复制,有谁知道快照代理是否在您选择的表(文章)上加了锁?我有一些包含 2+ 百万行的表,并且想知道 SQL Server 是否真的在发布数据库在线时放置表锁以防止更新。如果放置了锁,那么我想在生产的非高峰时间运行初始快照。

谢谢!

【问题讨论】:

    标签: sql-server transactional-replication


    【解决方案1】:

    在事务复制或任何其他类型的复制中,起点是数据库的快照。创建快照的初始步骤在任何类型的复制中都完全相同。

    SQL Server 在创建快照时根本不会获取任何类型的锁,它实际上是数据库在某个时间点的快照,创建快照不会干扰任何事务。一旦创建快照,未提交的事务就会在快照中回滚。

    要了解有关数据库快照如何工作的更多信息,请阅读来自 MSDN How Database Snapshots Work 的这篇文章

    【讨论】:

    • 这是此链接中的一篇旧文章的摘录:并发快照处理 通常在生成快照时,SQL Server 将在快照生成期间作为复制的一部分发布的所有表上放置共享锁。这可以防止对发布表进行更新。并发快照处理仅适用于事务复制,不会在整个快照生成期间保持共享锁定,因此,它允许用户在 SQL Server 2000 创建初始快照文件时继续不间断地工作。
    • 抱歉我的cmets不是很清楚。上面的摘录是在这个链接中找到的:technet.microsoft.com/en-us/library/Aa179423%28v=SQL.80%29.aspx,我不确定它是否仍然适用于 SQL Server 2012。这就是我有点困惑的原因。
    • @sydney 您分享的文章是针对 SQL Server 2000 的,2005 年和 2008 年晚些时候发生了很大变化共享锁的行为发生了变化,How Transactional Replication Works 2008 R2 如果您阅读Concurrent Snapshot Processing 的部分,您将看到它在生成初始快照时根本没有获得任何锁。感谢您的建设性批评:)
    • @Sydney,老实说,我不知道 2000 版的这种行为,谢谢分享,你刚刚教了我一些我不知道的东西 :)
    • 因此,快照是一个重载的术语。原始答案中链接的文章是针对数据库快照的(即create database [foo] ... as snapshot of [bar],而 OP 正在寻找复制快照(即一种初始化复制的方法)。具有讽刺意味的是,您可以在后者的服务中使用前者(请参阅我的在本页其他地方回答)。
    【解决方案2】:

    如果您在支持数据库快照的 SQL Server 版本上运行(如在create database [foo]... as snapshot of [bar] 中),那么您可以选择将它们用作快照的基础。检查 sp_addpublication 的 @sync_method 参数。需要注意的是,由于数据库快照的工作方式,您可能仍然希望在一天中的非忙碌时间执行此操作(即,写入时复制会减慢任何写入活动),但您不会争用锁.

    【讨论】:

    • 我认为在非高峰期运行初始快照(在我的情况下)可能更安全,尤其是我们的 OLTP 应用程序在工作时间非常繁忙。从我一直在阅读的内容和上面提供的链接来看,BOL 说并发快照处理中没有锁定,这是事务复制中的“默认”,这与 SQL 2012 有关。
    • 您也可以从完全避免快照的发布者的备份中初始化。
    【解决方案3】:

    从 SQL Server 2005 开始,sp_addpublication 的默认 @sync_method 值为“concurrent”,这意味着在 snaphsot 代理运行期间表未锁定。请注意,这并不完全正确 - 快照代理将模式锁放在表上,但该锁的持续时间最多只有几秒钟。

    所以如果你设置@sync_method = "concurrent",那么不,理论上更新不会被阻止。如果@sync_method = "native"(SQL Server 2000 中的默认值)或 "character",那么是的,更新将被阻止。

    【讨论】:

    • 在我真正开始配置复制之前,我是否可以在我的 sql 实例上检查默认的@sync_method?
    • 这是一个发布属性,您在创建发布时设置它。
    猜你喜欢
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多