MSSQL2005 SYS.SYSPROCESSES使用--整理帖

--> Title  : MSSQL2005 SYS.SYSPROCESSES

--> Author : wufeng4552

--> Date   : 2009-11-06

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 

 

sql最全的常用命令语句 询某个数据库的连接数 select count(*) from Master.dbo.SysProcesses where dbid=db_id() --前10名其他等待类型 SELECT TOP 10 * from sys.dm_os_wait_stats ORDER BY wait_time_ms DESC SELECT *FROM sys.dm_os_wait_stats WHERE wait_type like 'PAGELATCH%' OR wait_type like 'LAZYWRITER_SLEEP%' --CPU的压力 SELECT scheduler_id, current_tasks_count, runnable_tasks_count FROM sys.dm_os_schedulers WHERE scheduler_id 500 begin select text,CROSS APPLY master.sys.dm_exec_sql_text(a.sql_handle) from master.sys.sysprocesses a end select text,a.* from master.sys.sysprocesses a CROSS APPLY master.sys.dm_exec_sql_text(a.sql_handle) where a.spid = '51' dbcc inputbuffer(53) with tb as ( select blocking_session_id, session_id,db_name(database_id) as dbname,text from master.sys.dm_exec_requests a CROSS APPLY master.sys.dm_exec_sql_text(a.sql_handle) ), tb1 as ( select a.*,login_time,program_name,client_interface_name,login_name,cpu_time,memory_usage*8 as 'memory_usage(KB)', total_scheduled_time,reads,writes,logical_reads from tb a inner join master.sys.dm_exec_sessions b on a.session_id=b.session_id ) select a.*,connect_time,client_tcp_port,client_net_address from tb1 a inner join master.sys.dm_exec_connections b on a.session_id=b.session_id --当前进程数 select * from master.dbo.sysprocesses order by cpu desc --查看当前活动的进程数 sp_who active --查询是否由于连接没有释放引起CPU过高 select * from master.dbo.sysprocesses where spid> 50 and waittype = 0x0000 and waittime = 0 and status = 'sleeping ' and last_batch < dateadd(minute, -10, getdate()) and login_time 50 and waittype = 0x0000 and waittime = 0 and status = 'sleeping ' and last_batch < dateadd(minute, -60, getdate()) and login_time 1 ORDER BY qs.plan_generation_num SELECT top 50 qt.text AS SQL_text ,SUM(qs.total_worker_time) AS total_cpu_time, SUM(qs.execution_count) AS total_execution_count, SUM(qs.total_worker_time)/SUM(qs.execution_count) AS avg_cpu_time, COUNT(*) AS number_of_statements FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt GROUP BY qt.text ORDER BY total_cpu_time DESC --统计总的CPU时间 --ORDER BY avg_cpu_time DESC --统计平均单次查询CPU时间 -- 计算可运行状态下的工作进程数量 SELECT COUNT(*) as workers_waiting_for_cpu,s.scheduler_id FROM sys.dm_os_workers AS o INNER JOIN sys.dm_os_schedulers AS s ON o.scheduler_address=s.scheduler_address AND s.scheduler_id<255 WHERE o.state='RUNNABLE' GROUP BY s.scheduler_id
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值