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