-- 注意 MQLCK_profile 这个是要先定义好的数据库邮件配置文件名
-- 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