none
Мониторинг бэкапов SQL (Maintenance Plan) и ещё несколько вопросов от новичка по SCOM2012 RRS feed

  • Вопрос

  • Добрый день, Уважаемые коллеги!

    Со CSOM'ом я начал знакомиться только с версии 2012, к сожалению, т.е. опыта - нуль. Нашёл в сети мануалы типа "step-by-step" как разворачивать SCOM 2012 SP 1, развернул его, накачал кучу Management Pack'ов, накатил агентов на сервера, настроил оповещения, а что делать дальше не понимаю и не нахожу в сети мануалов аналогичных тем, которые посвящены развёртыванию SCOM - step-by-step. Сейчас конкретно руководство поставило передо мной задачу - настроить так, чтобы при окончании свобдодного места на дисках мониторируемых серверов приходило оповещение. Эту задачу я вроде как решил в общем случае, хотя также есть вопросы. А вот есть другая задача, которую я не могу понять как решать с помощью SCOM, а именно:

    Есть сервер с SQL Server 2008 с некоторыми базами. Для этих баз настроен Maintenance Plan, который делает бэкапы и сохраняет последние 3 бэкапа. Вот задача состоит в том, чтобы еженедельно (как минимум, а лучше и чаще) проводился бы мониторинг и в случае, если бэкап не сработал бы - делалось оповещение об этом заинтересованных лиц по e-mail.

    Maintenance Plan выглядит так:


    Прошу прощения - смог только 2 картинки запостить - ограничение форума.

    Сейчас мы каждую неделю проверяем по каждой базе, чтобы был свежий *.BAK файл. Хочется, чтобы это делал SCOM и рапортавал бы, если обнаруживал, что свежего бэкапа нет.

    Maintenance Plan настраивал не я (до меня) и SQL этот русский тоже не я ставил, если что - сильно не бейте, пожалуйста.

    И ещё вопрос: где можно почитать, как этим SCOM'ом пользоваться? Желательно по русски, желательно с картинками, а то в наличии только сухая документация на английском языке :-(

    4 марта 2013 г. 9:59

Ответы

Все ответы


    • Изменено pil123 3 апреля 2013 г. 18:00
    4 марта 2013 г. 10:10
  • В общем случае это делается скриптами. Что именно будет делать скрипт - просто проверять наличие и дату создания файла и сравнивать с текущей или запрашивать напрямую SQL о состоянии джоба maintenance plan - дело вкуса.

    Как писать скрипты для мониторов есть во всех поисковиках - "opsmgr script-based monitor".

    Откуда начать есть здесь: http://social.technet.microsoft.com/wiki/contents/articles/7809.system-center-2012-operations-manager-survival-guide.aspx 


    http://OpsMgr.ru/

    • Предложено в качестве ответа alexvu 9 ноября 2017 г. 22:40
    4 марта 2013 г. 15:06
    Отвечающий
  • Да, как сказал Алексей, лучше скриптом. Я делал нечто подобное на основе этой статьи https://www.simple-talk.com/sql/database-administration/monitor-your-database-backups-using-operations-manager/ (его скрипт https://www.simple-talk.com/iwritefor/articlefiles/612-MonitorYourDatabaseBackupsVB.htm) Здесь, если бэкапа нет 2 дня, то монитор переходит в состояние Warning, если 3 и более - Critical. Соответственно можно настроить оповещения на эти события. Ниже несколько видоизмененный мной этот скрипт (только для полных бэкапов) со вставками для отображения состояния бэкапов в журнале Operation Manager (может использоваться для отладки):

    'Start of Main'-----------------------------------------------------------------------------------------------
    call Main()
    Sub Main()
    	Dim objParameters,	sConnectionString
    	Dim oAPI, oBag
    	Dim oAPITemp
    	Set oAPITemp = MOMCreateObject("MOM.ScriptAPI")
    	Set objParameters = WScript.Arguments   
    	If objParameters.Count <> 1 Then
    		Quit()   
    	End If   
    	sConnectionString= objParameters(0)
    	
    	Set objParameters = Nothing
    	Set oAPI = MOMCreateObject("MOM.ScriptAPI")
    	Set oBag = oAPI.CreatePropertyBag()
    	If GetDumpInfo(oBag, sConnectionString) = 0	Then
    		Call oAPI.Return(oBag)
    	Else
    		Quit()   
    	End If
    	oAPITemp.LogScriptEvent "DatabasebBackupMonitoring.vbs", 4000, 4, " has been completed"
    End Sub
    'End of Main'-----------------------------------------------------------------------------------------------
    Function MomCreateObject(ByVal sProgramId)
        Dim oError
        Set oError = New Error
    	
    	On Error Resume Next
    	Set MomCreateObject = CreateObject(sProgramId)
    	oError.Save
    	On Error Goto 0
    	
    	If oError.Number <> 0 Then WScript.Quit
    End	Function
    Function Quit()
    	WScript.Quit()
    End Function
    Class Error
        Private m_lNumber
        Private m_sSource
        Private m_sDescription
        Private m_sHelpContext
        Private m_sHelpFile
        Public Sub Save()
    		m_lNumber = Err.number
            m_sSource = Err.Source
            m_sDescription = Err.Description
            m_sHelpContext = Err.HelpContext
            m_sHelpFile = Err.helpfile
    	End Sub
    	Public Sub Raise()
    		Err.Raise m_lNumber, m_sSource, m_sDescription, m_sHelpFile, m_sHelpContext
    	End Sub
        Public Sub Clear()
    		m_lNumber = 0
            m_sSource = ""
            m_sDescription = ""
            m_sHelpContext = ""
            m_sHelpFile = ""
    	End Sub
        Public Default Property Get Number()
    		Number = m_lNumber
    	End Property
        Public Property Get Source()
    		Source = m_sSource
    	End Property
        Public Property Get Description()
    		Description = m_sDescription
    	End Property
    	Public Property Get HelpContext()
            HelpContext = m_sHelpContext
    	End Property
    	Public Property Get HelpFile()
            HelpFile = m_sHelpFile
    	End Property
    End Class
    Function GetDumpInfo (ByRef oBag, ByVal sConnectionString)
    	Dim SCRIPT_SQL
    	Dim cnADOConnection
    	Dim strProv
    	Dim rsSQLdumps
    	Dim bFail
    	Dim DBname
    	Dim daysSinceFull
    	Dim daysSinceDiff
    	Dim oAPITemp
    	Set oAPITemp = MOMCreateObject("MOM.ScriptAPI")
    SCRIPT_SQL = "SET NOCOUNT ON " & _
    	"SELECT d.name as [DBname] " & _
    	", [daysSinceFull] = max(isnull(datediff(dd,b.backup_start_date,getdate()),0)) " & _
    	"FROM [master].[sys].[databases] d WITH (NOLOCK) " & _
    	"LEFT JOIN [msdb]..[backupset] b WITH (NOLOCK) on d.name = b.database_name " & _
    	"AND b.backup_start_date = (select max(backup_start_date) " & _
    	"FROM [msdb]..[backupset] b2 " & _
    	"WHERE b.database_name = b2.database_name AND b2.type = 'D') " & _
    	"LEFT JOIN [msdb]..[backupset] bi WITH (NOLOCK) on d.name = bi.database_name " & _
    	"AND bi.backup_start_date = (select max(backup_start_date) " & _
    	"FROM [msdb]..[backupset] b3 " & _
    	"WHERE bi.database_name = b3.database_name AND b3.type = 'I') " & _
    	"WHERE d.name NOT IN ('Pubs','tempdb','Northwind', 'Adventureworks') AND d.state = 0 AND d.source_database_id IS NULL " & _
    	"GROUP BY d.name " 
    	
    	'on error resume next
    	
    	Set cnADOConnection = MomCreateObject("ADODB.Connection")
    	cnADOConnection.Provider = "sqloledb"
    	cnADOConnection.ConnectionTimeout = 30
    	strProv = "Server=" & sConnectionString & ";Database=msdb;Trusted_Connection=yes"
    	
    	Err.Clear
    	cnADOConnection.Open strProv
    	if 0 <> Err.number then
    		' Throw
    		Exit Function   
    	end if   
    	Err.Clear   
    	Set rsSQLdumps = cnADOConnection.Execute(SCRIPT_SQL)
    	If 0 <> Err.number Then
    		' Throw
    		Exit Function
    	End If
    	If 0 = rsSQLdumps.State Then
    		' No records returned, recordset is likely closed.
    		Exit Function
    	End If
    	Do
    		bFail = True
    		Err.Clear
    		if rsSQLdumps.EOF then
    			if 0 <> Err.number then	
    				Exit Do
    			End if
    			bFail = False
    			Exit Do
    		End If
    		If 0 <> Err.number Then Exit Do
    			DBname = rsSQLdumps("DBname").Value
    			daysSinceFull = rsSQLdumps("daysSinceFull").Value
    			Call oBag.AddValue(DBname & "-daysSinceFull", CInt(daysSinceFull))
    			oAPITemp.LogScriptEvent "DatabaseBackupMonitoring.vbs", 4000, 4, " " & DBname & ": days since full backup = " & daysSinceFull
    		Err.Clear
    		rsSQLdumps.MoveNext
    		If 0 <> Err.number then Exit Do
    	Loop
    	If bFail Then
    		' Throw
    	End if   
    	Set cnADOConnection = Nothing
    	Set rsSQLdumps = Nothing
        GetDumpInfo = 0
    End Function

    10 марта 2013 г. 18:31
  • Alexey Degotkov, Вы не могли бы прокомментировать ключевые моменты в скрипте - как его нужно адаптировать мне, что менять?

    В сети, к сожалению, не нашёл пока для себя полного мануала, как выполнить эту процедуру ОТ и ДО. Везде, то одно кратко и вскользь как-то описывается, то другое, и везде свой подход, а в итоге получается, что не получается. Буду Вам признателен, если поможете поподробнее как и что делать или хотя бы покидаете в меня нужными ссылками.

    Спасибо!

    12 марта 2013 г. 9:37
  • Пришлось откопать свой старый блог, чтобы "подробно прокомментировать" :-)

    http://degotkov.wordpress.com/2013/03/12/scom2012-monitoring-sql-backups/


    12 марта 2013 г. 12:51
  • Пришлось откопать свой старый блог, чтобы "подробно прокомментировать" :-)

    http://degotkov.wordpress.com/2013/03/12/scom2012-monitoring-sql-backups/


    Спасибо Вам большое за статью. Статей по SCOM 2012 пошаговых для новичков, как я на русском языке крайне мало, к сожалению. И в основном они все посвящены установке :-((

    Я сделал всё как описано у Вас в статье, но на выходе получил ошибки:

    Date: 13.03.2013 10:04:54
    Application: Operations Manager
    Application Version: 7.0.9538.0
    Severity: Error
    Message: 
    
    : Verification failed with 3 errors:
    -------------------------------------------------------
    Error 1:
    Found error in 1|Elis.SQL.Database.Backup.Monitoring|1.0.0.0|UIGeneratedMonitordcd923a8093d43d9901fb3ce326924b2|| with message:
    The AlertParameter value specified is not valid: $Target/Property[Type="MicrosoftSQLServerLibrary6131436!Microsoft.SQLServer.Database"]/DatabaseName$.
    : Cannot resolve identifier MicrosoftSQLServerLibrary6131436!Microsoft.SQLServer.Database in the context of management pack Elis.SQL.Database.Backup.Monitoring. Unknown alias: MicrosoftSQLServerLibrary6131436
    
    -------------------------------------------------------
    Error 2:
    Found error in 1|Elis.SQL.Database.Backup.Monitoring|1.0.0.0|UIGeneratedMonitordcd923a8093d43d9901fb3ce326924b2|| with message:
    The AlertParameter value specified is not valid: $Target/Host/Host/Property[Type="MicrosoftWindowsLibrary6172210!Microsoft.Windows.Computer"]/DNSName$.
    : Cannot resolve identifier MicrosoftWindowsLibrary6172210!Microsoft.Windows.Computer in the context of management pack Elis.SQL.Database.Backup.Monitoring. Unknown alias: MicrosoftWindowsLibrary6172210
    
    -------------------------------------------------------
    Error 3:
    Found error in 1|Elis.SQL.Database.Backup.Monitoring|1.0.0.0|UIGeneratedMonitordcd923a8093d43d9901fb3ce326924b2|| with message:
    Verification of Monitor Configuration with MonitorType schema for Monitor UIGeneratedMonitordcd923a8093d43d9901fb3ce326924b2 failed.
    : Cannot resolve identifier MicrosoftSQLServerLibrary6131436!Microsoft.SQLServer.DBEngine in the context of management pack Elis.SQL.Database.Backup.Monitoring. Unknown alias: MicrosoftSQLServerLibrary6131436
    
    -------------------------------------------------------
    
    
    : The AlertParameter value specified is not valid: $Target/Property[Type="MicrosoftSQLServerLibrary6131436!Microsoft.SQLServer.Database"]/DatabaseName$.
    
    : Cannot resolve identifier MicrosoftSQLServerLibrary6131436!Microsoft.SQLServer.Database in the context of management pack Elis.SQL.Database.Backup.Monitoring. Unknown alias: MicrosoftSQLServerLibrary6131436
    

    Видимо чего-то предварительно я не сделал специально. Помогите, пожалуйста, разобраться!

    13 марта 2013 г. 6:11
  • Извините за подъём темы, но очень уж нужно разобраться в проблеме. Прошу подсказать в чём мои ошибки, почему не получается сделать так как написано в статье?
    14 марта 2013 г. 11:29
  • Это зависит от того, какие management pack'и используются. У меня использовался System Center Management Pack for SQL Server от 8/5/2010 (http://www.microsoft.com/downloads/details.aspx?FamilyId=8C0F970E-C653-4C15-9E51-6A6CADFCA363&displaylang=en&displaylang=en см. Release History ниже)

    И да, у Вас вообще установлен SQL Management Pack?

    16 марта 2013 г. 19:20
  • MP стоит

    А как узнать цифирки моей лайбрари?

    18 марта 2013 г. 5:33
  • В скрипте вы можете не вставлять мой параметр для скрипта, а сформировать свой:

    тут и увидите вживую, какие цифры будут. Также не забудьте поменять эти цифры в Parameter Name для выражений Unhealty/Degraded/Healthy

    • Помечено в качестве ответа pil123 5 апреля 2013 г. 6:51
    19 марта 2013 г. 10:55
  • Спасибо большое за Вашу помощь!

    Монитор я создал, переопределения завёл. Теперь у меня появился вопрос - как убедиться в работе монитора не прерывая по возможности нормального хода бэкапа? Возможен ли такой вариант, что если я включу для этого монитора такие базы, которые никогда не бэкапились в жизни, то мне будет сообщение? Какие варианты у Вас могут быть?

    5 апреля 2013 г. 6:55
  • Убедиться в работе можно изменив количество дней в условиях.

    7 апреля 2013 г. 19:59
  • Если можно подробнее, пожалуйста. Количество дней я выставил такое же, как и в Вашей статье. А вообще у меня бэкап делается каждый день. Где мне изменить количество дней, чтобы словить "алярм"?
    8 апреля 2013 г. 4:48
  • :)) где конкретно менять я понял, спасибо! Я только не понял логики проверки - какой параметри и на какое значение нужно изменить при условии, что полный бэкап производится ежедневно. Спасибо!
    8 апреля 2013 г. 7:50
  • В качестве эксперимента можно, например, установить для Healthy значение Value=3, для Unhealthy =2 и Degraded  <=1 или наоборот, и монитор сразу "перевернется" и сообщение об этом будет послано.

    • Помечено в качестве ответа pil123 9 апреля 2013 г. 8:32
    9 апреля 2013 г. 8:17
  • Алексей, к сожалению, моя битва с монитором не закончилась. Перевернул параметры здоровья, как Вы рекомендовали ранее, но оповещений нет.
    Unhealty Expression я поставил: Less than - 1;

    Degraded Expression я поставил: Equals - 4;
    Healty Expression я поставил: Equals - 5.

    Настроил overrides для необходимых для мониторинга баз следующим образом:

    Shedule для монитора = 1 час (для теста).

    Но оповещения не идут. оповещения у меня в тестовом режиме настроены для всех событий.

    Может быть оповещения должны идти с каким-то временным лагом? Если ДА, то каким и как можно ускорить этот процесс? Может быть что-то не донастроил? Делал всё по Вашей статье? Подскажите, пожалуйста, как траблшутить? Может у меня на SQL как-то неверно настроен бэкап, где это можно посмотреть?

    Может быть я как-то неверно работаю с Management Pack'ом? Когда я создавал монитор, то создал новый MP. После того, как я его создал - не делал ему никаких дополнительных настроек. Может нужно как-то дополнительно настроить MP - нацелить его на сервера или ещё что сделать? Просто я совсем плаваю в вопросе, но теорию читал, которую мне тут посоветовали коллеги.

    • Изменено pil123 10 апреля 2013 г. 6:11
    10 апреля 2013 г. 5:33
  • В первую очередь надо на поведение монитора смотреть, потом уж на оповещения - монитор-то меняет состояние на critical? Покажите скриншоты вкладок Healty и Alerting

    P.S. "Shedule для монитора = 1 час" - ну и терпение для теста :-), я 2-5 минут ставлю обычно (от TimeOut'a зависит)

    10 апреля 2013 г. 12:27
  • P.S. "Shedule для монитора = 1 час" - ну и терпение для теста :-), я 2-5 минут ставлю обычно (от TimeOut'a зависит)

    Учёл :-)

    Скрины:

    10 апреля 2013 г. 13:03
  • Еще раз - монитор меняет состояние на critical?

    Чтобы проверить правильно выполнения скрипта, на сервере, где находится наблюдаемая база, откройте журнал Operations Manager и отфильтруйте события по EventID 4000, должны быть видны такие записи:


    10 апреля 2013 г. 14:10
  • Еще раз - монитор меняет состояние на critical?


    Простите, а где это посмотреть?

    Алексей, я сделал поиск по "database backup" и нашёл вот это:

    Этим случайно нельзя мониторить бэкапы баз, Вы не в курсе?

    • Изменено pil123 12 апреля 2013 г. 6:04
    10 апреля 2013 г. 16:07