SQL Server误区30日谈 第2天 DBCC CHECKDB会导致阻塞

时间:2024-01-14 10:09:11 

误区 #2: DBCC CHECKDB会引起阻塞,因为这个命令默认会加锁

这是错误的!

    在SQL Server 7.0以及之前的版本中,DBCC CHECKDB命令的本质是C语言实现的一个不断嵌套循环的代码并对表加表锁(循环嵌套算法时间复杂度是嵌套次数的N次方,作为程序员的你懂得),这种方式并不和谐,并且…..

    在SQL Server 2000时代,一个叫Steve Lindell的哥们(现在仍然在SQL Server Team)使用分析事务日志的方法来检查数据库的一致性的方式重写了DBCC CHECKDB命令。DBCC CHECKDB会阻止截断日志。当将日志从头读到尾时,在事务日志内部进行了某种Recovery操作,这实际上是另一种全新的实现Recovery的代码,但是仅限于CHECKDB命令内部。但这种方式依然存在问题,比如这个命令存在检查失败的可能性,如果检查失败,你还需要重新执行它看是否还会出现同样的错误。并且有时候,这个命令还会使用SCH_S锁,索然这个锁仅仅阻塞表扫描和表构架的改变,但通过日志来检查一致性的代码也并不是尽善尽美,并且…..

    在SQL Server 2005时代,一个叫Paul Randal的家伙(译者:也就是本文作者)再次重写了DBCC CHECKDB命令。这次使用数据库快照来检查一致性(因为数据库快照会提供在数据库某一特定时间点的一致性视图),因此不再有事务日志的分析代码,不再有任何的锁--因为访问数据库快照不需要对原数据库加任何的锁,缓冲池会自动处理可能出现的资源争用。

   

    如果想了解更多内幕消息,你可以阅读下面的文章:

  • CHECKDB From Every Angle: Complete description of all CHECKDB stages

  • CHECKDB From Every Angle: Why would CHECKDB run out of space?

  • Database snapshots - when things go wrong

  • Issues around DBCC CHECKDB and the use of hidden database snapshots

  • Do transactions rollback when DBCC CHECKDB runs?

  • Diskeeper 10 Intelliwrite corruption bug

    现在,在任何SQL Server版本中,如果你依然使用WITH TABLOCK提示,那将会产生表锁来保证事务的一致性。但我不推荐这种方式。因为这种方式不仅需要更长的时间,还将会尝试对数据库加排他锁,但已经活动在数据库的连接有可能导致这种方式失败。

    在SQL Server 2000中,这个命令阻止事务日志截断将会导致日志不正常增长的相关问题,但对于SQL Server 2005来说,这个命令就会导致快照相关的问题(具体请看上面的链接)。

    但是在默认情况下,自从SQL SERVER 2000之后,DBCC CHECKDB不会再产生阻塞。

标签:DBCC,CHECKDB,阻塞
0
投稿

猜你喜欢

  • vue使用Print.js打印页面样式不出现的解决

    2024-05-02 17:02:00
  • Python time库的时间时钟处理

    2022-12-18 23:04:23
  • python如何基于redis实现ip代理池

    2022-11-05 20:49:08
  • 使用Python实现一个栈判断括号是否平衡

    2022-01-04 02:20:29
  • Python通过递归函数输出嵌套列表元素

    2021-03-23 15:36:09
  • Javascript 虚拟 DOM详解

    2024-04-18 10:31:30
  • 利用numpy和pandas处理csv文件中的时间方法

    2023-01-21 09:44:56
  • python数据挖掘Apriori算法实现关联分析

    2022-06-02 12:29:15
  • python装饰器代码深入讲解

    2023-08-17 20:59:19
  • Python 通过pip安装Django详细介绍

    2022-09-01 20:25:55
  • python实现单线程多任务非阻塞TCP服务端

    2021-05-29 07:26:52
  • Python读取Excel一列并计算所有对象出现次数的方法

    2021-06-15 20:57:14
  • Python简单获取自身外网IP的方法

    2023-12-26 03:44:31
  • Python去除列表中重复元素的方法

    2021-06-23 20:44:27
  • 基于PHP的登录和注册的功能的实现

    2024-04-30 08:48:04
  • python字符串常规操作大全

    2021-04-11 17:20:36
  • 实用PHP会员权限控制实现原理分析

    2023-11-23 11:32:39
  • 轻松了解数据库计算机的概念和发展方向

    2009-01-23 13:55:00
  • 探讨Mysql中OPTIMIZE TABLE的作用详解

    2024-01-24 21:43:41
  • MySQL select count(*)计数很慢优化方案

    2024-01-23 21:31:24
  • asp之家 网络编程 m.aspxhome.com