SqlServer异常处理常用步骤

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
EXEC sp_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 号。 session ID1 的数据类型为 int,默认值为 NULL。 执行 sp_who 可获取有关该会话的进程信息。 如果未指定会话 ID1,则显示有关所有锁的信息。

[ @spid2 = ] 'session ID2'

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

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


列名


数据类型


说明


spid


smallint


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


dbid


smallint


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


ObjId


int


持有锁的对象的标识号。 可以在相关数据库中使用 OBJECT_NAME() 函数来标识对象。 值为 99 时是一种特殊情况,表示用于记录数据库中页分配的其中一个系统页的锁。


IndId


smallint


持有锁的索引的标识号。


类型


nchar(4)


锁的类型:


RID = 表中单个行的锁,由行标识符 (RID) 标识。


KEY = 索引内保护可串行事务中一系列键的锁。


PAG = 数据页或索引页的锁。


EXT = 对某区的锁。


TAB = 整个表(包括所有数据和索引)的锁。


DB = 数据库的锁。


FIL = 数据库文件的锁。


APP = 指定的应用程序资源的锁。


MD = 元数据或目录信息的锁。


HBT = 堆或 B 树索引的锁。 在 SQL Server 中此信息不完整。


AU = 分配单元的锁。 在 SQL Server 中此信息不完整。


Resource


nchar(32)


标识被锁定资源的值。 值的格式取决于 Type 列标识的资源类型:


Type 值:Resource 值


RID:格式为 fileid:pagenumber:rid 的标识符,其中 fileid 标识包含页的文件,pagenumber 标识包含行的页,rid 标识页上的特定行。 fileid 与sys.database_files 目录视图中的 file_id 列相匹配。


KEY:数据库引擎内部使用的十六进制数。


PAG:格式为 fileid:pagenumber 的数字,其中 fileid 标识包含页的文件,pagenumber 标识页。


EXT:标识区中的第一页的数字。 该数字的格式为 fileid:pagenumber。


TAB:没有提供信息,因为已在 ObjId 列中标识了表。


DB:没有提供信息,因为已在 dbid 列中标识了数据库。


FIL:文件的标识符,与 sys.database_files 目录视图中的 file_id 列相匹配。


APP:被锁定的应用程序资源的唯一标识符。 格式为 DbPrincipleId:<资源字符串的前 2 个到 16 个字符><哈希运算值>。


MD:随资源类型而变化。 有关详细信息,请参阅 sys.dm_tran_locks (Transact-SQL) 中 resource_description 列的说明。


HBT:没有提供任何信息。 请改用 sys.dm_tran_locks 动态管理视图。


AU:没有提供任何信息。 请改用 sys.dm_tran_locks 动态管理视图。


模式


nvarchar(8)


所请求的锁模式。 可以是:


NULL = 不授予对资源的访问权限。 用作占位符。


Sch-S = 架构稳定性。 确保在任何会话持有对架构元素(例如表或索引)的架构稳定性锁时,不删除该架构元素。


Sch-M = 架构修改。 必须由要更改指定资源架构的任何会话持有。 确保没有其他会话正在引用所指示的对象。


S = 共享。 授予持有锁的会话对资源的共享访问权限。


U = 更新。 指示对最终可能更新的资源获取的更新锁。 用于防止一种常见的死锁,这种死锁在多个会话锁定资源以便稍后对资源进行更新时发生。


X = 排他。 授予持有锁的会话对资源的独占访问权限。


IS = 意向共享。 指示有意将 S 锁放置在锁层次结构中的某个从属资源上。


IU = 意向更新。 指示有意将 U 锁放置在锁层次结构中的某个从属资源上。


IX = 意向排他。 指示有意将 X 锁放置在锁层次结构中的某个从属资源上。


SIU = 共享意向更新。 指示对有意在锁层次结构中的从属资源上获取更新锁的资源进行共享访问。


SIX = 共享意向排他。 指示对有意在锁层次结构中的从属资源上获取排他锁的资源进行共享访问。


UIX = 更新意向排他。 指示对有意在锁层次结构中的从属资源上获取排他锁的资源持有的更新锁。


BU = 大容量更新。 用于大容量操作。


RangeS_S = 共享键范围和共享资源锁。 指示可串行范围扫描。


RangeS_U = 共享键范围和更新资源锁。 指示可串行更新扫描。


RangeI_N = 插入键范围和 Null 资源锁。 用于在将新键插入索引前测试范围。


RangeI_S = 键范围转换锁。 由 RangeI_N 和 S 锁的重叠创建。


RangeI_U = 由 RangeI_N 和 U 锁的重叠创建的键范围转换锁。


RangeI_X = 由 RangeI_N 和 X 锁的重叠创建的键范围转换锁。


RangeX_S = 由 RangeI_N 和 RangeS_S 锁的重叠创建的键范围转换锁 。


RangeX_U = 由 RangeI_N 和 RangeS_U 锁的重叠创建的键范围转换锁。


RangeX_X = 排他键范围和排他资源锁。 这是在更新范围中的键时使用的转换锁。


状态


nvarchar(5)


锁的请求状态:


CNVRT:锁正在从另一种模式进行转换,但是转换被另一个持有锁(模式相冲突)的进程阻塞。


GRANT:已获取锁。


WAIT:锁被另一个持有锁(模式相冲突)的进程阻塞。

DBCC INPUTBUFFER

显示从客户端发送到 Microsoft® SQL Server™ 的最后一个语句。

语法

DBCC INPUTBUFFER (spid)

参数

spid

是 sp_who 系统存储过程的输出中所显示的用户连接系统进程 ID (SPID)。

结果集

DBCC INPUTBUFFER 返回包含如下列的行集。


列名


数据类型


描述


EventType


nvarchar(30)


事件类型,例如:RPC、语言或无事件。


Parameters


Int


0 = 文本
1- n = 参数


EventInfo


nvarchar(255)


对于 RPC 的 EventType,EventInfo 仅包含过程名。对于语言或无事件的 EventType,仅显示事件的头 255 个字符。

例如,当缓冲区中的最后事件是 DBCC INPUTBUFFER(11) 时,DBCC INPUTBUFFER 将返回以下结果集。

EventType      Parameters EventInfo           
-------------- ---------- ---------------------
Language Event 0          DBCC INPUTBUFFER (11)
(1 row(s) affected)

(0)

相关推荐

  • SQLServer 连接异常与解决方法小结

    一:[MICROSOFT][ODBC SQL SERVER DRIVER][SQL SERVER]用户'(null)'登陆失败,未与信任SQL SERVER连接相关联处理 原因是由于SQL Server使用了"仅 Windows"的身份验证方式, 因此用户无法使用SQL Server的登录帐户(如 sa )进行连接 (方法一)改成:Windows"的身份验证方式 二.SQL Server不存在或访问被拒绝 一般情况下,有几种可能性: 1.SQL Server名称或IP地址拼写

  • SQL Server自定义异常raiserror使用示例

    在使用SQL Server存储过程或者触发器时,通常会使用自定义异常来处理一些特殊逻辑.例如游标的销毁,事务的回滚.接下来将会详细的介绍SQL Server自定义异常的使用. 使用"raiserror"来抛出自定义异常.如下代码:在存储过程中,抛出自定义异常,然后在catch块中捕获自定义异常. IF EXISTS (SELECT * FROM SYSOBJECTS WHERE name='my_sp_test' AND TYPE='P') BEGIN DROP PROCEDURE m

  • 解决SQL SERVER数据库备份时出现“操作系统错误5(拒绝访问)。BACKUP DATABASE 正在异常终止。”错误的解决办法

    SQL SERVER数据库进行备份时出现"操作系统错误5(拒绝访问).BACKUP DATABASE 正在异常终止."错误.我们应该如何解决这个问题?小编今天为大家推荐一个解决办法. 一般备份文件选择的目录为磁盘根目录或备份所选分区未授予sqlserver用户读写权限时会出现此错误. 解决办法就是给sqlserver用户授予权限: 选择要备份的文件夹 ,右键-->属性-->安全-->看下"组或用户"是否包涵Authenticated Users 这

  • SQLserver2000 企业版 出现"进程51发生了严重的异常"错误的处理方法

    情景:一直用到比较好,突然不行 处理步骤:关了360等防火墙:(影响不大,但是有可能是因为杀毒软件处理时把某个关键文件heal了) 装了微软补丁http://www.microsoft.com/downloads/details.aspx?FamilyID=9552d43b-04eb-4af9-9e24-6cde4d933600&displaylang=zh-cn#filelist 重新启动就ok了. 这个工具是微软SQL Server 2000 安全工具,描述为"SQL Server

  • SQL Server出现System.OutOfMemoryException异常的解决方法

    今天在用SQL Server 2008执行一个SQL脚本文件时,老是出现引发类型为"System.OutOfMemoryException"的异常错误,脚本明明是从SQL Server 2008导出的,应该不会出错,研究了好久问题才得以解决. 出现这个错误的主要原因是由于SQL脚本文件太大,估计超过了100M了,解决方法就是把脚本文件分成几个脚本文件,分别去执行即可. 来自微软官方的解决方案: 原因: 因为计算机没有足够的内存来完成请求的操作,则会出现此问题. 在 SQL Server

  • SELinux导致PHP连接MySQL异常Can't connect to MySQL server的解决方法

    同事报告一起奇怪的现象,一个最简单的测试PHP代码,在测试环境很正常,但是在正式环境下,无论用何种方式(tcp/ip.unix socket)都无法连接mysql. 我协助查看了下,确实如此,无论是指定IP.端口的tcp/ip方式连接,或者是用unix socket方式连接,报错信息都类似: 复制代码 代码如下: Could not connect: Can't connect to MySQL server on 'MYSQL.SERVER' (13) 无论如何修改MySQL的授权,或者调整p

  • SqlServer异常处理常用步骤

    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_

  • 诊断SQLSERVER问题常用的日志概述及使用

    诊断SQLSERVER问题常用的日志 这里主要有两个: (1)Windows事件日志 (2)SQLSERVER ErrorLog 1.Windows事件日志 Event Log 作为一个Windows开启和管理的服务程序,Windows会在自己的系统日志system log里记录SQLSERVER这个服务的启动.正常关闭.异常关闭等信息. SQLSERVER也会把自己的一些概要信息同时记录在Windows的应用程序日志里Application Log而Windows日志本身又能够反映操作系统的健

  • Navicat 连接SQLServer数据库(图文步骤)

    连接配置方式如图: 有时候Navicat并没有初始化安装sqlncli, 所以连接的时候会报 没有默认驱动,如图: 解决方法:在navicat目录下找到对应驱动,点击安装即可, 安装过程中设置为全部允许安装 到此这篇关于Navicat 连接SQLServer数据库(图文步骤)的文章就介绍到这了,更多相关Navicat 连接SQLServer内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

  • SQLServer之常用函数总结详解

    SQLServer中的常用函数 字符串函数 len() 计算字符串的长度 select LEN(name) from test1 --计算name的长度 大小写转换 lower() upper() select lower('STUDENT !') select upper('student !') 去空 ltrim() 字符串左侧的空格去掉 ,rtrim()字符串右侧的空格去掉 declare @str varchar(100) = ' a a a ' select ltrim(@str) s

  • Linux安装ODBC连接SQLServer数据库的步骤

    目录 1.下载ODBC安装包 2.安装步骤 第一步:上传两个安装包到服务器上 第二步:安装unixODBC,先安装这个,后安装freetds 2.1.操作系统先安装gcc: 2.2.安装odbc 2.3.安装freetds 2.4.配置freetds驱动 2.5.测试配置是否正确 2.6.配置unixODBC 2.7.测试是否能连接数据库 2.8.shell脚本连接数据库 2.9.安装了SQLServer的机器上调用命令执行存储过程 操作系统:Centos7.2 1.下载ODBC安装包 unix

  • sqlserver游标使用步骤示例(创建游标 关闭游标)

    游标(cursor)是一个存储在DBMS服务器上的数据库查询,它不是一条SELECT语句,而是被该语句检索出来的结果集.在存储了游标之后,应用程序可以根据需要滚动或浏览其中的数据. 使用游标 使用游标的步骤: 在使用游标前,必须声明(定义)它.这个过程实际上没有检索数据,它只是定义要使用的SELECT语句和游标选项.一旦声明,就必须打开游标以供使用.这个过程用前面定义的SELECT语句把数据实际检索出来.对于填有数据的游标,根据需要取出(检索)各行.在结束游标使用时,必须关闭游标,可能的话,释放

  • 利用脚本自动安装SQLServer的实现步骤分析

    每当这种情况发生的时候,我总会心里默念道:杯具啊,这辈子也装不完了.因为SQL Server的安装还是比较复杂的,要先安装.Net.Windows Installer,在正式安装的过程中还要交互的填写各种参数,当然这个还不包括拷贝3GB多的安装文件的时间.在经历了几次这样的悲剧之后,我果断的意识到必须研究一下写个脚本改变这个残酷的现实. 前段时间会学校毕业答辩我终于暂时离开了繁重的工作,能找个时间研究一下脚本了.刚开始实验这个脚本的时候,由于同学喊我打游戏,我就偷懒没准备实验环境,直接用我的本子

  • SQLServer 管理常用SQL语句

    1. 查看数据库的版本 select @@version 2. 查看数据库所在机器操作系统参数 exec master..xp_msver 3. 查看数据库启动的参数 sp_configure 4. 查看数据库启动时间 select convert(varchar(30),login_time,120) from master..sysprocesses where spid=1 查看数据库服务器名和实例名 print 'Server Name...............:' + conver

  • SqlServer数据库备份与还原的实现步骤

    目录 问题描述 SqlServer数据库备份步骤 SqlServer数据库还原步骤 其它 问题描述   最近需要给程序新增功能,用于将旧格式的数据转换为新格式,同时删除旧格式的数据(新旧格式的数据库表有部分重叠,同一份数据无法同时存在新旧格式的数据),由于测试环境中的测试数据不多,功能调试几次之后就没有旧格式的数据做测试了,因此想到在功能调试前先将测试数据库备份,然后功能调试之后再将测试数据库还原,这样就可以重复的进行功能调试.   数据库备份过程比较顺利,但是还原过程中出现错误,无论是还原数据

  • 深入理解java异常处理机制及应用

    1. 引子 try-catch-finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解.不过,我亲自体验的"教训"告诉我,这个东西可不是想象中的那么简单.听话.不信?那你看看下面的代码,"猜猜"它执行后的结果会是什么?不要往后看答案.也不许执行代码看真正答案哦.如果你的答案是正确,那么这篇文章你就不用浪费时间看啦. package Test; public class TestException { public TestEx

随机推荐