监控数据库运行 - MS SQL 日常维护管理常用脚本(二)
查看数据库登录名信息
use master
go
SELECT name AS LoginName ,
dbname AS DefaultDB ,
createdate AS CreateDate,
updatedate AS UpdateDate,
language AS Language ,
CASE WHEN isntname = 1 THEN 'NT USER'
ELSE 'SQL USER' END AS UserType
FROM syslogins;
查看数据库用户信息
SELECT * FROM sysusers;
查看用户拥有的服务器角色
方法1: 用SSMS管理工具查看
方法2: 脚本查询
SELECT name ,
CASE WHEN sysadmin = 1 THEN 'yes' ELSE '' END AS IsSysadmin ,
CASE WHEN dbcreator = 1 THEN 'yes' ELSE '' END AS IsDbCreate ,
CASE WHEN securityadmin= 1 THEN 'yes' ELSE '' END AS IsSecurityadmin ,
CASE WHEN bulkadmin = 1 THEN 'yes' ELSE '' END AS IsBulkadmin ,
CASE WHEN diskadmin = 1 THEN 'yes' ELSE '' END AS IsDiskadmin ,
CASE WHEN processadmin = 1 THEN 'yes' ELSE '' END AS IsProcessadmin ,
CASE WHEN serveradmin = 1 THEN 'yes' ELSE '' END AS IsServeradmin ,
CASE WHEN setupadmin = 1 THEN 'yes' ELSE '' END AS IsSetupadmin
FROM syslogins
--WHERE NAME='loginname'
查看最大工作线程数
SELECT max_workers_count
FROM sys.dm_os_sys_info
查看当前用户进程的会话ID
SELECT @@SPID
查询当前会话使用哪种协议
SELECT net_transport
FROM sys.dm_exec_connections
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:
SELECT[Spid] = session_Id ,
ecid ,
[Database] = DB_NAME(sp.dbid) ,
[User] = nt_username ,
[Status] = er.status ,
[Wait] = wait_type ,
[Individual Query] = SUBSTRING(qt.text, er.statement_start_offset / 2,
( CASE WHEN er.statement_end_offset = -1
THEN LEN(CONVERT(NVARCHAR(MAX), qt.text))
* 2
ELSE er.statement_end_offset
END - er.statement_start_offset ) / 2) ,
[Parent Query] = qt.text ,
Program = program_name ,
Hostname ,
nt_domain ,
start_time
FROM sys.dm_exec_requests er
INNER JOIN sys.sysprocesses sp ON er.session_id = sp.spid
CROSS APPLY sys.dm_exec_sql_text(er.sql_handle) AS qt
WHERE session_Id >= 51
方法4:
SELECT m.session_id ,
m.start_time ,
m.command ,
m.wait_type ,
m.cpu_time ,
CAST(s.text AS VARCHAR(1000)) AS sqlText
FROM master.sys.dm_exec_requests m WITH ( NOLOCK )
CROSS APPLY fn_get_sql(m.sql_handle) s SELECT r.session_id,
r.start_time ,
r.command ,
r.wait_type ,
r.cpu_time ,
s.text
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) s
--查看某个会话ID正在执行的SQL
SELECT m.session_id ,
m.start_time ,
m.command ,
m.wait_type ,
m.cpu_time ,
CAST(s.text AS VARCHAR(1000)) AS sqlText
FROM master.sys.dm_exec_requests m WITH ( NOLOCK )
CROSS APPLY fn_get_sql(m.sql_handle) s
WHERE m.session_id = 342 SELECT r.session_id ,
r.start_time ,
r.command ,
r.wait_type ,
r.cpu_time ,
s.text
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) s
WHERE r.session_id =342
查看SQL SERVER进程执行的语句
USE master
go
DECLARE @spid INT ; DECLARE @sql_handle BINARY(20) ; SET @spid = 56 SELECT @sql_handle = sql_handle
FROM sysprocesses AS A WITH ( NOLOCK )
WHERE spid = @spid ; SELECT text
FROM::fn_get_sql(@sql_handle) ;
查找TOP N语句
按平均 CPU 时间返回排名前十个的查询的相关信息。此示例将根据查询的查询哈希对查询进行聚合,以便按照查询的累积资源消耗来分组在逻辑上等效的查询。
--注意:SQL 2005 某些版本,没有sys.dm_exec_query_stats系统动态视图没有query_hash视图。
USE AXLIVEP1
GO
SELECT TOP 10 query_stats.query_hash AS "Query Hash",
SUM(query_stats.total_worker_time) /
SUM(query_stats.execution_count) AS "Avg CPU Time",
MIN(query_stats.statement_text) AS "Statement Text"
FROM
(SELECT QS.*,
SUBSTRING(ST.text,(QS.statement_start_offset/2) + 1,
((CASE statement_end_offset
WHEN -1 THEN DATALENGTH(st.text)
ELSE QS.statement_end_offset END
- QS.statement_start_offset)/2) + 1) AS statement_text
FROM sys.dm_exec_query_stats AS QS
CROSS APPLY sys.dm_exec_sql_text(QS.sql_handle) as ST) as query_stats
GROUP BY query_stats.query_hash
ORDER BY 2 DESC;
GO
查看会话阻塞/死锁信息 方法1:查看那个引起阻塞,查看blk不为0的记录,如果存在阻塞进程,则是该阻塞进程的会话 ID。否则该列为零。
EXEC sp_who active
方法2:查看那个引起阻塞,查看字段BlkBy,这个能够得到比sp_who更多的信息。
EXEC sp_who2 active
方法3:sp_lock 系统存储过程,报告有关锁的信息,但是不方便定位问题
方法4:sp_who_deadlock存储过程,查找死所sessionId
USE [DEV]
GO /****** Object: StoredProcedure [dbo].[sp_who_deadlock] Script Date: 07/18/2016 10:29:59 ******/
SET ANSI_NULLS OFF
GO SET QUOTED_IDENTIFIER OFF
GO CREATE PROCEDURE [dbo].[sp_who_deadlock] AS declare @spid int,@bl int
DECLARE s_cur CURSOR FOR
select 0 ,blocked
from (select * from sys.sysprocesses where blocked>0 ) a
where not exists(select * from (select * from sys.sysprocesses where blocked>0 ) b
where a.blocked=spid)
union select spid,blocked from sys.sysprocesses where blocked>0
OPEN s_cur
FETCH NEXT FROM s_cur INTO @spid,@bl
WHILE @@FETCH_STATUS = 0
begin if @spid =0 begin
select 'Deadlock due to SPID# '+ CAST(@bl AS VARCHAR(10)) + ', the SQL statement is:'
select spid, hostname, program_name, cmd, loginame, last_batch from sys.sysprocesses where spid = @bl
DBCC INPUTBUFFER (@bl)
end
FETCH NEXT FROM s_cur INTO @spid,@bl
end
CLOSE s_cur
DEALLOCATE s_cur GO
方法5:右键服务器-选择“活动和监视器”,查看进程选项。注意“任务状态”字段。
方法6:右键服务名称-选择报表-标准报表-活动-所有正在阻塞的事务。
查看内存状态
dbcc memorystatus
查看脚本执行时间 方法1: 查看SSMS管理器,查询窗口右下角
方法2:
DECLARE @exectime DATETIME
SELECT@exectime = GETDATE()
--SQL 语句
PRINT N'SQL执行耗时:' + CONVERT(VARCHAR(10), DATEDIFF(ms, @exectime, GETDATE()))
方法3:
SET STATISTICS TIME ON
查看进程正在执行的SQL语句
dbcc inputbuffer () 查看那些表缺少索引
下面语句功能强大,执行结果受统计信息的影响
SELECT sys.objects.name table_name,
mid.statement full_name,
(migs.avg_total_user_cost * migs.avg_user_impact) *(migs.user_seeks + migs.user_scans) AS Impact,
migs.avg_user_impact *(migs.user_seeks + migs.user_scans) Avg_Estimated_Impact,
'CREATE NONCLUSTERED INDEX IDX_' + sys.objects.name + '_N ON '
+ sys.objects.name COLLATE DATABASE_DEFAULT
+ ' ( ' + IsNull(mid.equality_columns, '')
+ CASE WHEN mid.inequality_columns IS NULL
THEN ''
ELSE
CASE WHEN mid.equality_columns IS NULL
THEN ''
ELSE ','
END + mid.inequality_columns
END + ' ) '
+ CASE WHEN mid.included_columns IS NULL
THEN ''
ELSE 'INCLUDE (' + mid.included_columns + ')' END
+ ';' AS CreateIndexStatement,
mid.equality_columns,
mid.inequality_columns,
mid.included_columns
FROM sys.dm_db_missing_index_group_stats AS migs
INNER JOIN sys.dm_db_missing_index_groups AS mig ON migs.group_handle = mig.index_group_handle
INNER JOIN sys.dm_db_missing_index_details AS mid ON mig.index_handle = mid.index_handle
AND mid.database_id = DB_ID()
INNER JOIN sys.objects WITH (nolock) ON mid.OBJECT_ID = sys.objects.OBJECT_ID
WHERE (migs.group_handle IN
(
SELECT TOP (500) group_handle
FROM sys.dm_db_missing_index_group_stats WITH (nolock)
ORDER BY (avg_total_user_cost * avg_user_impact) *(user_seeks + user_scans) DESC))
AND OBJECTPROPERTY(sys.objects.OBJECT_ID, 'isusertable')=1
--ORDER BY [Impact] DESC, [full_name] DESC
ORDER BY [table_name], [Impact] desc
查看应该被移除的索引
查看那些多余的、应该被移除的索引
SQL1:
SELECT OBJECTNAME = OBJECT_NAME(I.OBJECT_ID),
INDEXNAME = I.NAME,
I.INDEX_ID
FROM SYS.INDEXES I
JOIN SYS.OBJECTS O ON I.OBJECT_ID = O.OBJECT_ID
WHERE OBJECTPROPERTY(O.OBJECT_ID,'IsUserTable') = 1
AND I.INDEX_ID NOT IN(
SELECT S.INDEX_ID
FROM SYS.DM_DB_INDEX_USAGE_STATS S
WHERE S.OBJECT_ID = I.OBJECT_ID
AND I.INDEX_ID = S.INDEX_ID
AND DATABASE_ID = DB_ID())
ORDER BY OBJECTNAME, I.INDEX_ID, INDEXNAME ASC
SQL2:
SELECT DB_NAME(database_id) AS N'DEV' ,
OBJECT_NAME(U.object_id) AS N'Table_Name' ,
I.name AS N'Index_Name' ,
user_seeks AS N'用户索引查找次数',
user_scans AS N'用户索引扫描次数',
last_user_seek AS N'最后查找时间' ,
last_user_scan AS N'最后扫描时间' --,
--rows AS N'表中的行数'
FROM sys.dm_db_index_usage_stats AS U
INNER JOIN sys.indexes I ON U.index_id= I.index_id AND U.object_id= I.object_id
INNER JOIN sys.indexes T ON I.object_id = T.index_id
WHERE database_id= DB_ID('DEV')
AND OBJECT_NAME(U.object_id)='InventTrans'
ORDER BY user_seeks, user_scans, object_name(U.object_id);
监控数据库运行 - MS SQL 日常维护管理常用脚本(二)的更多相关文章
- MS SQL 日常维护管理常用脚本(二)
监控数据库运行 下面是整理.收集监控数据库运行的一些常用脚本,也是MS SQL 日常维护管理常用脚本(一)的续集,欢迎大家补充.提意见. 查看数据库登录名信息 Code Snippet SELEC ...
- MS SQL 日常维护管理常用脚本
--[查看数据库服务器名称] --默认实例查询 SELECT @@SERVERNAME AS SERVERNAME; SELECT SERVERPROPERTY('servername') AS Se ...
- CentOS日常维护及常用脚本
[root@-.x.x xiewenming]# curl myip.ipip.net 当前 IP:42.62.x.x 来自于:中国 北京 北京 联通/电信 www.17ce.com cdn解析网站 ...
- mybatis查询无结果, 数据库运行相同sql查询出结果
一.问题描述 mybatis查询无结果, 数据库运行相同sql查询出结果, 如下 这是数据库记录 这是mybatis查询出的结果, 记录条数0 这是直接将控制台一模一样的sql查询语句放到Navica ...
- MS SQL 事务日志管理小结
本文是对SQL Server事务日志的总结,文章有一些内容和知识来源于官方文档或一些技术博客,本文对引用部分的出处都有标注. 事务日志介绍 在SQL Server中,事务日志是数据库的重要组件,如 ...
- oracle 容灾库日常维护 ,健康检查脚本 以及常见问题分析
select DEST_ID, APPLIED_SCN FROM v$archive_dest select * from v$dataguard_status; SELECT gvi.thread# ...
- 日常维护管理-DBA运维交接清单
序号 交接内容 交接目标与要点 交接物 交接状态 交接开始时间 交接结束时间 负责人 备注 1 人事关系 与开发项目组成员互识,并了解其职责 开发项目组成员清单 2016/2/29 2016/2/29 ...
- MS sql server 基础知识回顾(二)-表连接和子查询
五.表连接 当数据表中存在许多重复的冗余信息时,就要考虑将这些信息建在另一张新表中,在新表中为原表设置好外键,在进行数据查询的时候,就要使用到连接了,表连接就好像两根线,线的两端分别连接两张表的不同字 ...
- 微软官方提供的用于监控MS SQL Server运行状况的工具及SQL语句
Microsoft SQL Server 2005 提供了一些工具来监控数据库.方法之一是动态管理视图.动态管理视图 (DMV) 和动态管理函数 (DMF) 返回的服务器状态信息可用于监控服务器实例的 ...
随机推荐
- 【jq】c#零基础学习之路(4)抽象类和密封
一.抽象类 1.抽象类不能被实例化 2.抽象类方法必需要实现 3.如何类中函数为抽象函数,其类也需要定义成抽象类 4.关键字 abstract ,函数重写 override. 二.密封类 1.密封类不 ...
- 如何分析解决Android ANR
来自: http://blog.csdn.net/tjy1985/article/details/6777346 http://blog.csdn.net/tjy1985/article/detail ...
- LeetCode-Remove Duplicates from Sorted Array II
Follow up for "Remove Duplicates": What if duplicates are allowed at most twice? For examp ...
- 在Windows上运行InfoPi
一.安装Python Python官网的下载页面: https://www.python.org/downloads/ 请下载Python 3.4或以上版本. (Python 3.5已不再支持Win ...
- 0x00linux32位汇编初入--前期准备
0x00汇编初入--前期准备 一.汇编工具 在linux平台下常用的编译器为as,连接器为ld,使用的文本编辑器为vim,汇编语法为att 以下是一些工具: addr2line 把地址转换为文件名和行 ...
- oracle数据库备份和还原
ip导出方式:exp demo/demo@127.0.0.1:1521/orcl file=f:\f.dmp full=y 备份:exp demo/demo@orcl file=f:\f.dmp f ...
- [API]使用Blueprint来高雅的编写接口文档 前后端api文档,移动端api文档
网址:http://apiary.io/ 介绍:一款非常强大的前后端交互api设计编辑工具(编辑器采用Markdown类似的描述标记,非常高效),高颜值的api文档,还能生成多种语言的测试代码. 中文 ...
- CSharp 相关知识点小结
1.JS获取iframe下面的内容document.getElementById('IFRAME1').contentDocument; 2.dialog 弹出层,定位:postion:'bottom ...
- jQuery EasyUI:根据数据库内容生成适合于easyui-tree的JSON数据格式
1,jQuery EasyUI中easyui-tree特定的JSON数据格式 [ {"id":1,"text":"某公司","ch ...
- Comparable和Comparator实现对象比较
由文生义: 继承Comparable ,表示该类的实例是可以相互比较的; 继承Comparator,表示该类是一个比较器,里面设置了按什么属性比较,list需要按这个比较器里的规则来比较; 使用方法如 ...