如何捕获锁定/锁定消耗的SPID/进程

2020-08-21 01:28发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)嗨, 我有7 TB大小的大型S...

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,

我有7 TB大小的大型SAP ASE数据库,正在运行数千个作业。 我们在深夜遇到了"锁用尽"问题,很难找到哪个SPID/进程占用了所有锁。

在DBA控制台中找不到哪个会话消耗了所有锁的信息。

在ASE日志中,所有可用的受害会话信息均有效,而并非元凶会话。

请建议我们如何找到作业消耗所有锁的会话,或者将来如何进行监视。

此致

Bhupendra Sharma

3条回答
Bunny_CDM
2020-08-21 01:56

这是我用来监视锁的详细存储过程。 注意,此proc包含额外的代码,可忽略当有人运行" reorg rebuild

"命令时弹出的错误。 该过程还显示偶尔的锁定请求,这些请求实际上还不是锁定(但仍然可以被阻止)。 感谢所有反馈:

使用sybsystemprocs
 走
 创建过程sp_lock2 @verbose int = 0
 如
 开始
   设置兼容性模式
   设置为nocount
   if(@verbose = 0)
   开始
     -如果不详细,则显示每种spid和锁定类型的计数
     选择p.spid,p.status,p.hostname,hostpid = p.hostprocess,p.program_name,p.cmd,BlockedOnSpid = p.blocked,
            object = case when(p.cmd =" REORG"和p.tran_name如"%ALTER TABLE ADM%"和p.tran_name如"%dbid =" + convert(varchar(20),l.DBID)+"%"
                              和p.tran_name,例如"%ID =" + convert(varchar(20),l.ObjectID)+"%"
                             )
                        然后l.DBName +" .." + convert(varchar(20),l.ObjectID)
                        else l.DBName +" .." + object_name(l.ObjectID,l.DBID)
                   结束,
            l.LockID,l.LockState,l.LockType,l.LockLevel,WaitSecs = l.WaitTime,l.BlockedState,BlockedByLockID = l.BlockedBy,cnt = count(*)
     进入#tmp_cnt
     来自master..sysprocesses p,master..monLocks l
     其中p.spid = l.SPID和p.spid!= @@ spid
     -从object_name()过滤出虚假错误消息,例如:
     -数据库''中的对象''正在进行REORG操作。 稍后重试查询。
     -对于在带有w/dbid = 15的数据库中运行" reorg rebuild "的进程,sysprocesses将显示一个tran_name,例如" $ ALTER TABLE ADM  ID = 192000684 dbid = 15 fid = 41"
     按p.spid,p.status,p.hostname,p.hostprocess,p.program_name,p.cmd,p.blocked分组
              (p.cmd =" REORG"和p.tran_name如"%ALTER TABLE ADM%"和p.tran_name如"%dbid =" + convert(varchar(20),l.DBID)+"%"
                              和p.tran_name,例如"%ID =" + convert(varchar(20),l.ObjectID)+"%"
                             )
                        然后l.DBName +" .." + convert(varchar(20),l.ObjectID)
                        else l.DBName +" .." + object_name(l.ObjectID,l.DBID)
                   结束,
              l.LockID,l.LockState,l.LockType,l.LockLevel,l.WaitTime,l.BlockedState,l.BlockedBy


     exec sp_autoformat @fulltabname =" #tmp_cnt",
                        @selectlist =" spid,状态,主机名,hostpid,程序名,cmd,BlockedOnSpid,对象,LockID,LockState,LockType,LockLevel,WaitSecs,BlockedState,BlockedByLockID,cnt",
                        @orderby ="按spid,状态,主机名,hostpid,program_name,cmd,BlockedOnSpid,object,LockID,LockState,LockType,LockLevel进行排序"
     删除表#tmp_cnt
   结束
   其他
   开始
     -对于详细输出,显示每个页面/行的锁定并显示SourceCodeID
     选择p.spid,p.status,p.hostname,hostpid = p.hostprocess,p.program_name,p.cmd,BlockedOnSpid = p.blocked,
            object = case when(p.cmd =" REORG"和p.tran_name如"%ALTER TABLE ADM%"和p.tran_name如"%dbid =" + convert(varchar(20),l.DBID)+"%"
                              和p.tran_name,例如"%ID =" + convert(varchar(20),l.ObjectID)+"%"
                             )
                        然后l.DBName +" .." + convert(varchar(20),l.ObjectID)
                        else l.DBName +" .." + object_name(l.ObjectID,l.DBID)
                   结束,
            l.LockID,l.LockState,l.LockType,l.LockLevel,WaitSecs = l.WaitTime,l.BlockedState,BlockedByLockID = l.BlockedBy,l.PageNumber,l.RowNumber,l.SourceCodeID
     进入#tmp
     来自master..sysprocesses p,master..monLocks l
     其中p.spid = l.SPID和p.spid!= @@ spid
     exec sp_autoformat @fulltabname =" #tmp",
                        @selectlist =" spid,状态,主机名,hostpid,program_name,cmd,BlockedOnSpid,对象,LockID,LockState,LockType,LockLevel,WaitSecs,BlockedState,BlockedByLockID,PageNumber,RowNumber,SourceCodeID",
                        @orderby ="按spid,状态,主机名,hostpid,program_name,cmd,BlockedOnSpid,object,LockID,LockState,LockType,LockLevel进行排序"
     删除表#tmp
   结束
 结束
 走

 

此外,现在是否有发布此类共享代码的地方? (也许在github上?)

一周热门 更多>

向帮助了您的知道网友说句感谢的话吧!