数据库自动对磁盘可用空间与日志文件过大的预警情况进么邮件提醒

-- 注意 MQLCK_profile 这个是要先定义好的数据库邮件配置文件名

数据库自动对磁盘可用空间与日志文件过大的预警情况进么邮件提醒_第1张图片
-- exec MQ_CheckDriveFreeSpace 'F',10000
Create Proc MQ_CheckDriveFreeSpace (@cDrive as  varchar(2),@nMinSizeMB  as int)
 WITH ENCRYPTION as 
Begin
 
    Declare @nGetSizeMB as int
    Declare @cDBInfo as varchar(50)
    Declare @cEmlist1 as varchar(200)
    Declare @cEmlist2 as varchar(200)
    Set @cDBInfo = '15.11(HTSAC/SRM)'    --101.12(QC)
    set @cEmlist1 = '[email protected];[email protected];[email protected]'
    set @cEmlist2 = '[email protected];'
    
    Declare @nMaxLogSize as int        --最大日志文件大小  MB
    Set @nMaxLogSize = 10000        --10GB 
    
    --Set @cDrive ='D'
    --SET @nMinSizeMB = 26000
    create table #_tmp_MQGetDriveSizeSQLExec(cDrive varchar(2),nSizeMB int)
    insert #_tmp_MQGetDriveSizeSQLExec Exec master.dbo.xp_fixeddrives


    SELECT @nGetSizeMB = nSizeMB FROM #_tmp_MQGetDriveSizeSQLExec Where cDrive = @cDrive
    Select @nGetSizeMB
    IF @nGetSizeMB < @nMinSizeMB 
    Begin
        Declare @nSize as DECIMAL(18,2) 
        Declare @nLDFSize as DECIMAL(18,2)  
        Declare @cDBMess as varchar(max)
        Declare @cDatabase as varchar(200)
        Declare @cSQL as nvarchar(max)
        Declare @nTotal as DECIMAL(18,2)  
        Declare @nDBCount as int
        Set @nDBCount = 0
        Set @nTotal = 0 
        Set @cDBMess = ''
        Declare iCur_MQDBList INSENSITIVE cursor for 
        SELECT DISTINCT Name FROM Master..SysDatabases 
        Where not  name  in ('master' ,'model','msdb','distribution','ReportServer','ReportServerTempDB')
            ORDER BY Name
            
        Open iCur_MQDBList
        Fetch Next From iCur_MQDBList into @cDatabase

        WHILE @@FETCH_STATUS = 0
        BEGIN
            Set @nDBCount = @nDBCount + 1
            Set @cSQL = 'Select @nSize =SUM( convert(float,size) * (8192.0/1024.0)/1024.0) from '+@cDatabase+'.dbo.sysfiles '
            EXEC sp_executesql @cSQL, N'@nSize DECIMAL(18,2) out', @nSize OUT        
            /*    
             SELECT  @nSize = ((size * 8) / 1024)  
                FROM sys.master_files
                WHERE DB_NAME(database_id) IN(@cDatabase)    
                    And Physical_Name Like '%.MDF'
                    */
            SELECT  @nLDFSize = Cast(((size * 8) / 1024)   as DECIMAL(18,2))
                FROM sys.master_files
                WHERE DB_NAME(database_id) IN(@cDatabase)    
                    And Physical_Name Like '%.LDF'
                
            Set @nTotal     = @nTotal + @nSize + @nLDFSize
                
            Set @cDBMess = @cDBMess++REPLICATE(' ',3)+ '    ' +CAST(@nDBCount as varchar(50))+ '.  数据库('+@cDatabase+')'+REPLICATE(' ',(20-LEN(@cDatabase))/2) + '数据文件大小: ' + Left(cast(Cast(@nSize/1000 as DECIMAL(18,2) )   as varchar(15)),7) +' GB / 日志大小: ' + Left(cast(cast(@nLDFSize/1000  as DECIMAL(18,2) )   as varchar(15)),7)+' GB' +'
'
            
            Fetch Next From iCur_MQDBList into @cDatabase        
        End    
    --    set @cDatabase = 'brd'
        Close iCur_MQDBList
        DEALLOCATE iCur_MQDBList
    
        Declare @cMess as varchar(Max)
        Declare @cSubject as varchar(200)
        Set @cMess =  REPLICATE(' ',2)+ ' 严重提示,硬盘空间快消耗光!!!
'+   '('+ @cDrive +') 盘空间已接近消耗完,当前('+@cDrive+') 盘可用空间 '+RTRIM(CAST(Cast(@nGetSizeMB /1000.0 as DECIMAL(18,2) ) as char(20)))+' GB (预警值:'+RTRIM(CAST(cast(@nMinSizeMB /1000.0 as DECIMAL(18,2) ) as char(20)))+' GB),请尽快采取措施维护数据库的硬盘可用空间在预警值以上,紧急!!!'+'
'+REPLICATE(' ',3)+ ' 详情如下(所有用户数据库合计使用空间:'+Rtrim(cast(Cast(@nTotal /1000 as DECIMAL(18,2) ) as varchar(20)))+'GB):'+'
' + @cDBMess+'
'+'
'+REPLICATE(' ',30) +CONVERT(varchar(30),GETDATE(),120)+'
'+REPLICATE(' ',30) +'易登科'        
        Set @cSubject = '    注意: 数据库服务器'+@cDBInfo+' 数据文件所在[' + @cDrive +']盘空间快消耗完!' -- 邮件标题 
         Exec msdb..sp_send_dbmail 
            @profile_name =  'MQLCK_profile'     -- profile 名称 
            ,@recipients   =   @cEmlist1    -- '[email protected]; '     -- 收件人邮箱 
            ,@subject      =  @cSubject
            ,@body         =  @cMess 
            ,@body_format  =  'HTML'      -- 邮件格式      
    End
    Else
    BEGIN
        Set @cMess = ' 当前('+@cDrive+') 盘可用空间 '+RTRIM(CAST(@nGetSizeMB /1000.0 as char(20)))+' GB (预警值:'+RTRIM(CAST(@nMinSizeMB /1000.0 as char(20)))+' GB)'
        Print @cMess    
    End
    
    

     create table #tmp_MQGetDBLogSpaceSQLExec( dbname   nvarchar(50) not null
      ,logsize  decimal(8,2) not null
      ,logused  decimal(5,2) not null
      ,status   int          null)
  
    insert   #tmp_MQGetDBLogSpaceSQLExec Exec('DBCC SQLPERF(LOGSPACE)')
    
    Select * from #tmp_MQGetDBLogSpaceSQLExec
    
    Declare iCur_MQDBLogList INSENSITIVE cursor for 
    Select dbname,logsize,logused From #tmp_MQGetDBLogSpaceSQLExec
    Where not  dbname  in ('master','tempdb' ,'model','msdb','distribution','ReportServer','ReportServerTempDB')
      And logsize > @nMaxLogSize
      ORDER BY dbname
      
     Declare @dbname as  nvarchar(50) 
        ,@logsize as    decimal(8,2)
        ,@logused as    decimal(5,2)
        ,@cDBLogMess as nvarchar(max)
        ,@nDBLogCount as int
    Set @cDBLogMess = ''
    Set @nDBLogCount = 0
     Open iCur_MQDBLogList
        Fetch Next From iCur_MQDBLogList into @dbname,@logsize,@logused

    WHILE @@FETCH_STATUS = 0
    BEGIN
        Set @nDBLogCount = @nDBLogCount + 1
        
        Set @cDBLogMess = @cDBLogMess++REPLICATE(' ',3)+ '    ' +CAST(@nDBLogCount as varchar(50))+ '.  数据库('+@dbname+')'+REPLICATE(' ',(20-LEN(@dbname))/2) + '日志文件大小: ' + Left(cast(Cast(@logsize/1000 as DECIMAL(18,2) )   as varchar(15)),7) +'   GB'+' 日志文件已使用率'+ Cast(@logused AS varchar(10))+'% ' +'
'
        Fetch Next From iCur_MQDBLogList into @dbname,@logsize,@logused
    End 
    
    Close iCur_MQDBLogList
    DEALLOCATE iCur_MQDBLogList
    
    IF @nDBLogCount > 0
    BEGIN
        Set @cMess =  REPLICATE(' ',2)+ ' 异常提示,日志文件过大'+'(预警值:'+RTRIM(CAST(cast(@nMinSizeMB /1000.0 as DECIMAL(18,2) ) as char(20)))+' GB)!!!
'+  ' 请尽快采取措施维护数据库的日志文件在预警值以下!'+'
'+REPLICATE(' ',3)+ ' 详情如下:'+'
' + @cDBLogMess+'
'+'
'+REPLICATE(' ',30) +CONVERT(varchar(30),GETDATE(),120)+'
'+REPLICATE(' ',30) +'易登科'        
        Set @cSubject = '    注意: 数据库服务器'+@cDBInfo+'中出现日志文件过大的异常情况!' -- 邮件标题 
         Exec msdb..sp_send_dbmail 
            @profile_name =  'MQLCK_profile'     -- profile 名称 
            ,@recipients   =   @cEmlist2    -- '[email protected]; '     -- 收件人邮箱 
            ,@subject      =  @cSubject
            ,@body         =  @cMess 
            ,@body_format  =  'HTML'      -- 邮件格式      
    End 
      
    Drop table #tmp_MQGetDBLogSpaceSQLExec
    
    
    
    
    drop TABLE #_tmp_MQGetDriveSizeSQLExec
End

你可能感兴趣的:(SQL,Server)