Below is what is collected
- Shows SQL Servers information
- Shows top 5 high cpu used statemants
- Shows who so logged in
- Shows long running cursors
- Shows idle sessions that have open transactions
- Shows free space in tempdb database
- Shows total disk allocated to tempdb database
- Show active jobs
- Shows clients connected
- Shows running batch
- Shows currently blocked requests
- Shows last backup dates
- Shows jobs that are still executing
- Shows failed MS SQL jobs report
- Shows disabled jobs
- Shows avail free DB space
- Shows total DB size (.MDF+.LDF)
- Show hard drive space available
USE master
GO
-- This stored procedure will give you infomation on the SQL server in question.-- Connect with DAC and then execute this stored procedure located in the master database
CREATE PROC sp_dba_DAC
AS
SELECT '*** Start of DAC Report ***'
SELECT '-- Shows SQL Servers information'
EXEC ('USE MASTER')
SELECT CONVERT(CHAR(20), SERVERPROPERTY('MachineName')) AS 'MACHINE NAME'
,CONVERT(CHAR(20), SERVERPROPERTY('ServerName')) AS 'SQL SERVER NAME'
,( CASE WHEN CONVERT(CHAR(20), SERVERPROPERTY('InstanceName')) IS NULL
THEN 'Default Instance'
ELSE CONVERT(CHAR(20), SERVERPROPERTY('InstanceName'))
END ) AS 'INSTANCE NAME'
,CONVERT(CHAR(20), SERVERPROPERTY('EDITION')) AS EDITION
,CONVERT(CHAR(20), SERVERPROPERTY('ProductVersion')) AS 'PRODUCT VERSION'
,CONVERT(CHAR(20), SERVERPROPERTY('ProductLevel')) AS 'PRODUCT LEVL'
,( CASE WHEN CONVERT(CHAR(20), SERVERPROPERTY('ISClustered')) = 1
THEN 'Clustered'
WHEN CONVERT(CHAR(20), SERVERPROPERTY('ISClustered')) = 0
THEN 'NOT Clustered'
ELSE 'INVALID INPUT/ERROR'
END ) AS 'FAILOVER CLUSTERED'
,( CASE WHEN CONVERT(CHAR(20), SERVERPROPERTY('ISIntegratedSecurityOnly')) = 1
THEN 'Integrated Security '
WHEN CONVERT(CHAR(20), SERVERPROPERTY('ISIntegratedSecurityOnly')) = 0
THEN 'SQL Server Security '
ELSE 'INVALID INPUT/ERROR'
END ) AS 'SECURITY'
,( CASE WHEN CONVERT(CHAR(20), SERVERPROPERTY('ISSingleUser')) = 1
THEN 'Single User'
WHEN CONVERT(CHAR(20), SERVERPROPERTY('ISSingleUser')) = 0
THEN 'Multi User'
ELSE 'INVALID INPUT/ERROR'
END ) AS 'USER MODE'
,CONVERT(CHAR(30), SERVERPROPERTY('COLLATION')) AS COLLATION
SELECT '-- Shows top 5 high cpu used statemants'
SELECT TOP 5
total_worker_time / execution_count AS [Avg CPU Time]
,SUBSTRING(st.text, ( qs.statement_start_offset / 2 ) + 1,
( ( CASE qs.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
ORDER BY total_worker_time / execution_count DESC ;
SELECT '-- Shows who so logged in'
SELECT login_name
,COUNT(session_id) AS session_count
FROM sys.dm_exec_sessions
GROUP BY login_name ;
SELECT '-- Shows long running cursors'
EXEC ('USE master')
SELECT creation_time
,cursor_id
,name
,c.session_id
,login_name
FROM sys.dm_exec_cursors (0) AS c
JOIN sys.dm_exec_sessions AS s ON c.session_id = s.session_id
WHERE DATEDIFF(mi, c.creation_time, GETDATE()) > 5 ;
SELECT '-- Shows idle sessions that have open transactions'
SELECT s.*
FROM sys.dm_exec_sessions AS s
WHERE EXISTS ( SELECT *
FROM sys.dm_tran_session_transactions AS t
WHERE t.session_id = s.session_id )
AND NOT EXISTS ( SELECT *
FROM sys.dm_exec_requests AS r
WHERE r.session_id = s.session_id ) ;
SELECT '-- Shows free space in tempdb database'
SELECT SUM(unallocated_extent_page_count) AS [free pages]
,( SUM(unallocated_extent_page_count) * 1.0 / 128 ) AS [free space in MB]
FROM sys.dm_db_file_space_usage ;
SELECT '-- Shows total disk allocated to tempdb database'
SELECT SUM(size) * 1.0 / 128 AS [size in MB]
FROM tempdb.sys.database_files
SELECT '-- Show active jobs'
SELECT DB_NAME(database_id) AS [Database]
,COUNT(*) AS [Active Async Jobs]
FROM sys.dm_exec_background_job_queue
WHERE in_progress = 1
GROUP BY database_id ;
SELECT '--Shows clients connected'
SELECT session_id
,client_net_address
,client_tcp_port
FROM sys.dm_exec_connections ;
SELECT '--Shows running batch'
SELECT *
FROM sys.dm_exec_requests ;
SELECT '--Shows currently blocked requests'
SELECT session_id
,status
,blocking_session_id
,wait_type
,wait_time
,wait_resource
,transaction_id
FROM sys.dm_exec_requests
WHERE status = N'suspended'
SELECT '--Shows last backup dates ' AS ' '
SELECT B.name AS Database_Name
,ISNULL(STR(ABS(DATEDIFF(day, GETDATE(), MAX(Backup_finish_date)))),
'NEVER') AS DaysSinceLastBackup
,ISNULL(CONVERT(CHAR(10), MAX(backup_finish_date), 101), 'NEVER') AS LastBackupDate
FROM master.dbo.sysdatabases B
LEFT OUTER JOIN msdb.dbo.backupset A ON A.database_name = B.name
AND A.type = 'D'
GROUP BY B.Name
ORDER BY B.name
SELECT '--Shows jobs that are still executing' AS ' '
EXEC msdb.dbo.sp_get_composite_job_info NULL, NULL, NULL, NULL, NULL, NULL,
1, NULL, NULL
SELECT '--Shows failed MS SQL jobs report' AS ' '
SELECT name
FROM msdb.dbo.sysjobs A
,msdb.dbo.sysjobservers B
WHERE A.job_id = B.job_id
AND B.last_run_outcome = 0
SELECT '--Shows disabled jobs ' AS ' '
SELECT name
FROM msdb.dbo.sysjobs
WHERE enabled = 0
ORDER BY name
SELECT '--Shows avail free DB space ' AS ' '
EXEC sp_MSForEachDB 'Use ? SELECT name AS ''Name of File'', size/128.0 -CAST(FILEPROPERTY(name, ''SpaceUsed'' ) AS int)/128.0 AS ''Available Space In MB'' FROM .SYSFILES'
SELECT '--Shows total DB size (.MDF+.LDF)' AS ' '
SET nocount ON
DECLARE @name SYSNAME
DECLARE @SQL NVARCHAR(600) -- Use temporary table to sum up database size w/o using group by
CREATE TABLE #databases
(
DATABASE_NAME SYSNAME NOT NULL
,size INT NOT NULL
)
DECLARE c1 CURSOR FOR SELECT name FROM master.dbo.sysdatabases
-- where has_dbaccess(name) = 1
-- Only look at databases to which we have access
OPEN c1
FETCH c1 INTO @name
WHILE @@fetch_status >= 0
BEGIN
SELECT @SQL = 'insert into #databases select N''' + @name
+ ''', sum(size) from ' + QUOTENAME(@name)
+ '.dbo.sysfiles' -- Insert row for each database
EXECUTE (@SQL)
FETCH c1 INTO @name
END
DEALLOCATE c1
SELECT DATABASE_NAME
,DATABASE_SIZE_MB = size * 8 / 1000 -- Convert from 8192 byte pages to K and then convert to MB
FROM #databases
ORDER BY 1
SELECT SUM(size * 8 / 1000) AS '--Shows disk space used - ALL DBs - MB '
FROM #databases ;
DROP TABLE #databases ;
SELECT '--Show hard drive space available ' AS ' ' ;
EXEC master..xp_fixeddrives ;
SELECT '*** End of Report **** ' ;
GO
分类:
MSSQL
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现