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