首页 > 开发 > 综合 > 正文

MSSQL2005 SYS.SYSPROCESSES使用--整理帖

2024-07-21 02:44:53
字体:
来源:转载
供稿:网友
SQL SERVER 2005 SYS.SYSPROCESSES 的使用

(一)理論部份

sysprocesses 表中保存关于运行在 Microsoft® SQL Server™ 上的进程的信息。这些进程可以是客户端进程或系统进程。sysprocesses 只存储在 master 数据库中。

Sysprocesses各部份作用:

字段      數據類型   描述

spid       smallint    进程ID

kpid       smallint    线程ID

blocked    smallint    分块进程ID (spid)

waittype   binary(2) 保留

waittime   int 当前等待时间(以毫秒为单位)当进程不处于等待时,为 0。

lastwaittype nchar(32) 表示上次或当前等待类型名称的字符串。

waitresource nchar(32) 锁资源的文本化表示法。

dbid smallint 当前正由进程使用的数据库 ID。

uid smallint 执行命令的用户 ID。

cpu int 进程的累计CPU时间无论SET STATISTICS TIME ON选项是ON还是OFF都为所有进程更新该条目。

physical_io int 进程的累计磁盘读取和写入。

memusage int 当前分配给该进程的过程高速缓存中的页数。一个负数,表示进程正在释放由另一个进程分配的内存。

login_time datetime 客户端进程登录到服务器的时间。对于系统进程,是存储 SQL Server 启动发生的时间。

last_batch datetime 客户端进程上次执行远程存储过程调用或 EXECUTE 语句的时间。对于系统进程,是存储 SQL Server 启动发生的时间。

ecid smallint 用于唯一标识代表单个进程进行操作的子线程的执行上下文 ID。

open_tran smallint 进程的打开事务数。

status nchar(30) 进程 ID 状态(如运行、休眠等)。

sid binary(85) 用户的全局唯一标识符 (GUID)。

hostname nchar(128) 工作站的名称。

program_name nchar(128) 应用程序的名称。

hostprocess nchar(8) 工作站进程 ID 号。

cmd nchar(16) 当前正在执行的命令。

nt_domain nchar(128) 客户端的 Windows NT 4.0 域(如果使用 Windows 身份验证)或信任连接的 Windows NT 4.0 域。

nt_username nchar(128) 进程的 Windows NT 4.0用户名(如果使用 Windows 身份验证)或信任连接的 Windows NT 4.0 用户名。

net_address nchar(12) 指派给每个用户工作站上的网络接口卡唯一标识符。当用户登录时,该标识符插入 net_address 列。

net_library nchar(12) 用于存储客户端网络库的列。每个客户端进程都在网络连接上进入。网络连接有一个与这些进程关联的网络库,该网络库使得这些进程可以建立连接。有关更多信息,请参见客户端和服务器 Net-Library。

loginame nchar(128) 登录名。

(二)實戰部份

(2.1)恢复数据库而不能获得专门的访问,特别是恢复数据库时候,报错:(数据库正在被其他用户使用)

use master  

go

select  spid  

from sys.sysprocesses

where dbid=db_id('db_Sunrise') and spid<>@@spid

/*

spid

------

51

52

57

58

59

61

62

64

*/

KILL 51;

KILL 52 WITH STATUSONLY;

GO

--返回当前用户进程的会话 ID、登录名和用户名。

SELECT @@SPID AS 'ID',

       SYSTEM_USER AS 'Login Name',

       USER AS 'User Name'

--如果進程比較多,可以動態執行

declare @sql varchar(8000)

select @sql =coalesce(@sql,'') +'Kill '+CAST(spid AS VARCHAR(10))+ ';'

from sys.sysprocesses  WHERE DBID=DB_ID('db_wip')

exec(@sql)

(2.2)查詢死鎖,解決死鎖

概念:

死锁是一种可能发生在任何多线程系统中的状态,而不仅仅发生在关系数据库管理系统中。多线程系统中的一个线程可能获取一个或多个资源(如锁)。如果正获取的资源当前为另一线程所拥有,则第一个线程可能必须等待拥有线程释放目标资源。这时就说等待线程在那个特定资源上与拥有线程有相关性。

如果拥有线程需要获取另外一个资源,而该资源当前为等待线程所拥有,则这种情形将成为死锁:在事务提交或回滚之前两个线程都不能释放资源,而且它们因为正等待对方拥有的资源而不能提交或回滚事务。例如,运行事务 1 的线程 T1 具有 Supplier 表上的排它锁。运行事务 2 的线程 T2 具有 Part 表上的排它锁,并且之后需要 Supplier 表上的锁。事务 2 无法获得这一锁,因为事务 1 已拥有它。事务 2 被阻塞,等待事务 1。然后,事务 1 需要 Part 表的锁,但无法获得锁,因为事务 2 将它锁定了。事务在提交或回滚之前不能释放持有的锁。因为事务需要对方控制的锁才能继续操作,所以它们不能提交或回滚。

死锁经常与正常阻塞混淆。当一个事务锁定了另一个事务需要的资源,第二个事务等待锁被释放。默认情况下,SQL Server 事务不会超时(除非设置了 LOCK_TIMEOUT)。第二个事务被阻塞,而不是被死锁。

use master

go

declare @spid int,@bl int

declare s_cur cursor for

select  0 ,blocked

from (select * from sysprocesses where  blocked>0 ) a

where not exists(select * from (select * from sysprocesses where  blocked>0 ) b where a.blocked=spid)

union

select spid,blocked from sysprocesses where  blocked>0

open s_cur

fetch next from s_cur into @spid,@bl

while @@fetch_status = 0

begin

if @spid =0

   select N'引起数死鎖的是:'+ltrim(@bl)+N'进程号,其执SQL语法如下'



else

   select N'进程号:'+ ltrim(@bl)+N'被'+N'进程号:'+ltrim(@bl)+N'阻塞,其当前进 进程執行的SQL语法如下:'

dbcc inputbuffer (@bl )

fetch next from s_cur into @spid,@bl

end

close s_cur

deallocate s_cur

(2.3) 获取连接SQL服务器的信息

if object_id('p_getlinkinfo','P')is not null drop proc p_getlinkinfo

go

create proc p_getlinkinfo   

@dbname sysname=null, --要查詢的數據庫名,默認表示所有  

@includeip bit=0      --是否顯示IP信息

as   

  begin

    declare @dbid int   

    set @dbid=db_id(@dbname)

    if object_id('tempdb..#tb')is not null drop table #tb

    if object_id('tempdb..#ip')is not null drop table #ip    

    create table #tb

       (id int identity(1,1),

        dbname sysname,

        hostname nchar(128),

        loginname nchar(128),

        net_address nchar(12),

        net_ip nvarchar(15),

        prog_name   nchar(128))   

    insert into #tb(hostname,dbname,net_address,loginname,prog_name)   

    select distinct hostname,

         db_name(dbid),

         net_address,

         loginame,

         program_name

    from master..sysprocesses   

    where hostname!=''and(@dbid is null or dbid=@dbid)   

    if @includeip=0 goto lb_show --不顯示IP   

    declare @sql varchar(500),@hostname nchar(128),@id int   

    create table #ip(hostname nchar(128),a varchar(200))   

    declare tb cursor local for select distinct hostname from #tb   

    open tb   

    fetch next from tb into @hostname   

    while @@fetch_status=0   

    begin   

     set @sql='ping   '+@hostname+'   -a   -n   1   -l   1'   

     insert #ip(a) exec master..xp_cmdshell @sql   

     update #ip    set  hostname=@hostname where hostname is null   

     fetch next from tb into @hostname   

    end   

    update #tb set net_ip=left(a,patindex('%:%',a)-1)   

    from #tb a inner join

    (select hostname,a=substring(a,patindex('Ping statistics for %:%',a)+20,20)

    from #ip   

    where a like'Ping statistics for %:%')b

    on a.hostname=b.hostname   

lb_show:   

    select   id,

           dbname,

           hostname,

           loginname,

           net_address,

           net_ip,

           prog_name   

    from #tb   

  end  

  go     

exec p_getlinkinfo @dbname='DB_WIP',@includeip=1  
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表