数据库阻塞和锁监控查询脚本

摘要

本文档提供了两个用于监控 Microsoft SQL Server 数据库阻塞和锁情况的查询脚本。第一个查询用于获取详细的进程信息(包括进程ID、阻塞状态、数据库名、登录用户等)以及当前正在执行的具体 SQL 语句。第二个查询用于快速查看活跃进程的基本状态信息。文档末尾还包含需要谨慎使用的操作命令(如终止进程)和使用说明。

查询列表

查询1:获取详细的进程信息和当前执行的SQL语句

SELECT * 
FROM (
    SELECT TOP 1000 
        spid AS 进程ID,                    -- 服务器进程ID
        blocked AS 被阻塞进程ID,           -- 阻塞当前进程的进程ID,0表示未被阻塞
        DB_NAME(sp.dbid) AS 数据库名,      -- 进程当前使用的数据库
        program_name AS 程序名称,          -- 客户端程序名称
        waitresource AS 等待资源,          -- 进程正在等待的资源
        lastwaittype AS 最后等待类型,      -- 最后一次或当前等待类型
        sp.loginame AS 登录名,             -- 进程登录名
        sp.hostname AS 主机名,             -- 客户端主机名
        a.[Text] AS 完整SQL文本,          -- 完整的SQL批处理文本
        SUBSTRING(
            A.text,
            sp.stmt_start / 2,
            (CASE 
                WHEN sp.stmt_end = -1 
                THEN DATALENGTH(A.text) 
                ELSE sp.stmt_end 
            END - sp.stmt_start) / 2
        ) AS 当前执行语句                  -- 当前正在执行的具体SQL语句
    FROM sys.sysprocesses AS sp 
    OUTER APPLY sys.dm_exec_sql_text(sp.sql_handle) AS A 
    WHERE spid > 0
    ORDER BY spid
) t1

查询2:获取活跃进程的基本信息

SELECT TOP 1000
    spid AS 进程ID,                        -- 服务器进程ID
    kpid AS 线程ID,                        -- Windows线程ID
    blocked AS 被阻塞进程ID,               -- 阻塞当前进程的进程ID
    waittime AS 等待时间毫秒,              -- 当前等待的持续时间(毫秒)
    lastwaittype AS 最后等待类型,          -- 最后一次或当前等待类型
    DB_NAME(dbid) AS 数据库名,             -- 进程当前使用的数据库
    waitresource AS 等待资源,              -- 进程正在等待的资源
    open_tran AS 打开事务数,               -- 进程打开的事务数量
    hostname AS 主机名,                    -- 客户端主机名
    [program_name] AS 程序名称,            -- 客户端程序名称
    hostprocess AS 主机进程ID,             -- 客户端进程ID
    loginame AS 登录名,                    -- 进程登录名
    [status] AS 进程状态                   -- 进程当前状态(running、sleeping等)
FROM sys.sysprocesses WITH (NOLOCK)
WHERE kpid > 0 
    AND [status] <> 'sleeping' 
    AND spid > 0
    AND spid <> @@SPID  -- 排除当前会话
ORDER BY spid

常用操作命令(谨慎使用)

-- 终止指定进程(请谨慎使用)
-- KILL 58

-- 清空指定表(请谨慎使用)
-- TRUNCATE TABLE OTHERS.CDC.FOR_CALCULAT_订单商品_药约约

-- 终止指定进程(请谨慎使用)
-- KILL 52

使用说明

  1. 第一个查询:用于查看详细的进程信息,包括当前执行的 SQL 语句
  2. 第二个查询:用于查看活跃进程的基本状态信息
  3. 可以根据需要取消注释相应的过滤条件
  4. KILL 命令请谨慎使用,建议先确认进程状态

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注