如何利用查询提示(Hint)引导语句运行(2)

三.死锁案例(2014年11月23日晚补充)

这里我们来利用自己新建跟踪来跟踪一个死锁的发生过程,并且将其记录到我们的Trace文件中,这里我们来制作一个死锁

如何利用查询提示(Hint)引导语句运行

如何利用查询提示(Hint)引导语句运行

以上代码参照院子里大牛宋沄剑,这里我们利用系统的自带的profile进行设计追踪,我们直接选择系统自带的死锁模板,进行追踪

如何利用查询提示(Hint)引导语句运行

然后设置,默认的SPID为大于等于50,小于50的为系统自有事件

如何利用查询提示(Hint)引导语句运行

然后,我们利用上面的死锁脚本,运行获取死锁的捕捉

如何利用查询提示(Hint)引导语句运行

可以看到,我们已经顺利的追踪到这个死锁。我们知道这种追踪是高成本的,并且我们有时候不知道死锁发生的具体时间,所以不能一直开着这个Profile,出于性能考虑也不建议这么做,所以我们采用新建的Trace文件,来保存改脚本,然后重定向到我们自己的文件夹,将死锁的信息放置到该文件夹下,提供更大灵活性。

SQL Server本身自带的Profile工具就提供编辑脚本的功能,我们将上面的设计,导出成Trace脚本,我们点击“文件”,导出该设计脚本

如何利用查询提示(Hint)引导语句运行

将该脚本保存到一个位置,然后我们打开,我顺便将默认的文件路径添加上

/****************************************************/ /* Created by: SQL Server 2008 Profiler */ /* Date: 2014/11/23 20:28:11 */ /****************************************************/ -- Create a Queue declare @rc int declare @TraceID int declare @maxfilesize bigint --可以更改文件大小 set @maxfilesize = 5 --默认死锁文件放置目录 declare @FilePath nvarchar(max) set @FilePath=N'F:\SQLTest\DeadLock.trc' -- Please replace the text InsertFileNameHere, with an appropriate -- filename prefixed by a path, e.g., c:\MyFolder\MyTrace. The .trc extension -- will be appended to the filename automatically. If you are writing from -- remote server to local drive, please use UNC path and make sure server has -- write access to your network share exec @rc = sp_trace_create @TraceID output, 0, @FilePath, @maxfilesize, NULL if (@rc != 0) goto error -- Client side File and Table cannot be scripted -- Set the events declare @on bit set @on = 1 exec sp_trace_setevent @TraceID, 137, 15, @on exec sp_trace_setevent @TraceID, 137, 32, @on exec sp_trace_setevent @TraceID, 137, 1, @on exec sp_trace_setevent @TraceID, 137, 13, @on exec sp_trace_setevent @TraceID, 137, 22, @on exec sp_trace_setevent @TraceID, 148, 11, @on exec sp_trace_setevent @TraceID, 148, 12, @on exec sp_trace_setevent @TraceID, 148, 14, @on exec sp_trace_setevent @TraceID, 148, 1, @on exec sp_trace_setevent @TraceID, 26, 15, @on exec sp_trace_setevent @TraceID, 26, 32, @on exec sp_trace_setevent @TraceID, 26, 1, @on exec sp_trace_setevent @TraceID, 26, 9, @on exec sp_trace_setevent @TraceID, 26, 57, @on exec sp_trace_setevent @TraceID, 26, 2, @on exec sp_trace_setevent @TraceID, 26, 10, @on exec sp_trace_setevent @TraceID, 26, 11, @on exec sp_trace_setevent @TraceID, 26, 35, @on exec sp_trace_setevent @TraceID, 26, 12, @on exec sp_trace_setevent @TraceID, 26, 13, @on exec sp_trace_setevent @TraceID, 26, 6, @on exec sp_trace_setevent @TraceID, 26, 14, @on exec sp_trace_setevent @TraceID, 26, 22, @on exec sp_trace_setevent @TraceID, 25, 15, @on exec sp_trace_setevent @TraceID, 25, 32, @on exec sp_trace_setevent @TraceID, 25, 1, @on exec sp_trace_setevent @TraceID, 25, 9, @on exec sp_trace_setevent @TraceID, 25, 57, @on exec sp_trace_setevent @TraceID, 25, 2, @on exec sp_trace_setevent @TraceID, 25, 10, @on exec sp_trace_setevent @TraceID, 25, 11, @on exec sp_trace_setevent @TraceID, 25, 35, @on exec sp_trace_setevent @TraceID, 25, 12, @on exec sp_trace_setevent @TraceID, 25, 13, @on exec sp_trace_setevent @TraceID, 25, 6, @on exec sp_trace_setevent @TraceID, 25, 14, @on exec sp_trace_setevent @TraceID, 25, 22, @on exec sp_trace_setevent @TraceID, 59, 32, @on exec sp_trace_setevent @TraceID, 59, 1, @on exec sp_trace_setevent @TraceID, 59, 57, @on exec sp_trace_setevent @TraceID, 59, 2, @on exec sp_trace_setevent @TraceID, 59, 14, @on exec sp_trace_setevent @TraceID, 59, 22, @on exec sp_trace_setevent @TraceID, 59, 35, @on exec sp_trace_setevent @TraceID, 59, 12, @on exec sp_trace_setevent @TraceID, 60, 32, @on exec sp_trace_setevent @TraceID, 60, 9, @on exec sp_trace_setevent @TraceID, 60, 57, @on exec sp_trace_setevent @TraceID, 60, 10, @on exec sp_trace_setevent @TraceID, 60, 11, @on exec sp_trace_setevent @TraceID, 60, 35, @on exec sp_trace_setevent @TraceID, 60, 12, @on exec sp_trace_setevent @TraceID, 60, 6, @on exec sp_trace_setevent @TraceID, 60, 14, @on exec sp_trace_setevent @TraceID, 60, 22, @on exec sp_trace_setevent @TraceID, 189, 15, @on exec sp_trace_setevent @TraceID, 189, 32, @on exec sp_trace_setevent @TraceID, 189, 1, @on exec sp_trace_setevent @TraceID, 189, 9, @on exec sp_trace_setevent @TraceID, 189, 57, @on exec sp_trace_setevent @TraceID, 189, 2, @on exec sp_trace_setevent @TraceID, 189, 10, @on exec sp_trace_setevent @TraceID, 189, 11, @on exec sp_trace_setevent @TraceID, 189, 35, @on exec sp_trace_setevent @TraceID, 189, 12, @on exec sp_trace_setevent @TraceID, 189, 13, @on exec sp_trace_setevent @TraceID, 189, 6, @on exec sp_trace_setevent @TraceID, 189, 14, @on exec sp_trace_setevent @TraceID, 189, 22, @on exec sp_trace_setevent @TraceID, 45, 16, @on exec sp_trace_setevent @TraceID, 45, 1, @on exec sp_trace_setevent @TraceID, 45, 9, @on exec sp_trace_setevent @TraceID, 45, 17, @on exec sp_trace_setevent @TraceID, 45, 10, @on exec sp_trace_setevent @TraceID, 45, 18, @on exec sp_trace_setevent @TraceID, 45, 11, @on exec sp_trace_setevent @TraceID, 45, 35, @on exec sp_trace_setevent @TraceID, 45, 12, @on exec sp_trace_setevent @TraceID, 45, 13, @on exec sp_trace_setevent @TraceID, 45, 6, @on exec sp_trace_setevent @TraceID, 45, 14, @on exec sp_trace_setevent @TraceID, 45, 22, @on exec sp_trace_setevent @TraceID, 45, 15, @on exec sp_trace_setevent @TraceID, 44, 1, @on exec sp_trace_setevent @TraceID, 44, 9, @on exec sp_trace_setevent @TraceID, 44, 10, @on exec sp_trace_setevent @TraceID, 44, 11, @on exec sp_trace_setevent @TraceID, 44, 35, @on exec sp_trace_setevent @TraceID, 44, 12, @on exec sp_trace_setevent @TraceID, 44, 6, @on exec sp_trace_setevent @TraceID, 44, 14, @on exec sp_trace_setevent @TraceID, 44, 22, @on exec sp_trace_setevent @TraceID, 41, 15, @on exec sp_trace_setevent @TraceID, 41, 16, @on exec sp_trace_setevent @TraceID, 41, 1, @on exec sp_trace_setevent @TraceID, 41, 9, @on exec sp_trace_setevent @TraceID, 41, 17, @on exec sp_trace_setevent @TraceID, 41, 10, @on exec sp_trace_setevent @TraceID, 41, 18, @on exec sp_trace_setevent @TraceID, 41, 11, @on exec sp_trace_setevent @TraceID, 41, 35, @on exec sp_trace_setevent @TraceID, 41, 12, @on exec sp_trace_setevent @TraceID, 41, 13, @on exec sp_trace_setevent @TraceID, 41, 6, @on exec sp_trace_setevent @TraceID, 41, 14, @on exec sp_trace_setevent @TraceID, 40, 1, @on exec sp_trace_setevent @TraceID, 40, 9, @on exec sp_trace_setevent @TraceID, 40, 6, @on exec sp_trace_setevent @TraceID, 40, 10, @on exec sp_trace_setevent @TraceID, 40, 14, @on exec sp_trace_setevent @TraceID, 40, 11, @on exec sp_trace_setevent @TraceID, 40, 35, @on exec sp_trace_setevent @TraceID, 40, 12, @on -- Set the Filters declare @intfilter int declare @bigintfilter bigint exec sp_trace_setfilter @TraceID, 10, 0, 7, N'SQL Server Profiler - efbc9d24-69cd-465f-8daf-e38493da0332' -- Set the trace status to start exec sp_trace_setstatus @TraceID, 1 -- display trace id for future references select TraceID=@TraceID goto finish error: select ErrorCode=@rc finish: go

我们只需要将这个脚本运行就可以,当然此段脚本,在实例重启的时候,所有的trace都会删除掉,可以将该段代码改成存储过程,然后设置成实例启动的时候运行,

方法参考本篇的上半部分。

当然我们也可以设置别的参数,比如启动时间,运行时间,跟踪文件大小,位置,数量等,删除不必要的trace跟踪事件...

当运行到一段时间之后,我们直接拷贝下来,找台电脑分析就可以了。

更灵活的方式是采取非业务高峰期,利用SQL Server自带的邮件提醒功能,直接检测出问题,然后Send Email....

四.SQL Server中黑匣子(2014年11月28日晚补充)

黑匣子作为飞机出现事故后的追踪利器,在微软的SQL Server这个数据库中默认也给装上了此引擎,但是没有开启,此功能可能帮助我们诊断间歇性的服务器崩溃。它比我们上面介绍的默认开启的跟踪跟踪的信息更全,跟踪更大一些。其内容包含了:“SP:启动”、“SQL:批处理启动”、异常和注意等事件

这个跟踪通过在sp_trace_create的默认@option参数设置为8来配置的。代码如下:

DECLARE @Traced INT EXEC sp_trace_create @Traced OUTPUT, @options=8 EXEC sp_trace_setstatus @Traced,1

通过以上的配置会自动配置成两个滚动文件,当达到默认的最大文件容量5MB的时候,就在两个文件中循环滚动依次更新。

当然如果感觉生成的文件5MB有点小,可以手动配置更改大小,或者自定义文件路径,这些都是允许自定义设置的。

DECLARE @TraceID INT DECLARE @maxfilesize BIGINT SET @maxfilesize=25 DECLARE @tracefile nvarchar(245) SET @tracefile=N'F:\SQLTest\TRACE\MYTRACE.trc' EXEC sp_trace_create @TraceID OUTPUT, @options=8, @tracefile=NULL, @maxfilesize=@maxfilesize EXEC sp_trace_setstatus @TraceID,1


此方法能将数据库执行的所有SQL滚动记录下来,以防止SQL Server宕机之后的事故查找。

如何利用查询提示(Hint)引导语句运行

参考我博文的上面介绍,只需要将这个方法存储于存储过程,然后设置成实例启动后运行,那么恭喜你的SQL Server已经成功装上了黑匣子引擎,假如有一天突然宕机,我们只需要打开此黑匣子就可以。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/a57aab531727c0809398ae80c7173a18.html