osql/sqlcmd 工具是一个 SqlServer的命令提示符工具,我们可以使用它运行 Transact-SQL 语句和脚本文件。该工具所在目录:C:\Program Files\Microsoft SQL Server\110\Tools\Binn

交互式输入 Transact-SQL 语句,如下

  1. C:\Users\Administrator>osql -E
  2. 1> set nocount on;
  3. 2> go
  4. 1> select getdate();
  5. 2> go
  6.  
  7. -----------------------
  8. 2015-06-20 18:02:18.053
  9.  
  10. 1> exit
  11.  
  12. C:\Users\Administrator>

osql的作用不仅仅局限于此,其他参数如下

 

强大之处在于:该工具可以结合存储过程,检查并输出锁、闩等资源的阻塞情况。

  1. 创建存储过程:sp_blocker_pss80
  2. 创建SQL脚本:定时执行sp_blocker_pss80存储过程
  3. 在osql命令中调用该SQL脚本,并将结果输出到文件

 

以下分别是sp_blocker_pss80、SQL脚本、osql命令示例及对应的输出结果

  1. use master
  2. GO
  3. if exists (select * from sysobjects where id = object_id('dbo.sp_blocker_pss80') and sysstat & 0xf = 4)
  4. drop procedure dbo.sp_blocker_pss80
  5. GO
  6. create procedure dbo.sp_blocker_pss80 (@latch int = 0, @fast int = 1, @appname sysname='PSSDIAG')
  7. as
  8. --version 16SP3
  9. if is_member('sysadmin')=0
  10. begin
  11. print 'Must be a member of the sysadmin group in order to run this procedure'
  12. return
  13. end
  14.  
  15. set nocount on
  16. SET LANGUAGE 'us_english'
  17. declare @spid varchar(6)
  18. declare @blocked varchar(6)
  19. declare @time datetime
  20. declare @time2 datetime
  21. declare @dbname nvarchar(128)
  22. declare @status sql_variant
  23. declare @useraccess sql_variant
  24.  
  25. set @time = getdate()
  26. declare @probclients table(spid smallint, ecid smallint, blocked smallint, waittype binary(2), dbid smallint,
  27. ignore_app tinyint, primary key (blocked, spid, ecid))
  28. insert @probclients select spid, ecid, blocked, waittype, dbid,
  29. case when convert(varchar(128),hostname) = @appname then 1 else 0 end
  30. from sysprocesses where blocked!=0 or waittype != 0x0000
  31.  
  32. if exists (select spid from @probclients where ignore_app != 1 or waittype != 0x020B)
  33. begin
  34. set @time2 = getdate()
  35. print ''
  36. print '8.2 Start time: ' + convert(varchar(26), @time, 121) + ' ' + convert(varchar(12), datediff(ms,@time,@time2))
  37.  
  38. insert @probclients select distinct blocked, 0, 0, 0x0000, 0, 0 from @probclients
  39. where blocked not in (select spid from @probclients) and blocked != 0
  40.  
  41. if (@fast = 1)
  42. begin
  43. print ''
  44. print 'SYSPROCESSES ' + ISNULL (@@servername,'(null)') + ' ' + str(@@microsoftversion)
  45.  
  46. select spid, status, blocked, open_tran, waitresource, waittype,
  47. waittime, cmd, lastwaittype, cpu, physical_io,
  48. memusage, last_batch=convert(varchar(26), last_batch,121),
  49. login_time=convert(varchar(26), login_time,121),net_address,
  50. net_library, dbid, ecid, kpid, hostname, hostprocess,
  51. loginame, program_name, nt_domain, nt_username, uid, sid,
  52. sql_handle, stmt_start, stmt_end
  53. from master..sysprocesses
  54. where blocked!=0 or waittype != 0x0000
  55. or spid in (select blocked from @probclients where blocked != 0)
  56. or spid in (select spid from @probclients where blocked != 0)
  57.  
  58. print 'ESP ' + convert(varchar(12), datediff(ms,@time2,getdate()))
  59.  
  60. print ''
  61. print 'SYSPROC FIRST PASS'
  62. select spid, ecid, waittype from @probclients where waittype != 0x0000
  63.  
  64. if exists(select blocked from @probclients where blocked != 0)
  65. begin
  66. print 'Blocking via locks at ' + convert(varchar(26), @time, 121)
  67. print ''
  68. print 'SPIDs at the head of blocking chains'
  69. select spid from @probclients
  70. where blocked = 0 and spid in (select blocked from @probclients where spid != 0)
  71. if @latch = 0
  72. begin
  73. print 'SYSLOCKINFO'
  74. select @time2 = getdate()
  75.  
  76. select spid = convert (smallint, req_spid),
  77. ecid = convert (smallint, req_ecid),
  78. rsc_dbid As dbid,
  79. rsc_objid As ObjId,
  80. rsc_indid As IndId,
  81. Type = case rsc_type when 1 then 'NUL'
  82. when 2 then 'DB'
  83. when 3 then 'FIL'
  84. when 4 then 'IDX'
  85. when 5 then 'TAB'
  86. when 6 then 'PAG'
  87. when 7 then 'KEY'
  88. when 8 then 'EXT'
  89. when 9 then 'RID'
  90. when 10 then 'APP' end,
  91. Resource = substring (rsc_text, 1, 16),
  92. Mode = case req_mode + 1 when 1 then NULL
  93. when 2 then 'Sch-S'
  94. when 3 then 'Sch-M'
  95. when 4 then 'S'
  96. when 5 then 'U'
  97. when 6 then 'X'
  98. when 7 then 'IS'
  99. when 8 then 'IU'
  100. when 9 then 'IX'
  101. when 10 then 'SIU'
  102. when 11 then 'SIX'
  103. when 12 then 'UIX'
  104. when 13 then 'BU'
  105. when 14 then 'RangeS-S'
  106. when 15 then 'RangeS-U'
  107. when 16 then 'RangeIn-Null'
  108. when 17 then 'RangeIn-S'
  109. when 18 then 'RangeIn-U'
  110. when 19 then 'RangeIn-X'
  111. when 20 then 'RangeX-S'
  112. when 21 then 'RangeX-U'
  113. when 22 then 'RangeX-X'end,
  114. Status = case req_status when 1 then 'GRANT'
  115. when 2 then 'CNVT'
  116. when 3 then 'WAIT' end,
  117. req_transactionID As TransID, req_transactionUOW As TransUOW
  118. from master.dbo.syslockinfo s,
  119. @probclients p
  120. where p.spid = s.req_spid
  121.  
  122. print 'ESL ' + convert(varchar(12), datediff(ms,@time2,getdate()))
  123. end -- latch not set
  124. end
  125. else
  126. print 'No blocking via locks at ' + convert(varchar(26), @time, 121)
  127. print ''
  128. end -- fast set
  129.  
  130. else
  131. begin -- Fast not set
  132. print ''
  133. print 'SYSPROCESSES ' + ISNULL (@@servername,'(null)') + ' ' + str(@@microsoftversion)
  134.  
  135. select spid, status, blocked, open_tran, waitresource, waittype,
  136. waittime, cmd, lastwaittype, cpu, physical_io,
  137. memusage, last_batch=convert(varchar(26), last_batch,121),
  138. login_time=convert(varchar(26), login_time,121),net_address,
  139. net_library, dbid, ecid, kpid, hostname, hostprocess,
  140. loginame, program_name, nt_domain, nt_username, uid, sid,
  141. sql_handle, stmt_start, stmt_end
  142. from master..sysprocesses
  143.  
  144. print 'ESP ' + convert(varchar(12), datediff(ms,@time2,getdate()))
  145.  
  146. print ''
  147. print 'SYSPROC FIRST PASS'
  148. select spid, ecid, waittype from @probclients where waittype != 0x0000
  149.  
  150. if exists(select blocked from @probclients where blocked != 0)
  151. begin
  152. print 'Blocking via locks at ' + convert(varchar(26), @time, 121)
  153. print ''
  154. print 'SPIDs at the head of blocking chains'
  155. select spid from @probclients
  156. where blocked = 0 and spid in (select blocked from @probclients where spid != 0)
  157. if @latch = 0
  158. begin
  159. print 'SYSLOCKINFO'
  160. select @time2 = getdate()
  161.  
  162. select spid = convert (smallint, req_spid),
  163. ecid = convert (smallint, req_ecid),
  164. rsc_dbid As dbid,
  165. rsc_objid As ObjId,
  166. rsc_indid As IndId,
  167. Type = case rsc_type when 1 then 'NUL'
  168. when 2 then 'DB'
  169. when 3 then 'FIL'
  170. when 4 then 'IDX'
  171. when 5 then 'TAB'
  172. when 6 then 'PAG'
  173. when 7 then 'KEY'
  174. when 8 then 'EXT'
  175. when 9 then 'RID'
  176. when 10 then 'APP' end,
  177. Resource = substring (rsc_text, 1, 16),
  178. Mode = case req_mode + 1 when 1 then NULL
  179. when 2 then 'Sch-S'
  180. when 3 then 'Sch-M'
  181. when 4 then 'S'
  182. when 5 then 'U'
  183. when 6 then 'X'
  184. when 7 then 'IS'
  185. when 8 then 'IU'
  186. when 9 then 'IX'
  187. when 10 then 'SIU'
  188. when 11 then 'SIX'
  189. when 12 then 'UIX'
  190. when 13 then 'BU'
  191. when 14 then 'RangeS-S'
  192. when 15 then 'RangeS-U'
  193. when 16 then 'RangeIn-Null'
  194. when 17 then 'RangeIn-S'
  195. when 18 then 'RangeIn-U'
  196. when 19 then 'RangeIn-X'
  197. when 20 then 'RangeX-S'
  198. when 21 then 'RangeX-U'
  199. when 22 then 'RangeX-X'end,
  200. Status = case req_status when 1 then 'GRANT'
  201. when 2 then 'CNVT'
  202. when 3 then 'WAIT' end,
  203. req_transactionID As TransID, req_transactionUOW As TransUOW
  204. from master.dbo.syslockinfo
  205.  
  206. print 'ESL ' + convert(varchar(12), datediff(ms,@time2,getdate()))
  207. end -- latch not set
  208. end
  209. else
  210. print 'No blocking via locks at ' + convert(varchar(26), @time, 121)
  211. print ''
  212. end -- Fast not set
  213.  
  214. print 'DBCC SQLPERF(WAITSTATS)'
  215. dbcc sqlperf(waitstats)
  216.  
  217. Print ''
  218. Print '*********************************************************************'
  219. Print 'Print out DBCC Input buffer for all blocked or blocking spids.'
  220. Print '*********************************************************************'
  221.  
  222. declare ibuffer cursor fast_forward for
  223. select distinct cast (spid as varchar(6)) as spid
  224. from @probclients
  225. where (spid <> @@spid) and
  226. ((blocked!=0 or (waittype != 0x0000 and ignore_app = 0))
  227. or spid in (select blocked from @probclients where blocked != 0))
  228. open ibuffer
  229. fetch next from ibuffer into @spid
  230. while (@@fetch_status != -1)
  231. begin
  232. print ''
  233. print 'DBCC INPUTBUFFER FOR SPID ' + @spid
  234. exec ('dbcc inputbuffer (' + @spid + ')')
  235.  
  236. fetch next from ibuffer into @spid
  237. end
  238. deallocate ibuffer
  239.  
  240. Print ''
  241. Print '*******************************************************************************'
  242. Print 'Print out DBCC OPENTRAN for active databases for all blocked or blocking spids.'
  243. Print '*******************************************************************************'
  244. declare ibuffer cursor fast_forward for
  245. select distinct cast (dbid as varchar(6)) from @probclients
  246. where dbid != 0
  247. open ibuffer
  248. fetch next from ibuffer into @spid
  249. while (@@fetch_status != -1)
  250. begin
  251. print ''
  252. set @dbname = db_name(@spid)
  253. set @status = DATABASEPROPERTYEX(@dbname,'Status')
  254. set @useraccess = DATABASEPROPERTYEX(@dbname,'UserAccess')
  255. print 'DBCC OPENTRAN FOR DBID ' + @spid + ' ['+ @dbname + ']'
  256. if @Status = N'ONLINE' and @UserAccess != N'SINGLE_USER'
  257. dbcc opentran(@dbname)
  258. else
  259. print 'Skipped: Status=' + convert(nvarchar(128),@status)
  260. + ' UserAccess=' + convert(nvarchar(128),@useraccess)
  261.  
  262. print ''
  263. if @spid = '2' select @blocked = 'Y'
  264. fetch next from ibuffer into @spid
  265. end
  266. deallocate ibuffer
  267. if @blocked != 'Y'
  268. begin
  269. print ''
  270. print 'DBCC OPENTRAN FOR DBID 2 [tempdb]'
  271. dbcc opentran ('tempdb')
  272. end
  273.  
  274. print 'End time: ' + convert(varchar(26), getdate(), 121)
  275. end -- All
  276. else
  277. print '8 No Waittypes: ' + convert(varchar(26), @time, 121) + ' '
  278. + convert(varchar(12), datediff(ms,@time,getdate())) + ' ' + ISNULL (@@servername,'(null)')
  279. GO

 

创建一个SQL脚本文件:checkblk.sql

  1. WHILE 1=1
  2. BEGIN
  3. EXEC master.dbo.sp_blocker_pss80
  4. -- Or for fast mode
  5. -- EXEC master.dbo.sp_blocker_pss80 @fast=1
  6. -- Or for latch mode
  7. -- EXEC master.dbo.sp_blocker_pss80 @latch=1
  8. WAITFOR DELAY '00:00:15'
  9. END
  10. GO

 

  1. osql命令示例如下:
  1. C:\>osql -E -S server -i checkblk.sql -o checkresult.txt -w 2000
  1. server:表示服务器的机器名
  1. checkblk.sql:表示输入的脚本文件
  1. checkresult.txt:表示输出的结果文件
  1. 参数详情请使用命令 osql /? 查看
  1.  
  1. 执行结果如下:

SQL Server锁、闩等资源的阻塞诊断---osql/sqlcmd,sp_blocker_pss80的更多相关文章

  1. SQL SERVER 锁资源问题

    1204: cannot obtain a LOCK resource 在sql server 锁资源的限制基本是自动优化调整.如果调整过参数,可能在系统大批量查询的时候出现以上错误,或者是 alwa ...

  2. sql server 锁与事务拨云见日(上)

    一.概述 讲到sql server锁管理时,感觉它是一个大话题,因为它不但重要而且涉及的知识点很多,重点在于要掌握高并发要先要掌握锁与事务,涉及的知识点多它包括各式各样的锁,锁的组合,锁的排斥,锁延伸 ...

  3. SQL Server锁类型

    SQL Server锁类型(SQL)收藏 1. HOLDLOCK: 在该表上保持共享锁,直到整个事务结束,而不是在语句执行完立即释放所添加的锁. 2. NOLOCK:不添加共享锁和排它锁,当这个选项生 ...

  4. 转:sql server锁知识及锁应用

    sql server锁(lock)知识及锁应用 提示:这里所摘抄的关于锁的知识有的是不同sql server版本的,对应于特定版本时会有问题. 一 关于锁的基础知识 (一). 为什么要引入锁 当多个用 ...

  5. sql server 锁与事务拨云见日(中)

    一.事务的概述 上一章节里,重点讲到了锁,以及锁与事务的关系.离上篇发布时间好几天了,每天利用一点空闲时间还真是要坚持.听<明朝那些事儿>中讲到"人与人最小的差距是聪明,人与人最 ...

  6. SQL SERVER锁(LOCK)知识及锁应用

    提示:这里所摘抄的关于锁的知识有的是不同sql server版本的,对应于特定版本时会有问题. 一 关于锁的基础知识 (一). 为什么要引入锁 当多个用户同时对数据库的并发操作时会带来以下数据不一致的 ...

  7. sql server 性能调优 资源等待之网络I/O

    原文:sql server 性能调优 资源等待之网络I/O 一.概述 与网络I/O相关的等待的主要是ASYNC_NETWORK_IO,是指当sql server返回数据结果集给客户端的时候,会先将结果 ...

  8. [转]了解SQL Server锁争用:NOLOCK 和 ROWLOCK 的秘密_Mr_Indigo的空间

    了解SQL Server锁争用:NOLOCK 和 ROWLOCK 的秘密 关系型数据库,如SQL Server,使用锁来避免多用户修改数据时的并发冲突.当一组数据被某个用户锁定时,除非第一个用户结束修 ...

  9. 了解SQL Server锁争用:NOLOCK 和 ROWLOCK 的秘密

    关系型数据库,如SQL Server,使用锁来避免多用户修改数据时的并发冲突.当一组数据被某个用户锁定时,除非第一个用户结束修改并释放锁,否则其他用户就无法修改该组数据. 有些数据库,包括SQL Se ...

随机推荐

  1. Unity3D ShaderLab 使用渐变纹理着色

    Unity3D ShaderLab 使用渐变纹理着色 在我们编写着色器的过程中,还可以通过渐变纹理来控制漫反射的光照颜色.这种做法同样在VALVE的军团要塞2中及其流行. 前期,请准备一个渐变色的图片 ...

  2. for else

  3. Day08_面向对象第三天

      1.代码块(掌握) 1.概述     由{}扩起来的代码称之为代码块,类或者方法也可认为是代码块,但是一般不这么说,我们平时所说的代码块指的是孤零零的{} 2.代码块作用     局部代码块作用  ...

  4. jquery zclip 复制黏贴功能不能实现

    按照http://www.steamdev.com/zclip/我实现一个简单的zclip test 以下是我的测试code: <!DOCTYPE html> <html> & ...

  5. Think Python - Chapter 16 - Classes and functions

    16.1 TimeAs another example of a user-defined type, we’ll define a class called Time that records th ...

  6. springmvc学习笔记---面向移动端支持REST API

    前言: springmvc对注解的支持非常灵活和飘逸, 也得web编程少了以往很大一坨配置项. 另一方面移动互联网的到来, 使得REST API变得流行, 甚至成为主流. 因此我们来关注下spring ...

  7. CSS--滚动条设置;

    CSS滚动条实现步骤及美化小技巧 1.overflow-y : 设置当对象的内容超过其指定高度时如何管理内容:overflow-x : 设置当对象的内容超过其指定宽度时如何管理内容. 参数:visib ...

  8. spark新能优化之广播共享数据

    如果你的算子函数中,使用到了特别大的数据,那么,这个时候,推荐将该数据进行广播.这样的话,就不至于将一个大数据拷贝到每一个task上去.而是给每个节点拷贝一份,然后节点上的task共享该数据. 这样的 ...

  9. opencv矩阵总结

    OpenCV 矩阵操作 CvMat 转自:http://hi.baidu.com/xiaoduo170/blog/item/10fe5e3f0fd252e455e72380.html 每回用矩阵都要查 ...

  10. 黑马程序员——JAVA基础之简述 类的继承、覆写

    ------- android培训.java培训.期待与您交流! ---------- 继承的概述: 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只 ...