Tips for DBA: Logical Disk FreeSpace Notification

В SQL Server 2008 с помощью службы SQL Server Agent и PowerShell можно достаточно просто соорудить задание, которое будет заглядывать в метаданные WMI локального или удалённого сервера, и сообщать по электронной почте, в случае если свободное место на указанном диске перешагнуло заданный порог. Ниже представлен облегчённый концепт сценария подобного задания (расписаний в нём нет и данные берутся по локальному серверу). Вам нужно будет заменить фиктивный адрес на реальный и указать почтовый профиль, если нельзя воспользоваться профилем по умолчанию.

    USE [msdb]
    GO
    DECLARE @jobId BINARY(16)
    EXEC msdb.dbo.sp_add_job
         @job_name=N'Наблюдение за местом на диске С: текущего сервера',
         @enabled=1,
         @notify_level_eventlog=0,
         @notify_level_email=0,
         @notify_level_netsend=0,
         @notify_level_page=0,
         @delete_level=0,
         @category_name=N'[Uncategorized (Local)]',
         @owner_login_name=N'sa', @job_id = @jobId OUTPUT
    EXEC msdb.dbo.sp_add_jobstep
         @job_id=@jobId,
         @step_name=N'1',
         @step_id=1,
         @cmdexec_success_code=0,
         @on_success_action=1,
         @on_success_step_id=0,
         @on_fail_action=3,
         @on_fail_step_id=0,
         @retry_attempts=0,
         @retry_interval=0,
         @os_run_priority=0,
         @subsystem=N'PowerShell',
         @command=N'$RemoteHost = "."
    $FreeSpace=((gwmi CIM_LogicalDisk -computerName $RemoteHost -filter "DeviceID = '
    'C:''").FreeSpace)/(1024*1024*1024)
    IF ($FreeSpace -lt 1000) {
    $conn = new-object system.data.oledb.oledbconnection
    $connstring = "provider=sqloledb;data source=.;initial catalog=tempdb;integrated security=SSPI"
    $conn.connectionstring = $connstring
    $conn.open()
    $cmd = New-Object system.data.oledb.oledbcommand
    $cmd.connection = $conn
    $FreeSpace = "'
    '"+$FreeSpace+"''"
    $sqlquery = "EXEC msdb.dbo.sp_send_dbmail @recipients='
    'AlexanderGladchenko@domen.com'',@subject=$FreeSpace"
    $cmd.commandtext = $sqlquery
    $cmd.executenonquery() > NULL
    $cmd = New-Object system.data.oledb.oledbcommand
    $conn.close()
    } Else {$FreeSpace}'
    ,
         @database_name=N'master',
         @flags=0
    EXEC msdb.dbo.sp_add_jobserver
         @job_id = @jobId,
         @server_name = N'(local)'
    GO

Published Wed, Apr 15 2009 17:46 by gladchenko