USE [Traces]
GO
/****** Object: StoredProcedure [dbo].[stpAlerta_Tamanho_MDF_Tempdb] Script Date: 04/11/2016 10:16:28 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/*******************************************************************************************************************************
-- ALERTA: TAMANHO MDF TEMPDB
*******************************************************************************************************************************/
IF ( OBJECT_ID('[dbo].[Alerta]') IS NOT NULL ) DROP TABLE [dbo].[Alerta]
CREATE TABLE [dbo].[Alerta] (
[Id_Alerta] INT IDENTITY PRIMARY KEY,
[Nm_Alerta] VARCHAR(200),
[Ds_Mensagem] VARCHAR(2000),
[Fl_Tipo] TINYINT, -- 0: CLEAR / 1: ALERTA
[Dt_Alerta] DATETIME DEFAULT(GETDATE())
)
GO
IF ( OBJECT_ID('[dbo].[stpAlerta_Tamanho_MDF_Tempdb]') IS NOT NULL ) DROP PROCEDURE [dbo].[stpAlerta_Tamanho_MDF_Tempdb]
GO
CREATE PROCEDURE [dbo].[stpAlerta_Tamanho_MDF_Tempdb]
AS
BEGIN
SET NOCOUNT ON
declare @ProfileSQL varchar(100),
@Emails varchar(255)
declare @Tempo_Conexoes_Hs tinyint, @Tamanho_Arquivo_TEMPDB int
--Parâmetros
set @Tempo_Conexoes_Hs = 1 -- Conexões mais antigas que 1 hora
set @Tamanho_Arquivo_TEMPDB = 100 -- Só começa a alertar quando o tamanho do arquivo do TEMPDB passar de 100 MB
set @ProfileSQL = 'Seu Profile'
set @Emails = 'Seu Email'
-- Declara as variaveis
DECLARE @Subject VARCHAR(500), @Fl_Tipo TINYINT, @Importance AS VARCHAR(6), @EmailBody VARCHAR(MAX), @AlertaTamanhoMDFTempdbHeader VARCHAR(MAX), @AlertaTamanhoMDFTempdbTable VARCHAR(MAX),
@AlertaTamanhoMDFTempdbConexoesHeader VARCHAR(MAX), @AlertaTamanhoMDFTempdbConexoesTable VARCHAR(MAX), @EmptyBodyEmail VARCHAR(MAX)
-- Verifica o último Tipo do Alerta registrado -> 0: CLEAR / 1: ALERTA
SELECT @Fl_Tipo = [Fl_Tipo]
FROM [dbo].[Alerta]
WHERE [Id_Alerta] = (SELECT MAX(Id_Alerta) FROM [dbo].[Alerta] WHERE [Nm_Alerta] = 'Tamanho Arquivo MDF Tempdb' )
-- Busca as informações do Tempdb
IF ( OBJECT_ID('tempdb..#Alerta_Tamanho_MDF_Tempdb') IS NOT NULL )
DROP TABLE #Alerta_Tamanho_MDF_Tempdb
select
reserved_MB = CAST((unallocated_extent_page_count+version_store_reserved_page_count+user_object_reserved_page_count +
internal_object_reserved_page_count+mixed_extent_page_count)*8/1024. AS numeric(15,2)) ,
unallocated_extent_MB = CAST(unallocated_extent_page_count*8/1024. AS NUMERIC(15,2)),
internal_object_reserved_MB = CAST(internal_object_reserved_page_count*8/1024. AS NUMERIC(15,2)),
version_store_reserved_MB = CAST(version_store_reserved_page_count*8/1024. AS NUMERIC(15,2)),
user_object_reserved_MB = convert(numeric(10,2),round(user_object_reserved_page_count*8/1024.,2))
into #Alerta_Tamanho_MDF_Tempdb
from tempdb.sys.dm_db_file_space_usage
IF ( OBJECT_ID('tempdb..#Alerta_Tamanho_MDF_Tempdb_Conexoes') IS NOT NULL )
DROP TABLE #Alerta_Tamanho_MDF_Tempdb_Conexoes
-- Busca as transações que estão abertas
CREATE TABLE #Alerta_Tamanho_MDF_Tempdb_Conexoes(
[session_id] [smallint] NULL,
[login_time] [varchar](40) NULL,
[login_name] [nvarchar](128) NULL,
[host_name] [nvarchar](128) NULL,
[open_transaction_Count] [int] NULL,
[status] [nvarchar](30) NULL,
[cpu_time] [int] NULL,
[total_elapsed_time] [int] NULL,
[reads] [bigint] NULL,
[writes] [bigint] NULL,
[logical_reads] [bigint] NULL
) ON [PRIMARY]
-- Query Alerta Tempdb - Conexões abertas - Incluir no Alerta TempDb
INSERT INTO #Alerta_Tamanho_MDF_Tempdb_Conexoes
SELECT session_id, convert(varchar(20),login_time,120) AS login_time, login_name, host_name, open_transaction_Count, status, cpu_time,
total_elapsed_time, reads, writes, logical_reads
FROM sys.dm_exec_sessions
WHERE session_id > 50
and open_transaction_Count > 0
and dateadd(hour,-@Tempo_Conexoes_Hs,getdate()) > login_time
-- Tratamento caso não retorne nenhuma conexão
IF NOT EXISTS (SELECT TOP 1 session_id FROM #Alerta_Tamanho_MDF_Tempdb_Conexoes)
BEGIN
INSERT INTO #Alerta_Tamanho_MDF_Tempdb_Conexoes
VALUES(NULL, 'Sem conexao aberta a mais de 1 hora', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
END
/*******************************************************************************************************************************
-- Verifica se o Consumo do Arquivo do Tempdb está maior do que 70% do tamanho atual do MDF
*******************************************************************************************************************************/
IF EXISTS (
select TOP 1 unallocated_extent_MB
from #Alerta_Tamanho_MDF_Tempdb
where reserved_MB > @Tamanho_Arquivo_TEMPDB -- Tamanho do arquivo > 10 GB
and unallocated_extent_MB < reserved_MB * 0.3
)
BEGIN -- INICIO - ALERTA
IF ISNULL(@Fl_Tipo, 0) = 0 -- Envia o Alerta apenas uma vez
BEGIN
/*******************************************************************************************************************************
-- CRIA O EMAIL - ALERTA - TAMANHO ARQUIVO MDF TEMPDB
*******************************************************************************************************************************/
--------------------------------------------------------------------------------------------------------------------------------
-- ALERTA - HEADER
--------------------------------------------------------------------------------------------------------------------------------
SET @AlertaTamanhoMDFTempdbHeader = ''
SET @AlertaTamanhoMDFTempdbHeader = @AlertaTamanhoMDFTempdbHeader + '
Tamanho Arquivo MDF Tempdb
'
SET @AlertaTamanhoMDFTempdbHeader = @AlertaTamanhoMDFTempdbHeader + ''
--------------------------------------------------------------------------------------------------------------------------------
-- ALERTA - BODY
--------------------------------------------------------------------------------------------------------------------------------
SET @AlertaTamanhoMDFTempdbTable = CAST( (
SELECT td = CAST(reserved_MB AS VARCHAR) + ''
+ '
' + CAST(unallocated_extent_MB AS VARCHAR) + ' | '
+ '' + CAST(internal_object_reserved_MB AS VARCHAR) + ' | '
+ '' + CAST(version_store_reserved_MB AS VARCHAR) + ' | '
+ '' + CAST(user_object_reserved_MB AS VARCHAR) + ' | '
FROM (
-- Dados da Tabela do EMAIL
select reserved_MB,
unallocated_extent_MB,
internal_object_reserved_MB,
version_store_reserved_MB,
user_object_reserved_MB
from #Alerta_Tamanho_MDF_Tempdb
) AS D
FOR XML PATH( 'tr' ), TYPE) AS VARCHAR(MAX)
)
-- Corrige a Formatação da Tabela
SET @AlertaTamanhoMDFTempdbTable = REPLACE( REPLACE( REPLACE( @AlertaTamanhoMDFTempdbTable, '<', '<'), '>', '>'), '', ' | ')
-- Títulos da Tabela do EMAIL
SET @AlertaTamanhoMDFTempdbTable =
''
+ '
Espaço Reservado (MB) |
Espaço Não Alocado (MB) |
Espaço Objetos Internos (MB) |
Espaço Version Store (MB) |
Espaço Objetos de Usuário (MB) |
'
+ REPLACE( REPLACE( @AlertaTamanhoMDFTempdbTable, '<', '<'), '>', '>')
+ ' '
/*******************************************************************************************************************************
-- CRIA O EMAIL - ALERTA - CONEXOES COM TRANSACAO ABERTA
*******************************************************************************************************************************/
--------------------------------------------------------------------------------------------------------------------------------
-- ALERTA - HEADER
--------------------------------------------------------------------------------------------------------------------------------
SET @AlertaTamanhoMDFTempdbConexoesHeader = ''
SET @AlertaTamanhoMDFTempdbConexoesHeader = @AlertaTamanhoMDFTempdbConexoesHeader + ' Conexões com Transação Aberta '
SET @AlertaTamanhoMDFTempdbConexoesHeader = @AlertaTamanhoMDFTempdbConexoesHeader + ''
--------------------------------------------------------------------------------------------------------------------------------
-- ALERTA - BODY
--------------------------------------------------------------------------------------------------------------------------------
SET @AlertaTamanhoMDFTempdbConexoesTable = CAST( (
SELECT td = session_id + ' | '
+ '' + login_time + ' | '
+ '' + login_name + ' | '
+ '' + host_name + ' | '
+ '' + open_transaction_Count + ' | '
+ '' + status + ' | '
+ '' + cpu_time + ' | '
+ '' + total_elapsed_time + ' | '
+ '' + reads + ' | '
+ '' + writes + ' | '
+ '' + logical_reads + ' | '
FROM (
-- Dados da Tabela do EMAIL
select ISNULL(CAST(session_id AS VARCHAR), '-') AS session_id,
ISNULL(login_time, '-') AS login_time,
ISNULL(login_name, '-') AS login_name,
ISNULL(host_name, '-') AS host_name,
ISNULL(CAST(open_transaction_Count AS VARCHAR),'-') AS open_transaction_Count,
ISNULL(status, '-') AS status,
ISNULL(CAST(cpu_time AS VARCHAR),'-') AS cpu_time,
ISNULL(CAST(total_elapsed_time AS VARCHAR),'-') AS total_elapsed_time,
ISNULL(CAST(reads AS VARCHAR),'-') AS reads,
ISNULL(CAST(writes AS VARCHAR),'-') AS writes,
ISNULL(CAST(logical_reads AS VARCHAR),'-') AS logical_reads
from #Alerta_Tamanho_MDF_Tempdb_Conexoes
) AS D
FOR XML PATH( 'tr' ), TYPE) AS VARCHAR(MAX)
)
-- Corrige a Formatação da Tabela
SET @AlertaTamanhoMDFTempdbConexoesTable = REPLACE( REPLACE( REPLACE( @AlertaTamanhoMDFTempdbConexoesTable, '<', '<'), '>', '>'), '', ' | ')
-- Títulos da Tabela do EMAIL
SET @AlertaTamanhoMDFTempdbConexoesTable =
''
+ '
session_id |
login_time |
login_name |
host_name |
open_transaction_Count |
status |
cpu_time |
total_elapsed_time |
reads |
writes |
logical_reads |
'
+ REPLACE( REPLACE( @AlertaTamanhoMDFTempdbConexoesTable, '<', '<'), '>', '>')
+ ' '
--------------------------------------------------------------------------------------------------------------------------------
-- Insere um Espaço em Branco no EMAIL
--------------------------------------------------------------------------------------------------------------------------------
SET @EmptyBodyEmail = ''
SET @EmptyBodyEmail =
'' +
'
|
'
+ REPLACE( REPLACE( ISNULL(@EmptyBodyEmail,''), '<', '<'), '>', '>')
+ ' '
/*******************************************************************************************************************************
-- Seta as Variáveis do EMAIL
*******************************************************************************************************************************/
SELECT @Importance = 'High',
@Subject = 'ALERTA: O Tamanho do Arquivo MDF do Tempdb está acima de 70% no Servidor: ' + @@SERVERNAME,
@EmailBody = @AlertaTamanhoMDFTempdbHeader + @EmptyBodyEmail + @AlertaTamanhoMDFTempdbTable + @EmptyBodyEmail +
@AlertaTamanhoMDFTempdbConexoesHeader + @EmptyBodyEmail + @AlertaTamanhoMDFTempdbConexoesTable + @EmptyBodyEmail
/*******************************************************************************************************************************
-- Inclui uma imagem com link para o site do Fabricio Lima
*******************************************************************************************************************************/
select @EmailBody = @EmailBody + '
' +
'
'
/*******************************************************************************************************************************
-- ENVIA O EMAIL - ALERTA
*******************************************************************************************************************************/
EXEC [msdb].[dbo].[sp_send_dbmail]
@profile_name = @ProfileSQL,
@recipients = @Emails,
@subject = @Subject,
@body = @EmailBody,
@body_format = 'HTML',
@importance = @Importance
/*******************************************************************************************************************************
-- Insere um Registro na Tabela de Controle dos Alertas -> Fl_Tipo = 1 : ALERTA
*******************************************************************************************************************************/
INSERT INTO [dbo].[Alerta] ( [Nm_Alerta], [Ds_Mensagem], [Fl_Tipo] )
SELECT 'Tamanho Arquivo MDF Tempdb', @Subject, 1
END
END -- FIM - ALERTA
ELSE
BEGIN -- INICIO - CLEAR
IF @Fl_Tipo = 1
BEGIN
/*******************************************************************************************************************************
-- CRIA O EMAIL - CLEAR - TAMANHO ARQUIVO MDF TEMPDB
*******************************************************************************************************************************/
--------------------------------------------------------------------------------------------------------------------------------
-- CLEAR - HEADER
--------------------------------------------------------------------------------------------------------------------------------
SET @AlertaTamanhoMDFTempdbHeader = ''
SET @AlertaTamanhoMDFTempdbHeader = @AlertaTamanhoMDFTempdbHeader + ' Tamanho Arquivo MDF Tempdb '
SET @AlertaTamanhoMDFTempdbHeader = @AlertaTamanhoMDFTempdbHeader + ''
--------------------------------------------------------------------------------------------------------------------------------
-- CLEAR - BODY
--------------------------------------------------------------------------------------------------------------------------------
SET @AlertaTamanhoMDFTempdbTable = CAST( (
SELECT td = CAST(reserved_MB AS VARCHAR) + ' | '
+ '' + CAST(unallocated_extent_MB AS VARCHAR) + ' | '
+ '' + CAST(internal_object_reserved_MB AS VARCHAR) + ' | '
+ '' + CAST(version_store_reserved_MB AS VARCHAR) + ' | '
+ '' + CAST(user_object_reserved_MB AS VARCHAR) + ' | '
FROM (
-- Dados da Tabela do EMAIL
select reserved_MB,
unallocated_extent_MB,
internal_object_reserved_MB,
version_store_reserved_MB,
user_object_reserved_MB
from #Alerta_Tamanho_MDF_Tempdb
) AS D
FOR XML PATH( 'tr' ), TYPE) AS VARCHAR(MAX)
)
-- Corrige a Formatação da Tabela
SET @AlertaTamanhoMDFTempdbTable = REPLACE( REPLACE( REPLACE( @AlertaTamanhoMDFTempdbTable, '<', '<'), '>', '>'), '', ' | ')
-- Títulos da Tabela do EMAIL
SET @AlertaTamanhoMDFTempdbTable =
''
+ '
Espaço Reservado (MB) |
Espaço Não Alocado (MB) |
Espaço Objetos Internos (MB) |
Espaço Version Store (MB) |
Espaço Objetos de Usuário (MB) |
'
+ REPLACE( REPLACE( @AlertaTamanhoMDFTempdbTable, '<', '<'), '>', '>')
+ ' '
/*******************************************************************************************************************************
-- CRIA O EMAIL - CLEAR - CONEXOES COM TRANSACAO ABERTA
*******************************************************************************************************************************/
--------------------------------------------------------------------------------------------------------------------------------
-- CLEAR - HEADER
--------------------------------------------------------------------------------------------------------------------------------
SET @AlertaTamanhoMDFTempdbConexoesHeader = ''
SET @AlertaTamanhoMDFTempdbConexoesHeader = @AlertaTamanhoMDFTempdbConexoesHeader + ' Conexões com Transação Aberta '
SET @AlertaTamanhoMDFTempdbConexoesHeader = @AlertaTamanhoMDFTempdbConexoesHeader + ''
--------------------------------------------------------------------------------------------------------------------------------
-- CLEAR - BODY
--------------------------------------------------------------------------------------------------------------------------------
SET @AlertaTamanhoMDFTempdbConexoesTable = CAST( (
SELECT td = session_id + ' | '
+ '' + login_time + ' | '
+ '' + login_name + ' | '
+ '' + host_name + ' | '
+ '' + open_transaction_Count + ' | '
+ '' + status + ' | '
+ '' + cpu_time + ' | '
+ '' + total_elapsed_time + ' | '
+ '' + reads + ' | '
+ '' + writes + ' | '
+ '' + logical_reads + ' | '
FROM (
-- Dados da Tabela do EMAIL
select ISNULL(CAST(session_id AS VARCHAR), '-') AS session_id,
ISNULL(login_time, '-') AS login_time,
ISNULL(login_name, '-') AS login_name,
ISNULL(host_name, '-') AS host_name,
ISNULL(CAST(open_transaction_Count AS VARCHAR),'-') AS open_transaction_Count,
ISNULL(status, '-') AS status,
ISNULL(CAST(cpu_time AS VARCHAR),'-') AS cpu_time,
ISNULL(CAST(total_elapsed_time AS VARCHAR),'-') AS total_elapsed_time,
ISNULL(CAST(reads AS VARCHAR),'-') AS reads,
ISNULL(CAST(writes AS VARCHAR),'-') AS writes,
ISNULL(CAST(logical_reads AS VARCHAR),'-') AS logical_reads
from #Alerta_Tamanho_MDF_Tempdb_Conexoes
) AS D
FOR XML PATH( 'tr' ), TYPE) AS VARCHAR(MAX)
)
-- Corrige a Formatação da Tabela
SET @AlertaTamanhoMDFTempdbConexoesTable = REPLACE( REPLACE( REPLACE( @AlertaTamanhoMDFTempdbConexoesTable, '<', '<'), '>', '>'), '', ' | ')
-- Títulos da Tabela do EMAIL
SET @AlertaTamanhoMDFTempdbConexoesTable =
''
+ '
session_id |
login_time |
login_name |
host_name |
open_transaction_Count |
status |
cpu_time |
total_elapsed_time |
reads |
writes |
logical_reads |
'
+ REPLACE( REPLACE( @AlertaTamanhoMDFTempdbConexoesTable, '<', '<'), '>', '>')
+ ' '
--------------------------------------------------------------------------------------------------------------------------------
-- Insere um Espaço em Branco no EMAIL
--------------------------------------------------------------------------------------------------------------------------------
SET @EmptyBodyEmail = ''
SET @EmptyBodyEmail =
'' +
'
|
'
+ REPLACE( REPLACE( ISNULL(@EmptyBodyEmail,''), '<', '<'), '>', '>')
+ ' '
/*******************************************************************************************************************************
-- Seta as Variáveis do EMAIL
*******************************************************************************************************************************/
SELECT @Importance = 'High',
@Subject = 'CLEAR: O Tamanho do Arquivo MDF do Tempdb está abaixo de 70% no Servidor: ' + @@SERVERNAME,
@EmailBody = @AlertaTamanhoMDFTempdbHeader + @EmptyBodyEmail + @AlertaTamanhoMDFTempdbTable + @EmptyBodyEmail +
@AlertaTamanhoMDFTempdbConexoesHeader + @EmptyBodyEmail + @AlertaTamanhoMDFTempdbConexoesTable + @EmptyBodyEmail
/*******************************************************************************************************************************
-- Inclui uma imagem com link para o site do Fabricio Lima
*******************************************************************************************************************************/
select @EmailBody = @EmailBody + '
' +
'
'
/*******************************************************************************************************************************
-- ENVIA O EMAIL - CLEAR
*******************************************************************************************************************************/
EXEC [msdb].[dbo].[sp_send_dbmail]
@profile_name = @ProfileSQL,
@recipients = @Emails,
@subject = @Subject,
@body = @EmailBody,
@body_format = 'HTML',
@importance = @Importance
/*******************************************************************************************************************************
-- Insere um Registro na Tabela de Controle dos Alertas -> Fl_Tipo = 0 : CLEAR
*******************************************************************************************************************************/
INSERT INTO [dbo].[Alerta] ( [Nm_Alerta], [Ds_Mensagem], [Fl_Tipo] )
SELECT 'Tamanho Arquivo MDF Tempdb', @Subject, 0
END
END -- FIM - CLEAR
END
GO
|