处理SQL Server 异常常用步骤【vnsc5858威尼斯城官网

时间:2020-03-09 15:17来源:计算机教程
具体操作:根据master.dbo.sysprocesses中的spid和blocked查找当前阻塞语句的主人,然后使用DBCCINPUTBUFFER ()查看阻塞语句。 例子: 打开三个查询分析器 A、B、C创建一个测试用的表 testDia Creat

具体操作: 根据master.dbo.sysprocesses中的spid和blocked查找当前阻塞语句的主人,然后使用DBCC INPUTBUFFER ()查看阻塞语句。 例子: 打开三个查询分析器 A、B、C 创建一个测试用的表 testDia Create Table testDia(ID int); 在A执行以下语句: Begin tran Insert Into testDia Values(1); 在B执行以下语句: Select * from testDia 当前情况:B中没有显示结果,显示状态为等待 在C执行以下语句: declare @spid int, @blocked int select top 1 @blocked = blocked from master.dbo.sysprocesses where blocked 0 DBCC INPUTBUFFER (@blocked) 技术参考: DBCC INPUTBUFFER (Transact-SQL) 显示从客户端发送到 Microsoft SQL Server 2005 实例的最后一个语句。 DBCC INPUTBUFFER ( session_id [ , request_id ] ) [WITH NO_INFOMSGS ] session_id 与各活动主连接关联的会话 ID。 request_id 要在当前会话中精确搜索的请求。 下面的查询返回 request_id: 复制代码 SELECT request_id FROM sys.dm_exec_requests WHERE session_id = @@spidWITH 启用要指定的选项。 NO_INFOMSGS 取消严重级别从 0 到 10 的所有信息性消息。

处理SQL Server 异常常用步骤

 

SQL Server常见的问题主要是SQL问题造成,常见的主要是CPU过高和阻塞。

 

一、CPU过高的问题

1、查询系统动态视图查询执行时间长的sql语句

 

WITH ProcessCTE(blocked) AS

(

   SELECT spid FROM sys.sysprocesses WHERE cpu>500

)

SELECT distinct  a.*

  FROM (

      SELECT TEXT,AA.* FROM sys.sysprocesses AA

       CROSS APPLY sys.dm_exec_sql_text(AA.sql_handle)

       ) a

  JOIN ProcessCTE bucte WITH(NOLOCK)

    ON bucte.blocked=a.spid

 --where loginame = 'TCScenery'

 ORDER BY a.CPU

 

 

二、阻塞问题

1、查询系统动态视图查询阻塞的sql语句

 

WITH ProcessCTE(blocked) AS

(

    SELECT blocked FROM sys.sysprocesses WHERE blocked>0

    union

    SELECT blocked FROM sys.sysprocesses WHERE blocked>0

)

SELECT distinct a.*

  FROM (

       SELECT TEXT,AA.* FROM sys.sysprocesses AA

        CROSS APPLY sys.dm_exec_sql_text(AA.sql_handle)

       ) a

  JOIN ProcessCTE bucte WITH(NOLOCK)

    ON bucte.blocked=a.spid

 ORDER BY a.blocked

2、使用系统自带的存储过程

Sp_who2和sp_lock以及使用dbcc inputbuffer(spid) 也可以用来分析阻塞

 

sp_who可以返回如下信息: (可选参数LoginName, 或active代表活动会话数)
Spid         (系统进程ID)
status      (进程状态)
loginame  (用户登录名)
hostname(用户主机名)
blk           (阻塞进程的SPID)
dbname   (进程正在使用的数据库名)
Cmd        (当前正在执行的命令类型)sp_who2除了显示上面sp_who的输出信息外,还显示下面的信息:  (可选参数LoginName, 或active代表活动会话数)
CPUTime           (进程占用的总CPU时间)
DiskIO             (进程对磁盘读的总次数)
LastBatch         (客户最后一次调用存储过程或者执行查询的时间)
ProgramName  (用来初始化连接的应用程序名称,或者主机名)

 

下面是sp_who的用法,sp_who2与此类似

A.列出全部当前进程

以下示例使用没有参数的 sp_who 来报告所有当前用户。

USE master;

GO

EXECsp_who;

GO

B.列出特定用户的进程

以下示例显示如何通过登录名查看有关单个当前用户的信息。

USE master;

GO

EXEC sp_who'janetl';

GO

C.显示所有活动进程

USE master;

GO

EXEC sp_who'active';

GO

D.显示会话 ID 标识的特定进程

USE master;

GO

EXEC sp_who'10' --specifies the process_id;

GO

 

sp_lock用法说明

sp_lock [ [ @spid1 = ]'session ID1' ] [ , [@spid2 = ] 'session ID2' ][ ; ]

 

[ @spid1 = ] 'session ID1'

来自用户想要锁定其信息的 sys.dm_exec_sessions 的数据库引擎会话 ID 号。 sessionID1 的数据类型为 int,默认值为 NULL。 执行 sp_who 可获取有关该会话的进程信息。 如果未指定会话 ID1,则显示有关所有锁的信息。

[ @spid2 = ] 'session ID2'

来自 sys.dm_exec_sessions 的另一个数据库引擎会话 ID 号,该会话 ID 号可能与 session ID1 同时具有锁,并且用户也需要其有关信息。 sessionID2 的数据类型为 int,默认值为 NULL。

 

sp_lock 结果集中,由 @spid1@spid2 参数指定的会话所持有的每个锁都对应一行。 如果既未指定 @spid1 又未指定 @spid2,则结果集将报告当前在数据库引擎实例中处于活动状态的所有会话的锁。

 

 

列名

数据类型

说明

spid

smallint

请求锁的进程的数据库引擎会话 ID 号。

dbid

smallint

保留锁的数据库的标识号。 可以使用 DB_NAME() 函数来标识数据库。

编辑:计算机教程 本文来源:处理SQL Server 异常常用步骤【vnsc5858威尼斯城官网

关键词: