设为首页 收藏本站
查看: 1080|回复: 0

[经验分享] 【QQ群】使用SQL PROFILER对性能影响

[复制链接]

尚未签到

发表于 2018-10-18 12:09:31 | 显示全部楼层 |阅读模式
问题描述:
  怎么捕获和记录死锁,大家知道SQL PROFILER对性能影响多大?
DSC0000.jpg

解决方案:
  我们知道,可以使用SQL Server自带的Profiler工具来跟踪死锁信息。但这种方式有一个很大的敝端,就是消耗很大。据国外某大神测试,profiler甚至可以占到服务器总带宽的35%,所以,在一个繁忙的系统中,使用profiler显然不是一个好主意,下面我介绍两种消耗比较少的方法。其中第二种的消耗最小,在最繁忙的系统中也可使用。第一种最为灵活,可满足多种应用。
方法一:利用SQL Server代理(Alert+Job)
  具体步骤如下:
1.首先使用下面的命令,将有关的跟踪标志启用。
DBCC TRACEON (3605,1204,1222,-1)  
  说明:
  3605 将DBCC的结果输出到错误日志。
  1204 返回参与死锁的锁的资源和类型,以及受影响的当前命令。
  1222 返回参与死锁的锁的资源和类型,以及使用了不符合任何 XSD 架构的 XML 格式的受影响的当前命令(比1204更进一步,SQL 2005及以上可用)。
  -1 以全局方式打开指定的跟踪标记。
  以上跟踪标志作用域都是全局,即在SQL Server运行过程中,会一直发挥作用,直到SQL Server重启。
  如果要确保SQL Server在重启后自动开启这些标志,可以在SQL Server服务启动选项中,使用 /T 启动选项指定跟踪标志在启动期间设置为开。(位于SQL Server配置管理器->SQL Server服务->SQL Server->属性->高级-> 启动参数)
  在运行上面的语句后,当SQL Server中发生死锁时,已经可以在错误日志中看到了,但还不够直观(和其它信息混在一起)。(SSMS -> SQL Server实例 -> 管理 -> SQL Server日志)
2.建表,存放死锁记录
USE [Cole] --Cole是我的示例数据库,你可以根据实际情况修改。  
GO
  
CREATE TABLE DeadLockLog (
  
id int IDENTITY (1, 1) NOT NULL,
  
LogDate DATETIME,
  
ProcessInfo VARCHAR(10),
  
ErrorText VARCHAR(MAX)
  
)
  
GO
3.建立JOB
  新建一个JOB(假设名称为DeadLockJob),在"步骤"中新建一步骤,随便写一个步骤名称,数据库为"Cole"(见2.建表),在"命令"栏中输入以下语句:
--新建临时表  IF OBJECT_ID('tempdb.dbo.#ErrorLog') IS Not Null  
DROP TABLE #ErrorLog
  
CREATE TABLE #ErrorLog (Id int IDENTITY (1, 1) NOT NULL, a DATETIME, b VARCHAR(10), c VARCHAR(MAX))
  

  
--将当前日志记录插入临时表
  
INSERT INTO #ErrorLog EXEC master.dbo.sp_readerrorlog
  

  
--将死锁信息插入用户表
  
insert DeadLockLog
  
select a, b, c
  
from #ErrorLog
  
where id >= (select MAX(id) from #ErrorLog WHERE c Like '%Deadlock encountered%')
  
DROP TABLE #ErrorLog
4.新建警报
  在"新建警报"窗体的"常规"选项卡中,进行以下设置:
  名称:可根据实际自行命名,这里我用DeadLockAlert
  类型:选择"SQL Server性能条件警报"
  对象:SQLServer:Locks
  计数器:Number of Deadlocks/sec
  实例:_Total
  计数器满足以下条件时触发警报:高于值:0
  设置完成后,应该如下图所示:

  在"响应"选项卡中,选中"执行作业",并选择步骤3中我们新建的作业(即DeadlockJob)
  到这里为止,我们已经完成了全部步骤,以后,你就可以随时查询DeadLockLog表,来显示死锁信息了。
方法二:利用服务器端跟踪。
  具体实现步骤如下:
1.编写如下脚本,并执行
-- 定义参数  
declare @rc int
  
declare @TraceID int
  
declare @maxfilesize bigint
  
set @maxfilesize = 5
  
-- 初始化跟踪
  
exec @rc = sp_trace_create @TraceID output, 0, N'e:\DbLog\deadlockdetect', @maxfilesize, NULL
  
--此处的e:\dblog\deadlockdetect是文件名(可自行修改),SQL会自动在后面加上.trc的扩展名
  
if (@rc != 0) goto error
  
-- 设置跟踪事件
  
declare @on bit
  
set @on = 1
  
--下述语句中的148指的是locks:deadlock graph事件(参见sys.trace_events),12指的是spid列(参见sys.trace_columns)
  
exec sp_trace_setevent @TraceID, 148, 12, @on
  
exec sp_trace_setevent @TraceID, 148, 11, @on
  
exec sp_trace_setevent @TraceID, 148, 4, @on
  
exec sp_trace_setevent @TraceID, 148, 14, @on
  
exec sp_trace_setevent @TraceID, 148, 26, @on
  
exec sp_trace_setevent @TraceID, 148, 64, @on
  
exec sp_trace_setevent @TraceID, 148, 1, @on
  
-- 启动跟踪
  
exec sp_trace_setstatus @TraceID, 1
  
-- 记录下跟踪ID,以备后面使用
  
select TraceID = @TraceID
  
goto finish
  
error:
  
select ErrorCode=@rc
  
finish:
  
go
  运行上述语句后,每当SQL Server中发生死锁事件,都会自动往文件e:\DbLog\deadlockdetect.trc中插入一条记录。
2.暂停和停止服务器端跟踪
  如果要暂停上面的服务器端跟踪,可运行下面的语句:
exec sp_trace_setstatus 1, 0 --第一个参数表示TraceID,即步骤1中的输出参数。第二个参数表示将状态改为0,即暂停  如果要停止上面的服务器端跟踪,可运行下面的语句:
exec sp_trace_setstatus 1, 2 --第一个参数表示TraceID,即步骤1中的输出参数。第二个参数表示将状态改为2,即停止3.查看跟踪文件内容
  对于上面生成的跟踪文件(e:\DbLog\deadlockdetect.trc),可通过两种方法查看:
  1).执行t-sql命令
select * from fn_trace_gettable('e:\DbLog\deadlockdetect.trc',1)  结果中的TextData列即以XML的形式返回死锁的详细信息。
  2).在SQL Server Profiler中打开。
  依次 进入Profiler -> 打开跟踪文件 ->选择e:\DbLog\deadlockdetect.trc,就可以看到以图形形式展现的死锁信息了。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-623183-1-1.html 上篇帖子: vs2010不能正确加载 'VSTS for Database Professionals Sql Server Data-tier Application'包 下篇帖子: 关于Excel与SQL结合的优势所在
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表