Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
andrew shalaev Member Откуда: Moscow Сообщений: 610 |
Доброго времени суток! СУБД: Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86) Nov 24 2008 13:01:59 Copyright (c) 1988-2005 Microsoft Corporation Standard Edition on Windows NT 5.2 (Build 3790: Service Pack 2) Есть задача настроить алерты на событие, если размер свободного пространства на дисках станет меньше 10% от общего размера. На данный момент у меня работает скрипт, который проверяет свободное место на заданное значение(если менее 10 Гб то пишем письмо). Реализовано это следующим образом:
Но процедура
xp_fixeddrives
показывает только свободное место, а как можно узнать сколько всего места на локальных дисках?
|
|
2 июл 12, 10:33 [12802428] Ответить | Цитировать Сообщить модератору |
denisofff Member Откуда: Владивосток Сообщений: 62 |
andrew shalaev, Нашел в закромах кода такой скрипт. Проверил, работает. Использует утилиту fsutil, кажется, начиная с 2003 сервера идет в поставке. Правда, использует курсоры и xp_cmdshell... Так что, возможно, можно поискать обходной путь. DECLARE @drives TABLE ( drive CHAR(1), free INT ) INSERT INTO @drives EXEC xp_fixeddrives DECLARE @drive CHAR(1) ,@str VARCHAR(255) DECLARE @tmp TABLE ( cmd_output VARCHAR(255) ) DECLARE @drives_info TABLE ( drive CHAR(1), free_bytes BIGINT, total_bytes BIGINT ) DECLARE cur CURSOR LOCAL FAST_FORWARD FOR SELECT drive FROM @drives ORDER BY drive OPEN cur FETCH NEXT FROM cur INTO @drive WHILE @@fetch_status = 0 BEGIN DELETE FROM @tmp SET @str = 'exec xp_cmdshell ''fsutil volume diskfree ' + @drive + ':''' INSERT INTO @tmp EXEC (@str) INSERT INTO @drives_info SELECT @drive, substring(t1.cmd_output, charindex(':', t1.cmd_output) + 2, len(t1.cmd_output) - charindex(':', t1.cmd_output) - 2), substring(t2.cmd_output, charindex(':', t2.cmd_output) + 2, len(t2.cmd_output) - charindex(':', t2.cmd_output) - 2) FROM @tmp t1, @tmp t2 WHERE t1.cmd_output like 'Всего свободно байт %' and t2.cmd_output like 'Всего байт%' FETCH NEXT FROM cur INTO @drive END CLOSE cur DEALLOCATE cur DECLARE @res VARCHAR(MAX) SET @res = '' SELECT @res = @res + 'На диске ' + drive + ' осталось ' + CONVERT(VARCHAR(20), [free]) + '% свободного места' + CHAR(10) FROM ( SELECT drive, CAST(free_bytes/1024/1024 AS DECIMAL(10, 2)) AS [FREE_MB], CAST(total_bytes/1024/1024 AS DECIMAL(10, 2)) AS [TOTAL_MB], CAST(free_bytes*100.0/total_bytes as DECIMAL(6,2)) as [free] FROM @drives_info ) AS o_o WHERE [free] <= 20 SELECT @res = @res + 'На диске ' + drive + ' осталось ' + CONVERT(VARCHAR(20), [free_mb]) + ' Мб свободного места' + CHAR(10) FROM ( SELECT drive, CAST(free_bytes/1024/1024 AS DECIMAL(10, 2)) AS [FREE_MB], CAST(total_bytes/1024/1024 AS DECIMAL(10, 2)) AS [TOTAL_MB], CAST(free_bytes*100.0/total_bytes as DECIMAL(6,2)) as [free] FROM @drives_info ) AS o_o WHERE free_mb <= 2000 IF @res <> '' BEGIN EXEC msdb.dbo.sp_send_dbmail @profile_name = 'SQLMail', @recipients = N'admin@admin.admin', @body = @RES, @subject='Внимание! Проблемы на сервере SQL' END |
2 июл 12, 10:46 [12802518] Ответить | Цитировать Сообщить модератору |
Критик Member Откуда: Москва / Калуга Сообщений: 34727 Блог |
Рекомендую не изобретать велосипед: SSMS -> Агент SQL Server -> Предупреждения |
2 июл 12, 11:09 [12802653] Ответить | Цитировать Сообщить модератору |
andrew shalaev Member Откуда: Moscow Сообщений: 610 |
denisofff, К сожалению не на всех серверах работает, и почему то не верно показывает общее и свободное место на дисках. |
2 июл 12, 11:40 [12802849] Ответить | Цитировать Сообщить модератору |
guest45
Guest |
CREATE function [dbo].[af_DrivesInfo] () returns @Drives table (Drive char(1), TotalSize bigint, AvailableSpace bigint) as begin /* select getdate() select Drive, TotalSize = cast(TotalSize/1024./1024./1024. as decimal(10,2)), AvailableSpace = cast(AvailableSpace/1024./1024./1024. as decimal(10,2)) from dbo.af_DrivesInfo() select getdate() */ declare @hr integer, @fso integer, @objDrive integer, @Drive char(1), @DriveInt int, @DriveType int, @TotalSizeC varchar(1000), @AvailableSpaceC varchar(18), @TotalSize bigint, @AvailableSpace bigint exec @hr = sp_OACreate 'Scripting.FileSystemObject', @fso output set @DriveInt = 67 while @DriveInt <= 90 begin set @Drive = CHAR(@DriveInt) set @TotalSize = null set @AvailableSpace = null exec @hr = sp_OAMethod @fso, 'GetDrive', @objDrive out, @Drive if @hr = 0 begin exec @hr = sp_OAGetProperty @objDrive,'DriveType', @DriveType output if @DriveType = 2 begin exec @hr = sp_OAGetProperty @objDrive, 'TotalSize', @TotalSizeC output exec @hr = sp_OAGetProperty @objDrive, 'AvailableSpace', @AvailableSpaceC output insert @Drives (Drive, TotalSize, AvailableSpace) values (@Drive, convert(bigint, @TotalSizeC), convert(bigint, @AvailableSpaceC)) end exec sp_OADestroy @objDrive end set @DriveInt = @DriveInt + 1 end exec sp_OADestroy @fso return end GO |
2 июл 12, 12:45 [12803298] Ответить | Цитировать Сообщить модератору |
andrew shalaev Member Откуда: Moscow Сообщений: 610 |
guest45, Спасибо! |
2 июл 12, 15:16 [12804646] Ответить | Цитировать Сообщить модератору |
Andrey Sribnyak Member Откуда: Киев Сообщений: 599 |
Все уже придумано до нас http://www.sqlmag.com/blog/practical-sql-server-45/sql-server-2012/disk-space-monitoring-143552 |
||
2 июл 12, 16:10 [12805088] Ответить | Цитировать Сообщить модератору |
denisofff Member Откуда: Владивосток Сообщений: 62 |
Вот спасибо, даже не знал о таком :-) буду активно пользоваться. |
||
3 июл 12, 01:07 [12807154] Ответить | Цитировать Сообщить модератору |
andrew shalaev Member Откуда: Moscow Сообщений: 610 |
В итоге для решения задачи сделано следующее, может кому пригодится: Создаем функцию:
далее создаем процедуру:
ну и создаем джоб который раз в какое то время запускает процедуру. |
||
5 июл 12, 10:17 [12820351] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |