使用SQL SERVER PROFILER 捕获和分析思索

前言:

在两个或多个SQL Server进程中,每一个进程锁定了其他进程试图锁定的资源,就会出现死锁,例如,进程process1对table1持有1个排它锁(X),同时process1对table2请求1个排它锁(X), 进程process2对table2持有1个排它锁(X),同时process2对table1请求1个排它锁(X) 类似这种情况,就会出现死锁,除非当某个外部进程断开死锁,否则死锁中的两个事务都将无限期等待下去。

Microsoft SQL Server 数据库引擎死锁监视器定期检查陷入死锁的任务。

如果监视器检测到循环依赖关系,将选择其中一个任务作为牺牲品(通常是选择占资源比较小的进程作为牺牲品),然后终止其事务并提示错误1205。

我们可以通过SQL Server Profiler来监视分析死锁的发生过程。

1.创建测试表。

在 Microsoft SQL Server Management Studio上,新建一个查询,写创建表DealLockTest_1 & DealLockTest_2两个表:

use Test
 --创建分析死锁使用到的两个表DealLockTest_1&DealLockTest_2
 go
 Set Nocount On
 Go
  if object_id(‘DealLockTest_1‘)Is Not Null
 Drop Table DealLockTest_1
 go
 Create Table DealLockTest_1
 (
 ID int Identity(1,1)Primary Key,
 Name nvarchar(512)
 )
 if object_id(‘DealLockTest_2‘)Is Not Null
 Drop Table DealLockTest_2
 go
 Create Table DealLockTest_2
 (
 ID int Identity(1,1)Primary Key,
 Name nvarchar(512)
 )
 Go

 Insert Into DealLockTest_1(Name)
 Select name From sys.all_objects
 Insert Into DealLockTest_2(Name)
 Select name From sys.all_objects
--SELECT * FROM DealLockTest_1
--SELECT * FROM DealLockTest_2

创建好表和插入测试数据后,先执行脚本代码(因为我们不需要跟踪该代码),紧接着,我们就模拟两个会话,一个会话里面包含一个事务。这里我们就新建两个查询,其中第一个会话,是更新DealLockTest_1表后,等待5秒钟,更新DealLocktest_2.

--第一个会话
Begin Tran
Update DealLockTest_1
Set Name=N‘test1‘
Where ID>0
/*这里的Waitfor等待,是为了容易获取死锁的发生*/
Waitfor Delay‘00:00:15‘
--Update DealLockTest_2
--Set Name=N‘test2‘
--Where ID>0
SELECT * FROM DealLockTest_2
Commit Tran
Go

代码写好后,我们先不要执行代码,接下来就写第二个会话代码; 第二个会话更新表的顺序,刚好与第一个会话相反,是更新DealLockTest_2表后,等待5秒钟,更新DealLocktest_1.

--第二个会话
Begin Tran
Update DealLockTest_2
Set Name=N‘test1‘
Where ID>0
/*这里的Waitfor等待,是为了容易获取死锁的发生*/
Waitfor Delay‘00:00:15‘
--Update DealLockTest_1
--Set Name=N‘test2‘
--Where ID>0
SELECT * FROM DealLockTest_1
Commit Tran 

第二个会话代码,也先不要执行。

2.启动SQL Server Profiler,创建一个跟踪,使用: TSQL_Locks模板,在这个基础上面可以增加些自己想要的事件或者事件列,这里需要注意下,你可能只想筛选某个DB的资料,但是不能直接在DB那里进行筛选,不然的话你看不到 Deadlock graph事件,需要的话你可以将监控结果存在某个表里面再进行筛选。

当然精简一些就是:

点执行按钮,启动Trace。

3.执行测试代码&监视死锁。

转到 Microsoft SQL Server Management Studio界面,依次执行第一个会话和第二个会话的代码,稍稍等待15秒钟,我们就会发现其中一个会话收到报错消息

原文地址:https://www.cnblogs.com/ziqiumeng/p/10927554.html

时间: 2024-11-13 06:56:20

使用SQL SERVER PROFILER 捕获和分析思索的相关文章

通过SQL Server Profiler来监视分析死锁

在两个或多个SQL Server进程中,每一个进程锁定了其他进程试图锁定的资源,就会出现死锁,例如,进程process1对table1持有1个排它锁(X),同时process1对table2请求1个排它锁(X),进程process2对table2持有1个排它锁(X),同时process2对table1请求1个排它锁(X) 类似这种情况,就会出现死锁,除非当某个外部进程断开死锁,否则死锁中的两个事务都将无限期等待下去. Microsoft SQL Server 数据库引擎死锁监视器定期检查陷入死锁

SQL Server Profiler使用方法

一.SQL Server Profiler使用方法 1.单击开始--程序--Microsoft SQL Server 2005--性能工具--SQL Server Profiler,如下图: 2.弹出Sql server Profiler窗口,如下图: 3.在工作窗口内,鼠标单击“文件---[新建跟踪(N)...]”,弹出数据库连接对话窗口,在对话窗口内输入跟踪的数据库服务器名称.用户名和密码等信息,如下图: 4.输入完成后,单击连接按钮,弹出跟踪属性窗口,窗口中左边的“常规”选项卡是一个基本设

SQL Server Profiler(转载)

SQL Server Profiler工具 一.SQL Profiler工具简介 SQL Profiler是一个图形界面和一组系统存储过程,其作用如下: 图形化监视SQL Server查询: 在后台收集查询信息: 分析性能: 诊断像死锁之类的问题: 调试T-SQL语句: 模拟重放SQL Server活动: 也可以使用SQL Profiler捕捉在SQL Server实例上执行的活动.这样的活动被称为Profiler跟踪. 1.Profiler跟踪 从开始=>所有程序=>Microsoft SQ

SQL Server Profiler小技巧——筛选请求

如果需要转载,请附上本文作者和原文链接:http://www.cnblogs.com/zeusro/p/4016228.html Microsoft SQL Server Profiler 是 SQL 跟踪的图形用户界面,用于监视 数据库引擎或 Analysis Services 的实例.您可以捕获有关每个事件的数据并将其保存到文件或表中供以后分析.例如,可以对生产环境进行监视,了解哪些存储过程由于执行速度太慢影响了性能. 若要运行 SQL Server Profiler,请在“开始”菜单上依次

命令提示实用工具 “ SQL Server Profiler” 数据库引擎优化顾问

命令提示实用工具 sqlcmd -s ***   连接服务器.输入transact-sql语句,并执行. SQL Server Profiler使用方法 我们单击开始--程序--Microsoft SQL Server 2005--性能工具--SQL Server Profiler 如下图 然后会出现如下界面 我们单击文件---[新建跟踪(N)...],这是一个多窗口多任何的工具,我们可以同时新建不同的跟踪窗口,也可以是不同的数据库 接着看 在这里我们输入 我们的跟踪的数据库的服务器名称,用户名

SQL Server 2012笔记分享-33:SQL Server profiler跟踪

需求 使用SQL server profiler跟踪当前实例的所有常见活动,并将结果保存到文件中. ================================================================ 开始程序中选择SQL server profiler,如图. 选择文件--新建跟踪,如图. 连接到当前的SQL server实例,如图. 在跟踪属性里面配置跟踪名称.保存到的文件地址.保存到SQL报表.启用跟踪停止时间等,如图. 下图是一个跟踪启动后实时的跟踪情况,如图

Sql Server Profiler跟踪死锁

Sql Server Profiler一个很重要的应用场景就是监视分析死锁. 下面通过一个例子来学习Profiler是如何监视死锁的. 1. 创建测试数据模拟死锁, 创建表Table_A和Table_B并插入测试数据. CREATE TABLE Table_A ( id int, num int ) CREATE TABLE Table_B ( id int, num int ) INSERT INTO Table_A VALUES(1,20) INSERT INTO Table_A VALUE

SQL Server Profiler使用教程,通俗易懂才是王道

SQL Server Profiler使用教程,通俗易懂才是王道 做开发,平时难免和数据库打交道,特别是写存储过程,对于我们这些不常写SQL的人来说是一件极其痛苦的事,每次写完运行总是有错,如果用的是本地数据库的话还好,可以在本机调试SQL,那如果在数据库在服务器上面,调试被禁用,那就悲剧了~ 最近,由于工作需求,写一个存储过程,有几十个参数,数据库在服务器上面,写完了,测试完查询语句没有问题,但是到了项目里面查询时就出错,很是气人!想到了用SQL Profiler这个工具,打开选择默认设置,开

统计分析SQL Server Profiler 跟踪的SQL

--跟踪文件读入到表中分析 SELECT * INTO ZGSJY FROM fn_trace_gettable('E:\wxxcdbprofiler.trc', default); --某时间内,最耗时SQL select TOP 100 SUBSTRING(Textdata,1,660) as '名称', count(*) as '数量', sum(duration/1000) as '总运行时间ms', avg(duration/1000) as '平均运行时间ms', avg(cpu)