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 = '' + '' + REPLACE( REPLACE( @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)
' /******************************************************************************************************************************* -- 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 = '' + '' + REPLACE( REPLACE( @AlertaTamanhoMDFTempdbConexoesTable, '<', '<'), '>', '>') + '
session_id login_time login_name host_name open_transaction_Count status cpu_time total_elapsed_time reads writes logical_reads
' -------------------------------------------------------------------------------------------------------------------------------- -- 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 = '' + '' + REPLACE( REPLACE( @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)
' /******************************************************************************************************************************* -- 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 = '' + '' + REPLACE( REPLACE( @AlertaTamanhoMDFTempdbConexoesTable, '<', '<'), '>', '>') + '
session_id login_time login_name host_name open_transaction_Count status cpu_time total_elapsed_time reads writes logical_reads
' -------------------------------------------------------------------------------------------------------------------------------- -- 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