带你了解DBCC命令!| 数据库教程17:必须了解的SQL Server DBCC的方方面面及其常用命令

1,541 阅读8分钟

这是我参与8月更文挑战的第17天,活动详情查看:8月更文挑战

SQL Server中的DBCC非常实用,但有时却不常遇到。下面对其进行一些总结。

DBCC全称为Database Console Commands,也就是它是数据库的控制台命令,常用于故障排除的目的。

执行DBCC需要有sysadmin或db_owner的权限。

数据库控制台命令语句可分为:维护、信息、验证、杂项等几类。

DBCC也可以代表Database Consistency Checker,常在分析服务中使用。具体介绍可查看相关资料。

基本的DBCC HELP

DBCC HELP用于查看指定DBCC命令的语法,或列出所有支持的命令

运行下面的命令,列出所有支持的命令:

DBCC HELP ('?');

列出CHECKDB的语法:

DBCC HELP (CHECKDB);

使用DBCC HELP ('?');常规下只返回33个常用的命令。通过开启跟踪标记2588,可以查看更多的命令

-- 开启2588标记,使DBCC HELP ('?');可以显示更多命令
DBCC TRACEON(2588);
DBCC HELP ('?');

DBCC TRACEON, DBCC TRACEOFF和DBCC TRACESTATUS

DBCC TRACEONDBCC TRACEOFF用于启用或关闭一个跟踪标记,不需要重启服务,可以在session或全局级别开启标记。

开启或禁用的跟踪标记,可能会影响SQL Server的性能,主要取决于标记改变的是什么功能。

DBCC TRACESTATUS提供指定跟踪标记的状态,或启用了的所有跟踪标记的状态。运行DBCC TRACESTATUS不会影响性能或数据,也不会改变实例的配置。

DBCC TRACESTATUS仅需要公共权限。DBCC TRACEON和DBCC TRACEOFF需要系统管理员权限。

详细介绍请查看这可能是你了解SQL Server跟踪标记的最正确的姿势一节

  • DBCC TRACEON(2588):开启2588标记,可以通过dbcc helpp('?');查看更多的dbcc命令。
  • DBCC TRACEON(3604):开启3604标记,可以将DBCC Page的结果显示在客户端,否则就不会显示出来

DBCC信息命令

下面看一写关于数据库环境信息的命令

DBCC SQLPERF

dbcc sqlperf

  • 提供一个实例中所有log文件的事务日志空间使用情况
  • 用于清除与权重统计、闩锁统计或自旋锁统计相关的数据——Used to clear out data related to weight statistics, latch statistics, or spinlock statistics
  • 要运行此命令,您需要具有(VIEW SERVER STATE, ALTER SERVER STATE)。
  • 执行不影响系统性能。

检查日志空间利用率

DBCC SQLPERF (LOGSPACE);

清除等待统计信息clear wait statistics

DBCC SQLPERF ("sys.dm_os_wait_stats", CLEAR);

清除闩锁统计信息clear latch statistics

DBCC SQLPERF ("sys.dm_os_latch_stats", CLEAR);

清除自旋锁统计信息clear spinlock statistics

DBCC SQLPERF ("sys.dm_os_spinlock_stats", CLEAR);

DBCC SHOW_STATISTICS

显示表或索引视图的当前查询优化统计信息。

  • 显示索引、索引视图或列统计的统计对象
  • 在排除故障、理解计划中的估计值并与实际值进行比较时使用
  • 查看统计信息不会给系统带来性能负载
  • 需要sysadmin、db_owner或db_ddladmin角色或电脑所有权

通过下面的步骤实现这个DBCC命令

  1. 查看表中所有的索引
sp_helpindex '[Person].[Address]';

  1. 对上面获取的索引名使用DBCC SHOW_STATISTICS
DBCC SHOW_STATISTICS ('[Person].[Address]','IX_Address_StateProvinceID');

结果显示的是基于存储在统计对象中的数据的标题(header)、直方图(histogram)和密度向量(density vector)。

  1. 可以使用以下选项之一指定要查看的结果部分
DBCC SHOW_STATISTICS ('[Person].[Address]','IX_Address_StateProvinceID') WITH STAT_HEADER;
GO
 
DBCC SHOW_STATISTICS ('[Person].[Address]','IX_Address_StateProvinceID') WITH DENSITY_VECTOR;
GO
 
DBCC SHOW_STATISTICS ('[Person].[Address]','IX_Address_StateProvinceID') WITH HISTOGRAM;
GO

DBCC USEROPTIONS

  • 返回为当前连接设置的选项,如隔离级别或 QUOTED_IDENTIFIER。
  • 用于验证连接设置以确认它们是正确的,或在不同的连接方法之间保持一致。
  • 只显示信息,不修改设置。
  • 需要public角色。
DBCC USEROPTIONS;

DBCC SHOWCONTIG

DBCC SHOWCONTIG显示指定的表或视图的数据和索引的碎片信息。可根据查到的碎片作进一步的处理依据。

DBCC INPUTBUFFER

DBCC INPUTBUFFER:显示从客户端发送到Microsoft SQL Server实例的最后一条语句。

DBCC OUTPUTBUFFER

DBCC OUTPUTBUFFER:以十六进制和 ASCII 格式返回指定 session_id 的当前输出缓冲区。

DBCC PROCCACHE

DBCC PROCCACHE:Displays information in a table format about the procedure cache. —— 以表格格式显示有关过程缓存的信息。

DBCC OPENTRAN

DBCC OPENTRAN:有助于识别可能阻止日志截断的活动事务。

DBCC OPENTRAN显示有关指定数据库的事务日志,包括最早的活动事务以及最早的分布式和非分布式复制事务的信息(如果有)。仅当日志中存在活动事务或数据库包含复制信息时才会显示结果。如果日志中没有活动事务,则会显示一条信息性消息。

非 SQL Server 发布服务器不支持DBCC OPENTRAN。

DBCC维护命令

对数据库、索引或文件组进行维护的任务。

DBCC CLEANTABLE

DBCC CLEANTABLE:回收表或索引视图中删除的可变长度列的空间。

DBCC INDEXDEFRAG

DBCC INDEXDEFRAG:Defragments indexes of the specified table or view——对指定表或视图的索引进行碎片整理。

DBCC DBREINDEX

DBCC DBREINDEX:重建索引,对指定数据库中的表重新生成一个或多个索引。

DBCC SHRINKDATABASE

DBCC SHRINKDATABASE:收缩指定数据库中的数据和日志文件大小。

DBCC SHRINKFILE

DBCC SHRINKFILE:收缩当前数据库的指定数据或日志文件大小。可以使用它将数据从一个文件移动到同一文件组中的其他文件,这会清空文件并允许删除该文件的数据库。你可以将文件缩小到小于创建时的大小,将最小文件大小重置为新值。

DBCC DROPCLEANBUFFERS

DBCC DROPCLEANBUFFERS:从缓冲池中删除所有干净的缓冲区,并从列存储对象池中删除列存储对象。

DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS:WITH NO_INFOMSGS禁止所有信息性消息。

DBCC FREEPROCCACHE

DBCC FREEPROCCACHE:从计划缓存中移除所有元素,通过指定计划句柄或SQL句柄从计划缓存中移除特定计划,或者移除与指定资源池关联的所有缓存条目。

DBCC UPDATEUSAGE

DBCC UPDATEUSAGE:报告并更正目录视图中的页数和行数错误。这些不准确可能会导致sp_spaceused 系统存储过程返回的空间使用情况报告不正确。

DBCC验证命令

对数据库、表、索引、目录、文件组或数据库页的分配进行的验证操作。

DBCC CHECKDB

DBCC CHECKDB:通过执行以下操作检查指定数据库中所有对象的逻辑和物理完整性:

  • 在数据库上运行DBCC CHECKALLOC
  • 对数据库中的每个表和视图运行DBCC CHECKTABLE
  • 在数据库上运行DBCC CHECKCATALOG
  • 验证数据库中每个索引视图的内容。
  • 在文件系统中使用FILESTREAM存储varbinary(max)数据时,验证表元数据、文件系统目录和文件之间的链接级一致性。
  • 验证数据库中的Service Broker数据。

这意味着DBCC CHECKALLOC、DBCC CHECKTABLE或DBCC CHECKCATALOG命令不必与DBCC CHECKDB分开,再次运行。

包含内存优化表(memory-optimized tables)的数据库支持DBCC CHECKDB,但验证只对基于磁盘的表。不过,会验证内存优化文件组中文件的checksum。

更多可以查看官方介绍

DBCC CHECKCONSTRAINTS

DBCC CHECKCONSTRAINTS:检查当前数据库中指定表上的指定约束或所有约束的完整性。

DBCC CHECKTABLE

DBCC CHECKTABLE:检查构成表或索引视图的所有页和结构的完整性。

DBCC CHECKFILEGROUP

DBCC CHECKFILEGROUP:检查当前数据库指定文件组中所有表和索引视图的分配和结构完整性。

DBCC CHECKALLOC

DBCC CHECKALLOC:检查指定数据库的磁盘空间分配结构(allocation structures)的一致性。

DBCC CHECKALLOC功能包含在DBCC CHECKDB和 DBCC CHECKFILEGROUP中。这意味着不必与这些语句分开单独运行DBCC CHECKALLOC。DBCC CHECKALLOC不检查FILESTREAM数据。FILESTREAM在文件系统上存储二进制大对象 (BLOBS)。

DBCC CHECKCATALOG

DBCC CHECKCATALOG:检查指定数据库内的目录一致性(catalog consistency)。数据库必须联机在线。

DBCC CHECKIDENT

DBCC CHECKIDENT:检查SQL Server中指定表的当前标识值,如果需要,更改标识值。还可以使用DBCC CHECKIDENT为标识列手动设置新的当前标识值。

DBCC杂项命令

杂项任务,如启用跟踪标志、帮助命令或从内存中删除DLL

  • DBCC HELP:返回指定的 DBCC 命令的语法信息
  • DBCC dllname(FREE):从内存中卸载指定的扩展存储过程DLL
  • DBCC DBREPAIR:

其他一些未公开DBCC命令

还有一些关于SQL Server底层系统的DBCC命令,并没有在官方文档中列出来。但是对于深入研究数据库机制有很大帮助。下面只是简要列出,未作一一验证和分析。后续有机会单开文章介绍。

可以点击此段内容,展开查看这些命令的简要介绍。

  • dbcc DBINFO [('dbname')]:返回数据库有关的错误信息。
  • DBCC BUFFER 显示缓冲区头部和页面信息
  • DBCC FLUSHPROCINDB 清楚数据库服务器内存中的某个数据库存储过程的缓存内容。
  • DBCC DATABLE 显示管理数据库的表信息
  • DBC IND 查看某个索引使用的页面信息。
  • DBCC REBULDLOG 重建修复SQL数据库事物日志文件。
  • DBCC LOG 查看某个数据库的事务日志信息
  • DBCC PAGE 查看某个数据库数据页面信息
  • DBCC PROCBUF 显示过程缓冲池的缓冲区头和存储过程。
  • DBCC PRTIPAGE 查看某个索引页面的每行指向的页面号。
  • DBCC PSS 显示当前连接到SQLSERVER服务器的进程信息。
  • DBCC RESOURCE 显示服务器当前使用的资源情况。
  • DBCC TAB 查看数据页面的结构。 等。

参考