21.4.23

Tips for DBA: Logical Disk FreeSpace Notification

В SQL Server с помощью службы 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

Комментариев нет:

Отправить комментарий