SQL_SERVER_Health check Report by uday uramlli
SQL_SERVER_Health check Report by uday uramlli
/*************************************************************/
/****************** Server Reboot Details ********************/
/*************************************************************/
/*************************************************************/
/****************** Current Blocking Details *****************/
/*************************************************************/
CREATE TABLE #BlkProcesses
(
spid varchar(5),
Blkspid varchar(5),
PrgName varchar(100),
LoginName varchar(100),
ObjName varchar(100),
Query varchar(255)
)
insert into #BlkProcesses
SELECT s.spid, BlockingSPID = s.blocked, substring(s.program_name,1,99),
SUBSTRING(s.loginame,1,99),
ObjectName = substring( OBJECT_NAME(objectid, s.dbid),1,99), Definition =
CAST(text AS VARCHAR(255))
FROM sys.sysprocesses s
CROSS APPLY sys.dm_exec_sql_text (sql_handle)
WHERE s.spid > 50 AND s.blocked > 0
/*************************************************************/
/****************** Errors audit for last 4 Days *************/
/*************************************************************/
/***********************************************************/
/************* Windows Disk Space Details ******************/
/***********************************************************/
CREATE TABLE #FreeSpace (DName CHAR(1), Free_MB BIGINT, Free_GB DECIMAL(16,2))
INSERT INTO #FreeSpace (DName,Free_MB) EXEC XP_FIXEDDRIVES;
UPDATE #FreeSpace SET Free_GB = CAST(Free_MB / 1024.00 AS DECIMAL(16,2));
/*************************************************************/
/************* SQL Server CPU Usage Details ******************/
/*************************************************************/
Create table #CPU(
servername varchar(100),
EventTime2 datetime,
SQLProcessUtilization varchar(50),
SystemIdle varchar(50),
OtherProcessUtilization varchar(50),
load_date datetime
)
DECLARE @ts BIGINT; DECLARE @lastNmin TINYINT;
SET @lastNmin = 240;
SELECT @ts =(SELECT cpu_ticks/(cpu_ticks/ms_ticks) FROM sys.dm_os_sys_info);
insert into #CPU
SELECT TOP 10 * FROM (
SELECT TOP(@lastNmin)
@ServerName AS 'ServerName',
DATEADD(ms,-1 *(@ts - [timestamp]),GETDATE())AS [Event_Time],
SQLProcessUtilization AS [SQLServer_CPU_Utilization],
SystemIdle AS [System_Idle_Process],
100 - SystemIdle - SQLProcessUtilization AS [Other_Process_CPU_Utilization],
GETDATE() AS 'LoadDate'
FROM (SELECT record.value('(./Record/@id)[1]','int')AS record_id,
record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]','int')AS
[SystemIdle],
record.value('(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)
[1]','int')AS [SQLProcessUtilization],
[timestamp]
FROM (SELECT[timestamp], convert(xml, record) AS [record]
FROM sys.dm_os_ring_buffers
WHERE ring_buffer_type =N'RING_BUFFER_SCHEDULER_MONITOR'AND record LIKE'%%')AS
x )AS y
ORDER BY SystemIdle ASC) d
/*************************************************************/
/************* SQL Server Memory Usage Details ***************/
/*************************************************************/
/****
UNION
SELECT 'Virtual_Address_Space_Committed_GB',virtual_address_space_committed_GB FROM
#Memory_process
UNION
SELECT 'Available_Commit_Limit_GB',available_commit_limit_GB FROM #Memory_process
UNION
SELECT 'Page_Fault_Count',page_fault_count FROM #Memory_process;
/******************************************************************/
/*************** Performance Counter Details **********************/
/******************************************************************/
-- Get SQL Server instance name as it require for capturing Buffer Cache hit Ratio
/******************************************************************/
/*************** Database Backup Report ***************************/
/******************************************************************/
UNION
--Databases without any backup history
SELECT CONVERT(CHAR(100), SERVERPROPERTY('Servername')) AS Server,
sd.NAME AS database_name,
NULL AS [Last Data Backup Date],
9999 AS [Backup Age (Hours)]
FROM master.dbo.sysdatabases sd
LEFT JOIN msdb.dbo.backupset bs
ON sd.name = bs.database_name
WHERE bs.database_name IS NULL AND sd.name <> 'tempdb' ) AS B
ORDER BY Database_Name;
/*************************************************************/
/****************** Connection Details ***********************/
/*************************************************************/
-- Number of connection on the instance grouped by hostnames
Create table #ConnInfo(
Hostname varchar(100),
NumberOfconn varchar(10)
)
insert into #ConnInfo
SELECT Case when len(hostname)=0 Then 'Internal Process' Else hostname
END,count(*)NumberOfconnections
FROM sys.sysprocesses
GROUP BY hostname
/*************************************************************/
/************** Currently Running Jobs Info ******************/
/*************************************************************/
Create table #JobInfo(
spid varchar(10),
lastwaittype varchar(100),
dbname varchar(100),
login_time varchar(100),
status varchar(100),
opentran varchar(100),
hostname varchar(100),
JobName varchar(100),
command nvarchar(2000),
domain varchar(100),
loginname varchar(100)
)
insert into #JobInfo
SELECT distinct
p.spid,p.lastwaittype,DB_NAME(p.dbid),p.login_time,p.status,p.open_tran,p.hostname,
J.name,
p.cmd,p.nt_domain,p.loginame
FROM master..sysprocesses p
INNER JOIN msdb..sysjobs j ON
substring(left(j.job_id,8),7,2) + substring(left(j.job_id,8),5,2) +
substring(left(j.job_id,8),3,2) + substring(left(j.job_id,8),1,2) =
substring(p.program_name, 32, 8)
Inner join msdb..sysjobactivity sj on j.job_id=sj.job_id
WHERE program_name like'SQLAgent - TSQL JobStep (Job %' and sj.stop_execution_date
is null
/*************************************************************/
/****************** Tempdb File Info *************************/
/*************************************************************/
-- tempdb file usage
Create table #tempdbfileusage(
servername varchar(100),
databasename varchar(100),
filename varchar(100),
physicalName varchar(100),
filesizeMB varchar(100),
availableSpaceMB varchar(100),
percentfull varchar(100)
)
/*************************************************************/
/****************** Database Log Usage ***********************/
/*************************************************************/
CREATE TABLE #LogSpace(
DBName VARCHAR(100),
LogSize VARCHAR(50),
LogSpaceUsed_Percent VARCHAR(100),
LStatus CHAR(1));
/********************************************************************/
/****************** Long Running Transactions ***********************/
/********************************************************************/
;WITH OpenTRAN AS
(SELECT session_id,transaction_id,is_user_transaction
FROM sys.dm_tran_session_transactions)
INSERT INTO #OpenTran_Detail
SELECT
LTRIM(RTRIM(OT.session_id)) AS 'SPID',
LTRIM(RTRIM(OT.transaction_id)) AS 'TranID',
CASE WHEN OT.is_user_transaction = '1' THEN 'Yes' ELSE 'No' END AS 'User_Tran',
db_name(LTRIM(RTRIM(s.dbid)))DBName,
LTRIM(RTRIM(login_time)) AS 'Login_Time',
DATEDIFF(MINUTE,login_time,GETDATE()) AS 'Duration',
LTRIM(RTRIM(last_batch)) AS 'Last_Batch',
LTRIM(RTRIM(status)) AS 'Status',
LTRIM(RTRIM(loginame)) AS 'LoginName',
LTRIM(RTRIM(hostname)) AS 'HostName',
LTRIM(RTRIM(program_name)) AS 'ProgramName',
LTRIM(RTRIM(cmd)) AS 'CMD',
LTRIM(RTRIM(a.text)) AS 'SQL',
LTRIM(RTRIM(blocked)) AS 'Blocked'
FROM sys.sysprocesses AS s
CROSS APPLY sys.dm_exec_sql_text(s.sql_handle)a
INNER JOIN OpenTRAN AS OT ON OT.session_id = s.spid
WHERE s.spid <> @@spid AND s.dbid>4;
/********************************************************************/
/****************** Top 20 Tables ***********************/
/********************************************************************/
--Alter Rows column datatype to BIGINT to get the result in sorted order
ALTER TABLE #Tab ALTER COLUMN [ROWS] BIGINT ;
/********************************************************************/
/****************** Index Fragmentation Details ***********************/
/********************************************************************/
/*************************************************************/
/****************** HTML Preparation *************************/
/*************************************************************/
-- Variable Assignment
SET @Cnt = 0
IF serverproperty('IsClustered') = 0
BEGIN
SELECT @ISClustered = 'No'
END
ELSE
BEGIN
SELECT @ISClustered = 'YES'
END
SELECT @SP = CONVERT(VARCHAR(100), SERVERPROPERTY ('productlevel'))
SET @TableHTML =
'
'
SET @TableHTML = @TableHTML +
'<div><img align="right" src="Images/Logo_Image.jpg" style="height: 50px; width:
50px"/><font face="Verdana" size="4" color="#3399ff"><H2><bold>Database Health
Check Report</bold></H2></font></div>
<table border="1" cellpadding="0" cellspacing="0" style="border-collapse:
collapse" bordercolor="#111111" width="47%" id="AutoNumber1" height="50">
<tr>
<td width="39%" height="22" bgcolor="#000080"><b>
<font face="Verdana" size="2" color="#FFFFFF">Server Name</font></b></td>
</tr>
<tr>
<td width="39%" height="27"><font face="Verdana" size="2">' + @ServerName
+'</font></td>
</tr>
</table>
<table id="AutoNumber1" style="BORDER-COLLAPSE: collapse" borderColor="#111111"
height="40" cellSpacing="0" cellPadding="0" width="933" border="2">
<tr>
<td align="Center" width="50%" bgColor="#000080" height="15"><b>
</tr>
<tr>
<td align="Center" width="50%" height="27"><font face="Verdana"
size="1">'+@version +'</font></td>
<td align="Center" width="17%" height="27"><font face="Verdana"
size="1">'+@edition+'</font></td>
<td align="Center" width="18%" height="27"><font face="Verdana"
size="1">'+@SP+'</font></td>
<td align="Center" width="17%" height="27"><font face="Verdana"
size="1">'+@ServerCollation+'</font></td>
<td align="Center" width="25%" height="27"><font face="Verdana"
size="1">'+@LicenseType+'</font></td>
<td align="Center" width="25%" height="27"><font face="Verdana"
size="1">'+@SingleUser+'</font></td>
<td align="Center" width="93%" height="27"><font face="Verdana"
size="1">'+@isclustered+'</font></td>
</tr>'
SELECT
@TableHTML = @TableHTML +
'</table>
<p style="margin-top: 1; margin-bottom: 0"> </p>
<tr>
<th align="Center" width="50" bgColor="#000080">
</tr>'
SELECT
@TableHTML = @TableHTML +
'<tr>
<td align="Center"><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100),
LastRecycle ), '') +'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100),
CurrentDate ), '') +'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100),
UpTimeInDays ), '') +'</font></td>' +
'</tr>'
FROM
#RebootDetails
<tr>
<th align="Center" width="136" bgColor="#000080">
</tr>'
SELECT
@TableHTML = @TableHTML +
'<tr>
<td align="Center"><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100),
DName ), '') +'</font></td>' +
CASE WHEN Free_GB < 30 THEN
'<td align="Center"><font face="Verdana" size="1" color="#FF0000"><b>' +
ISNULL(CONVERT(VARCHAR(100), Free_GB), '') +'</font></td>'
ELSE
'<td align="Center"><font face="Verdana" size="1" color="#40C211"><b>' +
ISNULL(CONVERT(VARCHAR(100), Free_GB), '') +'</font></td>'
END +
'</tr>'
FROM
#FreeSpace
<tr>
<th align="Center" width="300" bgColor="#000080">
</tr>'
select
@TableHTML = @TableHTML +
'<tr>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL(databasename, '') +
'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL(FileName, '')
+'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL(physicalName, '')
+'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL(filesizeMB, '')
+'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL(availableSpaceMB, '')
+'</font></td>' +
CASE WHEN CONVERT(DECIMAL(10,3),percentfull) >80.00 THEN
'<td align="Center"><font face="Verdana" size="1" color="#FF0000"><b>' +
ISNULL(percentfull, '') +'</b></font></td></tr>'
ELSE
'<td align="Center"><font face="Verdana" size="1">' + ISNULL(percentfull, '')
+'</font></td></tr>' END
from
#tempdbfileusage
<tr>
<th align="Center" width="300" bgColor="#000080">
</tr>'
SELECT
@TableHTML = @TableHTML +
'<tr>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100),
EventTime2 ), '') +'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' +
ISNULL(CONVERT(VARCHAR(100), SQLProcessUtilization ), '') +'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' +
ISNULL(CONVERT(VARCHAR(100), SystemIdle ), '') +'</font></td>' +
FROM
#CPU ORDER BY EventTime2;
<tr>
<th align="left" width="136" bgColor="#000080">
<tr>
<th align="left" width="136" bgColor="#000080">
<tr>
<th align="left" width="136" bgColor="#000080">
</tr>'
SELECT
@TableHTML = @TableHTML +
'<tr>
<td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100),
Database_Name ), '') +'</font></td>' +
'<td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100),
Last_Backup_Date), '') +'</font></td>' +
'</tr>'
FROM
#Backup_Report
SELECT
@TableHTML = @TableHTML +
'</table>
<p style="margin-top: 1; margin-bottom: 0"> </p>
<tr>
<th align="Center" width="136" bgColor="#000080">
</tr>'
SELECT
@TableHTML = @TableHTML +
'<tr>
<td align="Center"><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100),
Hostname ), '') +'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100),
NumberOfconn ), '') +'</font></td>' +
'</tr>'
FROM
#ConnInfo
<tr>
<th align="left" width="136" bgColor="#000080">
</tr>'
SELECT
@TableHTML = @TableHTML +
'<tr>
<td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100), DBName ), '')
+'</font></td>' +
'<td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100), LogSize ),
'') +'</font></td>' +
CASE WHEN CONVERT(DECIMAL(10,3),LogSpaceUsed_Percent) >80.00 THEN
'<td><font face="Verdana" size="1" color="#FF0000"><b>' +
ISNULL(CONVERT(VARCHAR(100), LogSpaceUsed_Percent ), '') +'</b></font></td>'
ELSE
'<td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100),
LogSpaceUsed_Percent ), '') +'</font></td>'
END +
'</tr>'
FROM
#LogSpace
<tr>
<th align="left" width="430" bgColor="#000080">
</tr>'
SELECT
@TableHTML = ISNULL(CONVERT(VARCHAR(MAX), @TableHTML), 'No Job Running') +
'<tr><td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100), spid), '')
+'</font></td>' +
'<td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(50),
lastwaittype),'') + '</font></td>' +
'<td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(50), dbname),'') +
'</font></td>' +
'<td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(50), login_time),'')
+'</font></td>' +
'<td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(50), status),'')
+'</font></td>' +
'<td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(50), opentran),'')
+'</font></td>' +
'<td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(50),
hostname),'') +'</font></td>' +
'<td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(500),
JobName),'') +'</font></td>' +
'<td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(200),
command),'') +'</font></td>' +
'<td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(50),
domain),'') +'</font></td>' +
'<td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(50),loginname ),'')
+ '</font></td></tr>'
FROM
#JobInfo
SELECT
@TableHTML = @TableHTML +
'</table>
<p style="margin-top: 1; margin-bottom: 0"> </p>
<tr>
<th align="Center" width="50" bgColor="#000080">
</tr>'
SELECT
@TableHTML = @TableHTML +
'<tr>
<td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100), @SERVERNAME ),
'') +'</font></td>' +
'<td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100), spid ), '')
+'</font></td>' +
'<td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100), Blkspid ),
'') +'</font></td>' +
'<td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100), PrgName ),
'') +'</font></td>' +
'<td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100), LoginName ),
'') +'</font></td>' +
'<td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100), ObjName ),
'') +'</font></td>' +
'<td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100), Query ), '')
+'</font></td>' +
'</tr>'
FROM
#BlkProcesses
ORDER BY spid
<tr>
<th align="Center" width="300" bgColor="#000080">
</tr>'
select
@TableHTML = @TableHTML +
'<tr>' +
'<td align="LEFT"><font face="Verdana" size="1">' + ISNULL([Table_Name], '') +
'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL([Row_Count], '')
+'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL([TotalSize(MB)], '')
+'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL([TotalSize(GB)], '')
+'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL([Data(MB)], '')
+'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL([Index_Size(MB)], '')
+'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL([UnUsed(MB)], '')
+'</font></td></tr>'
from
#Table_Counts ORDER BY ID;
<tr>
<th align="Center" width="300" bgColor="#000080">
from
#IdxFrag_Detail ORDER BY ID;
<tr>
<td width="20%" bgColor="#000080" height="15"><b>
<font face="Verdana" color="#ffffff" size="1">Check for Suspecious Errors - If
Any</font></b></td>
</tr>
</table>
<table style="BORDER-COLLAPSE: collapse" borderColor="#111111" cellPadding="0"
width="47%" bgColor="#ffffff" borderColorLight="#000000" border="2">
<tr>
<td width="20%" bgColor="#000080" height="15"><b>
<font face="Verdana" color="#ffffff" size="1">Error Log DateTime</font></b></td>
</tr>';
SELECT
@TableHTML = @TableHTML + '<tr>
<td width="20%" height="27"><font face="Verdana" size="1">'+
ISNULL(CONVERT(VARCHAR(100),LogDate ),'') +'</font></td>
</tr>'
FROM #ErrorLogInfo ORDER BY ID;
<p> </p>'