查杀死锁

Create Proc [dbo].[p_lockinfo]
          @kill_lock_spid      Bit = 1, --是否杀掉死锁的进程,1 杀掉, 0 仅显示
          @show_spid_if_nolock Bit = 1 --如果没有死锁的进程,是否显示正常进程信息,1 显示,0 不显示
                                     
As
  Declare
    @count Int,
    @s     Nvarchar(1000),
    @i     Int
  Select   id = Identity(Int,1,1),
           标志,
           进程ID = spid,
           线程ID = kpid,
           块进程ID = blocked,
           数据库ID = dbid,
           数据库名 = Db_name(dbid),
           用户ID = uid,
           用户名 = loginame,
           累计CPU时间 = cpu,
           登陆时间 = login_time,
           打开事务数 = open_tran,
           进程状态 = status,
           工作站名 = hostname,
           应用程序名 = program_name,
           工作站进程ID = hostprocess,
           域名 = nt_domain,
           网卡地址 = net_address
  Into     #t
  From     (Select 标志 = '死锁的进程',
                   spid,
                   kpid,
                   a.blocked,
                   dbid,
                   uid,
                   loginame,
                   cpu,
                   login_time,
                   open_tran,
                   status,
                   hostname,
                   program_name,
                   hostprocess,
                   nt_domain,
                   net_address,
                   s1 = a.spid,
                   s2 = 0
            From   master..sysprocesses a
                   Join (Select   blocked
                         From     master..sysprocesses
                         Group By blocked) b
                     On a.spid = b.blocked
            Where  a.blocked = 0
            Union All
            Select '|_牺牲品_>',
                   spid,
                   kpid,
                   blocked,
                   dbid,
                   uid,
                   loginame,
                   cpu,
                   login_time,
                   open_tran,
                   status,
                   hostname,
                   program_name,
                   hostprocess,
                   nt_domain,
                   net_address,
                   s1 = blocked,
                   s2 = 1
            From   master..sysprocesses a
            Where  blocked <> 0) a
  Order By s1,
           s2
  Select @count =@@ rowcount,
         @i = 1
  If @count = 0
     And @show_spid_if_nolock = 1
    Begin
      Insert #t
      Select 标志 = '正常的进程',
             spid,
             kpid,
             blocked,
             dbid,
             Db_name(dbid),
             uid,
             loginame,
             cpu,
             login_time,
             open_tran,
             status,
             hostname,
             program_name,
             hostprocess,
             nt_domain,
             net_address
      From   master..sysprocesses
      Set @count =@@ rowcount
    End
  If @count > 0
    Begin
      Create Table #t1 (
        id        Int Identity( 1  , 1  ),
        a         Nvarchar(30),
        b         Int,
        EventInfo Nvarchar(255))
      If @kill_lock_spid = 1
        Begin
          Declare
            @spid Varchar(10),
            @标志   Varchar(10)
          While @i <= @count
            Begin
              Select @spid = 进程ID,
                     @标志 = 标志
              From   #t
              Where  id = @i
              Insert #t1
              Exec( 'dbcc inputbuffer(' + @spid + ')')
              If @标志 = '死锁的进程'
                Exec( 'kill ' + @spid)
              Set @i = @i + 1
            End
        End
       Else
        While @i <= @count
          Begin
            Select @s = 'dbcc inputbuffer(' + Cast(进程ID As Varchar) + ')'
            From   #t
            Where  id = @i
            Insert #t1
            Exec( @s)
            Set @i = @i + 1
          End
      Select a.*,
             进程的SQL语句 = b.EventInfo
      From   #t a
             Join #t1 b
               On a.id = b.id
    End


Create Proc [dbo].[p_killspid]
           @dbname Varchar(200) --要关闭进程的数据库名
           
As
  Declare
    @sql Nvarchar(500)
  Declare
    @spid Nvarchar(20)
  Declare #tb Cursor  For
  Select spid = Cast(spid As Varchar(20))
  From   master..sysprocesses
  Where  dbid = Db_id(@dbname)
  Open #tb
  Fetch Next From #tb
  Into @spid
  While @@fetch_status = 0
    Begin
      Exec( 'kill ' + @spid)
      Fetch Next From #tb
      Into @spid
    End
  Close #tb
  Deallocate #tb



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Oracle RAC(Real Application Clusters)是一种集群数据库解决方案,它允许多个数据库实例在多台服务器上同时运行并共享存储。在使用Oracle RAC时,有时可能会遇到死锁(Deadlock)的情况,即两个或多个会话相互等待对方释放资源,导致数据库无法继续进行。 要解决Oracle RAC中的死锁问题,可以采取以下步骤: 1. 检查AWR报告:使用AWR(Automatic Workload Repository)报告可以了解是否存在死锁情况,并了解死锁的原因和影响范围。 2. 查看死锁链:通过查询V$LOCK和V$SESSION视图,可以获取死锁链的信息,包括死锁会话和死锁对象。 3. 确定死锁类型:了解死锁的类型可以帮助我们更好地解决问题。Oracle RAC中常见的死锁类型包括共享资源死锁(Shared Resource Deadlock)和LMD(Lock Manager Daemon)死锁。 4. 解除死锁:根据死锁类型和具体情况,可以采取不同的方法解除死锁。常见的方法包括重启数据库实例、杀死造成死锁的会话、手动调整资源争用等。 5. 优化应用程序:死锁问题可能由应用程序设计或数据库配置等因素引起。通过优化应用程序的设计和调整数据库的配置,可以减少死锁的发生。 6. 监控和预防:使用监控工具和警报系统,可以实时监控数据库的性能和死锁情况,并及时采取预防措施,如增加资源、优化SQL查询等。 总之,解决Oracle RAC中的死锁问题需要全面的分析和调整,涉及多个方面的知识和技术。及时响应和适当的优化措施可以帮助我们降低死锁的发生频率,并提高数据库的性能和可用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ice_baili

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值