监控数据库运行

下面是整理、收集监控数据库运行的一些常用脚本,也是MS SQL 日常维护管理常用脚本(一)的续集,欢迎大家补充、提意见。

查看数据库登录名信息
 
Code Snippet
  1. SELECT name                                AS LoginName ,
  2. dbname                              AS DefaultDB ,
  3. createdate                          AS CreateDate,
  4. updatedate                          AS UpdateDate,
  5. language                            AS Language  ,
  6. CASE WHEN isntname = 1 THEN 'NT USER'
  7. ELSE 'SQL USER'    END          AS UserType
  8. FROM syslogins;
查看数据库用户信息
 
SELECT * FROM sysusers;
 
查看用户拥有的服务器角色
 

方法1: 用SSMS管理工具查看

方法2: 脚本查询

 
查看用户角色
  1. SELECT name            ,
  2. CASE WHEN sysadmin     = 1       THEN 'yes'     ELSE '' END AS IsSysadmin        ,
  3. CASE WHEN dbcreator    = 1       THEN 'yes'     ELSE '' END AS IsDbCreate        ,
  4. CASE WHEN securityadmin= 1       THEN 'yes'     ELSE '' END AS IsSecurityadmin   ,
  5. CASE WHEN bulkadmin    = 1       THEN 'yes'     ELSE '' END AS IsBulkadmin       ,
  6. CASE WHEN diskadmin    = 1       THEN 'yes'     ELSE '' END AS IsDiskadmin       ,
  7. CASE WHEN processadmin = 1       THEN 'yes'     ELSE '' END AS IsProcessadmin    ,
  8. CASE WHEN serveradmin  = 1       THEN 'yes'     ELSE '' END AS IsServeradmin     ,
  9. CASE WHEN setupadmin   = 1       THEN 'yes'     ELSE '' END AS IsSetupadmin
  10. FROM syslogins
  11. --WHERE NAME='loginname'
 
查看最大工作线程数
 
Code Snippet
  1. SELECT  max_workers_count
  2. FROM  sys.dm_os_sys_info

查看当前用户进程的会话ID

SELECT @@SPID

查询当前会话使用哪种协议

Code Snippet
  1. SELECT net_transport
  2. FROM   sys.dm_exec_connections
  3. WHERE session_id = @@SPID;
 
查看当前连接的会话信息

--进程号1--50是SQL Server系统内部用的

SELECT * FROM sys.dm_exec_sessions WHERE session_id >=51
 

--查看某台机器的连接会话信息

SELECT * FROM sys.dm_exec_sessions WHERE session_id >=51 AND host_name='PO130018801'
 

--查看某个登录名的连接会话信息

SELECT * FROM sys.dm_exec_sessions WHERE session_id >=51 AND login_name='username'
 

--查看活动的连接会话信息

SELECT * FROM sys.dm_exec_sessions WITH(NOWAIT) WHERE session_id >=51 AND status ='running'
 

--查找连接到服务器的用户并返回每个用户的会话数

SELECT  login_name ,
        COUNT(session_id) AS session_count
FROM    sys.dm_exec_sessions
GROUP BY login_name ;
 
 

查看正在执行的SQL语句
 

方法1: 选择数据库实例,单击右键,选择”活动监视器“,监控/查看正在执行的SQL

方法2: profile去跟踪,比较耗费资源。

方法3:

 
Code Snippet
  1. SELECT[Spid] = session_Id ,
  2. ecid ,
  3. [Database] = DB_NAME(sp.dbid) ,
  4. [User] = nt_username ,
  5. [Status] = er.status ,
  6. [Wait] = wait_type ,
  7. [Individual Query] = SUBSTRING(qt.text, er.statement_start_offset / 2,
  8. ( CASE WHEN er.statement_end_offset = -1
  9. THEN LEN(CONVERT(NVARCHAR(MAX), qt.text))
  10. * 2
  11. ELSE er.statement_end_offset
  12. END - er.statement_start_offset ) / 2) ,
  13. [Parent Query] = qt.text ,
  14. Program = program_name ,
  15. Hostname ,
  16. nt_domain ,
  17. start_time
  18. FROMsys.dm_exec_requests er
  19. INNER JOIN sys.sysprocesses sp ON er.session_id = sp.spid
  20. CROSS APPLY sys.dm_exec_sql_text(er.sql_handle) AS qt
  21. WHEREsession_Id >= 51

方法4:

Code Snippet
  1. SELECT   m.session_id ,
  2. m.start_time ,
  3. m.command    ,
  4. m.wait_type  ,
  5. m.cpu_time   ,
  6. CAST(s.text AS VARCHAR(1000)) AS sqlText
  7. FROMmaster.sys.dm_exec_requests m WITH ( NOLOCK )
  8. CROSS APPLY fn_get_sql(m.sql_handle) s
  9. SELECT  r.session_id,
  10. r.start_time      ,
  11. r.command         ,
  12. r.wait_type       ,
  13. r.cpu_time        ,
  14. s.text
  15. FROMsys.dm_exec_requests r
  16. CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) s

--查看某个会话ID正在执行的SQL

Code Snippet
  1. SELECT  m.session_id ,
  2. m.start_time ,
  3. m.command    ,
  4. m.wait_type  ,
  5. m.cpu_time   ,
  6. CAST(s.text AS VARCHAR(1000)) AS sqlText
  7. FROMmaster.sys.dm_exec_requests m WITH ( NOLOCK )
  8. CROSS APPLY fn_get_sql(m.sql_handle) s
  9. WHEREm.session_id = 342
  10. SELECT   r.session_id      ,
  11. r.start_time      ,
  12. r.command         ,
  13. r.wait_type       ,
  14. r.cpu_time        ,
  15. s.text
  16. FROM sys.dm_exec_requests r
  17. CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) s
  18. WHERE r.seesion_id =342

查看SQL SERVER进程执行的语句

Code Snippet
  1. USE master
  2. DECLARE @spid INT ;
  3. DECLARE @sql_handle BINARY(20) ;
  4. SET @spid = 56
  5. SELECT@sql_handle = sql_handle
  6. FROMsysprocesses AS A WITH ( NOLOCK )
  7. WHEREspid = @spid ;
  8. SELECTtext
  9. FROM::fn_get_sql(@sql_handle) ;
 
查找TOP N语句

按平均 CPU 时间返回排名前十个的查询的相关信息。此示例将根据查询的查询哈希对查询进行聚合,以便按照查询的累积资源消耗来分组在逻辑上等效的查询。
--注意:SQL 2005 某些版本,没有sys.dm_exec_query_stats系统动态视图没有query_hash视图。

Code Snippet
  1. USE DBNAME;
  2. GO
  3. SELECT TOP 10 query_stats.query_hash             AS "Query Hash",
  4. SUM(query_stats.total_worker_time) /
  5. SUM(query_stats.execution_count)             AS "Avg CPU Time",
  6. MIN(query_stats.statement_text)              AS "Statement Text"
  7. FROM
  8. (SELECT QS.*,
  9. SUBSTRING(ST.text,(QS.statement_start_offset/2) + 1,
  10. ((CASE statement_end_offset
  11. WHEN -1 THEN DATALENGTH(st.text)
  12. ELSE QS.statement_end_offset END
  13. - QS.statement_start_offset)/2) + 1) AS statement_text
  14. FROM sys.dm_exec_query_stats AS QS
  15. CROSS APPLY sys.dm_exec_sql_text(QS.sql_handle) as ST) as query_stats
  16. GROUP BY query_stats.query_hash
  17. ORDER BY 2 DESC;
  18. GO
查看会话阻塞/死锁信息
 

方法1:查看那个引起阻塞,查看blk不为0的记录,如果存在阻塞进程,则是该阻塞进程的会话 ID。否则该列为零。 

EXEC sp_who active

方法2:查看那个引起阻塞,查看字段BlkBy,这个能够得到比sp_who更多的信息。

EXEC sp_who2 active

方法3:sp_lock 系统存储过程,报告有关锁的信息,但是不方便定位问题

方法4:sp_who_lock存储过程

Code Snippet
  1. USE master;
  2. GO
  3. SET ANSI_NULLS ON;
  4. GO
  5. SET QUOTED_IDENTIFIER ON;
  6. GO
  7. IF EXISTS(SELECT 1 FROM sysobjects WHERE id=OBJECT_ID(N'sp_who_lock')
  8. AND OBJECTPROPERTY(id, 'IsProcedure') =1)
  9. DROP PROCEDURE sp_who_lock;
  10. GO
  11. --==================================================================================================
  12. --            ProcedureName             :            sp_who_lock
  13. --            Author                    :            作者不详,出自网络
  14. --            CreateDate                :            2013-05-13
  15. --            Description               :            查看阻塞和死锁信息
  16. /**************************************************************************************************
  17. Parameters                    :              参数说明
  18. ***************************************************************************************************
  19. 无参存储过程
  20. ***************************************************************************************************
  21. Modified Date            Modified User     Version                 Modified Reason
  22. ***************************************************************************************************
  23. 2013-06-03                    Kerry        V01.00.01 调整存储过程格式,代码部分修改以及增加注释信息
  24. ***************************************************************************************************/
  25. --=================================================================================================
  26. CREATE PROCEDURE sp_who_lock
  27. AS
  28. BEGIN
  29. DECLARE @spid                            INT;
  30. DECLARE @block                           INT;
  31. DECLARE @RowCount                        INT;
  32. DECLARE @RowIndex                        INT;
  33. --创建临时表,保持被阻塞或正阻塞其他SQL的SQL语句信息
  34. CREATE TABLE #tmp_lock_who
  35. (
  36. id    INT IDENTITY(1, 1) ,
  37. spid    SMALLINT ,
  38. block SMALLINT
  39. )
  40. IF @@ERROR<>0 RETURN @@ERROR;
  41. INSERT INTO #tmp_lock_who
  42. (
  43. spid ,
  44. block
  45. )
  46. SELECT  0 ,
  47. blocked
  48. FROM    ( SELECT    *
  49. FROM      sysprocesses
  50. WHERE     blocked > 0
  51. ) a
  52. WHERE   NOT EXISTS( SELECT *
  53. FROM   ( SELECT    *
  54. FROM      sysprocesses
  55. WHERE     blocked > 0
  56. ) b
  57. WHERE  a.blocked = spid )
  58. UNION
  59. SELECT  spid ,
  60. blocked
  61. FROM    sysprocesses
  62. WHERE   blocked > 0;
  63. IF @@ERROR<>0 RETURN @@ERROR;
  64. -- 找到临时表的记录数
  65. SELECT@RowCount = COUNT(1) ,
  66. @RowIndex = 1
  67. FROM#tmp_lock_who
  68. IF @@ERROR<>0 RETURN @@ERROR;
  69. IF@RowCount=0
  70. SELECT  N'现在没有阻塞和死锁信息' AS MESSAGE;
  71. -- -- 循环开始
  72. WHILE @RowIndex <= @RowCount
  73. BEGIN
  74. -- 取第一条记录
  75. SELECT     @spid    = spid,
  76. @block   = block
  77. FROM #tmp_lock_who
  78. WHERE Id = @RowIndex
  79. IF @spid = 0
  80. SELECT N'引起数据库死锁的是: ' + CAST(@block AS VARCHAR(10))
  81. +  N'进程号,其执行的SQL语法如下';
  82. ELSE
  83. SELECT N'进程号SPID:' + CAST(@spid AS VARCHAR(10)) + N'被进程号SPID:'
  84. +  CAST(@block AS VARCHAR(10)) +'阻塞,其当前进程执行的SQL语法如下';
  85. DBCC INPUTBUFFER(@block )
  86. SET @RowIndex = @RowIndex + 1;
  87. END;
  88. DROP TABLE #tmp_lock_who;
  89. RETURN 0;
  90. END

方法5:右键服务器-选择“活动和监视器”,查看进程选项。注意“任务状态”字段。

方法6:右键服务名称-选择报表-标准报表-活动-所有正在阻塞的事务。

小结:总结之后,才发现居然有这么多方法,MGD,系统的整理、梳理知识点是非常有必要的,你能更全面、深入的了解。

 
查看内存状态

dbcc memorystatus

具体如何分析,请查看官方文档http://support.microsoft.com/kb/907877/zh-cn

 
查看脚本执行时间

方法1: 查看SSMS管理器,查询窗口右下角
方法2:

Code Snippet
  1. DECLARE @exectime DATETIME
  2. SELECT@exectime = GETDATE()
  3. --SQL 语句
  4. PRINT N'SQL执行耗时:' + CONVERT(VARCHAR(10), DATEDIFF(ms, @exectime, GETDATE()))

方法3:

SET STATISTICS TIME ON

--SQL 语句

查看进程正在执行的SQL语句 

  dbcc inputbuffer ()

查看那些表缺少索引 

下面语句功能强大,执行结果受统计信息的影响

Code Snippet
  1. SELECT sys.objects.name table_name,
  2. mid.statement full_name,
  3. (migs.avg_total_user_cost * migs.avg_user_impact) *(migs.user_seeks + migs.user_scans) AS Impact,
  4. migs.avg_user_impact *(migs.user_seeks + migs.user_scans) Avg_Estimated_Impact,
  5. 'CREATE NONCLUSTERED INDEX IDX_' + sys.objects.name + '_N ON '
  6. + sys.objects.name COLLATE DATABASE_DEFAULT
  7. + ' ( ' + IsNull(mid.equality_columns, '')
  8. + CASE WHEN mid.inequality_columns IS NULL
  9. THEN ''
  10. ELSE
  11. CASE WHEN mid.equality_columns IS NULL
  12. THEN ''
  13. ELSE ','
  14. END + mid.inequality_columns
  15. END + ' ) '
  16. + CASE WHEN mid.included_columns IS NULL
  17. THEN ''
  18. ELSE 'INCLUDE (' + mid.included_columns + ')' END
  19. + ';' AS CreateIndexStatement,
  20. mid.equality_columns,
  21. mid.inequality_columns,
  22. mid.included_columns
  23. FROM sys.dm_db_missing_index_group_stats AS migs
  24. INNER JOIN sys.dm_db_missing_index_groups AS mig ON migs.group_handle = mig.index_group_handle
  25. INNER JOIN sys.dm_db_missing_index_details AS mid ON mig.index_handle = mid.index_handle
  26. AND mid.database_id = DB_ID()
  27. INNER JOIN sys.objects WITH (nolock) ON mid.OBJECT_ID = sys.objects.OBJECT_ID
  28. WHERE (migs.group_handle IN
  29. (
  30. SELECT TOP (500) group_handle
  31. FROM sys.dm_db_missing_index_group_stats WITH (nolock)
  32. ORDER BY (avg_total_user_cost * avg_user_impact) *(user_seeks + user_scans) DESC))
  33. AND OBJECTPROPERTY(sys.objects.OBJECT_ID, 'isusertable')=1
  34. --ORDER BY [Impact] DESC, [full_name] DESC
  35. ORDER BY [table_name], [Impact] desc

查看应该被移除的索引

 

查看那些多余的、应该被移除的索引

SQL 1:

Code Snippet
  1. SELECT OBJECTNAME = OBJECT_NAME(I.OBJECT_ID),
  2. INDEXNAME = I.NAME,
  3. I.INDEX_ID
  4. FROM SYS.INDEXES I
  5. JOIN SYS.OBJECTS O ON I.OBJECT_ID = O.OBJECT_ID
  6. WHERE OBJECTPROPERTY(O.OBJECT_ID,'IsUserTable') = 1
  7. AND I.INDEX_ID NOT IN(
  8. SELECT S.INDEX_ID
  9. FROM SYS.DM_DB_INDEX_USAGE_STATS S
  10. WHERE S.OBJECT_ID = I.OBJECT_ID
  11. AND I.INDEX_ID = S.INDEX_ID
  12. AND DATABASE_ID = DB_ID())
  13. ORDER BY OBJECTNAME, I.INDEX_ID, INDEXNAME ASC

SQL 2: 分析下面语句,移除那些没有必要的索引

Code Snippet
  1. SELECT DB_NAME(database_id)         AS  N'DataBaseName'  ,
  2. OBJECT_NAME(U.object_id)     AS  N'Table_Name'    ,
  3. I.name                       AS  N'Index_Name'    ,
  4. user_seeks                   AS  N'用户索引查找次数',
  5. user_scans                   AS  N'用户索引扫描次数',
  6. last_user_seek               AS  N'最后查找时间'   ,
  7. last_user_scan               AS  N'最后扫描时间'   ,
  8. rows                         AS  N'表中的行数'
  9. FROM sys.dm_db_index_usage_stats AS U
  10. INNER JOIN sys.indexes I ON U.index_id= I.index_idAND U.object_id= I.object_id
  11. INNER JOIN sysindexesT ON I.object_id = T.id
  12. WHERE database_id= DB_ID('DbName')
  13. AND OBJECT_NAME(U.object_id)='TableName'
  14. ORDER BY user_seeks, user_scans, object_name(U.object_id);

MS SQL 日常维护管理常用脚本(二)的更多相关文章

  1. 监控数据库运行 - MS SQL 日常维护管理常用脚本(二)

    查看数据库登录名信息 use mastergoSELECT name AS LoginName , dbname AS DefaultDB , createdate AS CreateDate, up ...

  2. MS SQL 日常维护管理常用脚本

    --[查看数据库服务器名称] --默认实例查询 SELECT @@SERVERNAME AS SERVERNAME; SELECT SERVERPROPERTY('servername') AS Se ...

  3. CentOS日常维护及常用脚本

    [root@-.x.x xiewenming]# curl myip.ipip.net 当前 IP:42.62.x.x 来自于:中国 北京 北京 联通/电信 www.17ce.com  cdn解析网站 ...

  4. MS SQL 事务日志管理小结

    本文是对SQL Server事务日志的总结,文章有一些内容和知识来源于官方文档或一些技术博客,本文对引用部分的出处都有标注.   事务日志介绍 在SQL Server中,事务日志是数据库的重要组件,如 ...

  5. oracle 容灾库日常维护 ,健康检查脚本 以及常见问题分析

    select DEST_ID, APPLIED_SCN FROM v$archive_dest select * from v$dataguard_status; SELECT gvi.thread# ...

  6. 日常维护管理-DBA运维交接清单

    序号 交接内容 交接目标与要点 交接物 交接状态 交接开始时间 交接结束时间 负责人 备注 1 人事关系 与开发项目组成员互识,并了解其职责 开发项目组成员清单 2016/2/29 2016/2/29 ...

  7. MS sql server 基础知识回顾(二)-表连接和子查询

    五.表连接 当数据表中存在许多重复的冗余信息时,就要考虑将这些信息建在另一张新表中,在新表中为原表设置好外键,在进行数据查询的时候,就要使用到连接了,表连接就好像两根线,线的两端分别连接两张表的不同字 ...

  8. SQL Server 监控统计阻塞脚本信息

        数据库产生阻塞(Blocking)的本质原因 :SQL语句连续持有锁的时间过长 ,数目过多, 粒度过大.阻塞是事务隔离带来的副作用,它是不可避免的,而且是一个数据库系统常见的现象. 但是阻塞的 ...

  9. MapReduce On Yarn的配置详解和日常维护

    MapReduce On Yarn的配置详解和日常维护 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MapReduce运维概述 MapReduce on YARN的运维主要是 ...

随机推荐

  1. java 中多线程之间的通讯之等待唤醒机制

    wait notify () nitifyAll () 都使用在同步中,因为要对持有监视器(锁)的线程操作 所以要使用在同步中,因为只有同步才具有锁 为什么这些操作线程的方法要定义object类中呢 ...

  2. IE里面的一些BUG记录

    网上已经有很多类似的记录了,这里写这个是给自己在项目中碰到的问题做个简单的记录,以后将持续更新 1.IE67 border-bottom失效      一个a标签,想要使用移上去后会在下面显示一个横条 ...

  3. MySQL入门03-MySQL配置安全性、易用性

    一.设定管理员用户和密码 二.处理test库权限隐患 三.自定义脚本提升易用性 中间定义文件 启动MySQL服务 关闭MySQL服务 快捷登录MySQL 四.设置开机自动启动MySQL服务 Refer ...

  4. java多线程--多线程基础小结

    什么是线程? 在同一个进程中可以执行多个任务,每一个任务可以看做一个线程. 线程是程序的执行单元,执行路径,使程序使用cpu的最基本单位 一个进程如果只有一条执行路径,那么就是单线程的 一个进程如果有 ...

  5. 做图表统计你需要掌握SQL Server 行转列和列转行

    说在前面 做一个数据统计和分析的项目,每天面对着各种数据,经过存储过程从源表计算汇总后需要写入中间结果表以提高数据使用效率,那么此时就需要用到行转列和列转行. 1.列转行 数据经过计算加工后会直接生成 ...

  6. 表单多文件上传样式美化 && 支持选中文件后删除相关项

    开发中会经常涉及到文件上传的需求,根据业务不同的需求,有不同的文件上传情况. 有简单的单文件上传,有多文件上传,因浏览器原生的文件上传样式及功能的支持度不算太高,很多时候我们会对样式进行美化,对功能进 ...

  7. ArcGIS10.2 应用服务器搭建

    操作系统:Windows Server2012R2 DataCenter 软件环境:ArcGIS Desktop10.2,ArcSDE10.2,ArcGIS Server10.2,win64_11gR ...

  8. 使用TabPageIndicator的样式问题

    在使用TabPageIndicator往往会出现一些样式问题,导致看不到字,下面是总结的步骤: 1.布局<LinearLayout xmlns:android="http://sche ...

  9. 【转】php pdo连接数据库 解决中文乱码问题(wordpress mysql 问号?? ??)

    原文链接:http://blog.csdn.net/ysydao/article/details/11002295 PHP 用pdo连接数据库时出现中文乱码问题解决办法 1.array(PDO::MY ...

  10. SpringMVC解决乱码

    SpringMVC解决乱码 在web.xml中配置如下代码