Milyen alerteket érdemes beállítani?

Két hete, 2013. november 6.-án volt az Aréna plázában egy Microsoft-os rendezvény , ahol nekem is volt egy órás előadásom. Az egyik demó arról szólt, hogy mi történik akkor, amikor kiesik egy lemez/storage az adatbázis alól. A demó során az alábbi hibaüzenetet kaptam manuális CHECKPOINT során, illetve ilyenekkel volt tele az Error Log is:

Msg 823, Level 24, State 3, Line 1
The operating system returned error 21(The device is not ready.) to SQL Server during a write at offset 0x00000000010000 in file 'F:\FG1_Data2.ndf'.
Additional messages in the SQL Server error log and system event log may provide more detail. This is a severe system-level error condition that threatens database integrity and must be corrected immediately.
Complete a full database consistency check (DBCC CHECKDB). This error can be caused by many factors; for more information, see SQL Server Books Online.

Ezek után feltettem a kérdést a teremben ülőknek, hogy hányan vannak, akiknek be van állítva a 823-as hibára alert, illetve egyáltalán bármilyen alert. Szomorú volt látni, hogy egy ember sem jelentkezett, de legalábbis nem láttam a reflektortól vagy szégyenlősek voltak a jelenlévők :-)

Mi legyen beállítva?

A 17-25-ös súlyosságú hibákra minden esetben érdemes be kell állítani alerteket, ezek nélkül fogalmunk se lesz, hogy történik e valami “érdekes” a szerveren.

Súlyossági szintek jelentése

  • 17-19: program hiba, ami a felhasználók által nem javítható
    • 17 – Insufficient Resources: ez leggyakrabban akkor fordul elő, amikor a szerver valamelyik erőforrás korlátjába ütközik, pl.: elfogy a szabad lemezterület, nincs elegendő memória, stb.
    • 18 – Nonfatal Internal Error: ez valamilyen belső problémája az adatbázis motornak. Általában PFE-nél landol a megoldás, ha nincs dokumentálva. Ennél a hibánál az egyetlen jó dolog, hogy nem szakítja meg a batch futását.
    • 19 – Fatal Error in Resource: ez valamilyen “belső” korlát elérésekor jön elő. Ilyen pl., ha nincs elegendő erőforrás LOCK kezeléshez. Sajnos ezeknél a hibáknál megszakad a batch, a tranzakció visszavonásra kerül.
  • 20-24: ezek már a komolyabb kategóriába tartozó hibák. Ezekben az esetekben az SQL batch megaszakításra, a tranzakció visszavonásra kerül.
    • 20 – Fatal Error in Current Process: valamilyen folyamat futása során hiba történt. Ilyen lehet pl., amikor a TDS nem megfelelő vagy újabb - adatbézis verzióban készült mentést próbálnánk visszaállítani.
    • 21 – Fatal Error in Database Processes: valamilyen adatbázson belüli folyamat ütközött problémába. Ilyen lehet pl.: meta adat probléma.
    • 22 – Fatal Error Table Integrity Suspect: tábla vagy index fizikai sérülés esetén fordul elő. Ez lehet valamilyen szoftveres vagy hardveres - probléma miatt. Nagy valószínűséggel sérült az adat, DBCC parancs segítségével kell megállapítani a pontos okokat.
    • 23 – Fatal Error Database Integrity Suspect: ugyan akkor fordul elő, mint a 22-es, de itt a teljes adatbázis integritása kérdéses.
    • 24 – Fatal Error Hardware Error: hardveres hiba, pl. a rendezvényem bemutatott lemez hiba esetén fordul elő.
    • 25 – Fatal Error: nem hszem, hogy ez magyarázatra szorulna.

Alert előkövetelmények

Én az alerteket email üzenet formájában szeretem megkapni, éppen ezért az alábbiak beállítására van szükség először:

  • Database mail
  • Operátorok

Alert beállítása T-SQL kód segítségével

Feltételezem, hogy a Database Mail szolgáltatás beállításra került, a @Operator, @Email és a @MailProfileName változókat a saját beállításokra át kell írni!

  1/*============================================================================
  2  File:     PostInstall-SetUpAgentAlerts.sql
  3 
  4  Summary:  This script sets up alerts for severity 17-25
  5  Date:     August 2008
  6  Updated:  January 2013
  7 
  8  SQL Server Version: 10.50.1600.0 (SQL Server 2008 or later)
  9------------------------------------------------------------------------------
 10  Written by Janos Berke, IamBerke.com
 11 
 12  For more scripts and sample code, check out http://www.IamBerke.com
 13   
 14  THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF
 15  ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED
 16  TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
 17  PARTICULAR PURPOSE.
 18============================================================================*/
 19USE [msdb]
 20GO
 21 
 22DECLARE @Operator varchar(100) = 'DBA Team';
 23DECLARE @Email varchar(100) = 'DBA_Team@sql.sql';
 24DECLARE @MailProfileName varchar(100) = 'SQL Server Alert Mail Profile';
 25 
 26EXEC msdb.dbo.sp_add_operator @name=@Operator,
 27        @enabled=1,
 28        @pager_days=0,
 29        @email_address=@Email;
 30         
 31IF ((SELECT @@version) LIKE '%SQL Server 2008%')
 32BEGIN
 33    --SQL Server 2008 or later
 34    USE [msdb];
 35    EXEC master.dbo.xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'SOFTWARE\Microsoft\MSSQLServer\SQLServerAgent', N'UseDatabaseMail', N'REG_DWORD', 1;
 36    EXEC master.dbo.xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'SOFTWARE\Microsoft\MSSQLServer\SQLServerAgent', N'DatabaseMailProfile', N'REG_SZ', @MailProfileName;
 37    EXEC msdb.dbo.sp_set_sqlagent_properties @email_save_in_sent_folder=1;
 38    EXEC master.dbo.sp_MSsetalertinfo @failsafeoperator=@Operator, @notificationmethod=1;
 39    select 2008
 40END
 41 
 42IF ((SELECT @@version) LIKE '%SQL Server 2012%')
 43BEGIN
 44    --SQL Server 2012
 45    EXEC master.dbo.sp_MSsetalertinfo @failsafeoperator=@Operator, @notificationmethod=1;
 46 
 47    EXEC msdb.dbo.sp_set_sqlagent_properties @email_save_in_sent_folder=1,
 48                                             @databasemail_profile=@MailProfileName,
 49                                             @use_databasemail=1;
 50END
 51 
 52 
 53/* set up alerts for severity17-25*/
 54 
 55EXEC msdb.dbo.sp_add_alert @name=N'Error_Severity17',
 56        @message_id=0,
 57        @severity=17,
 58        @enabled=1,
 59        @delay_between_responses=60, --throttle email sending
 60        @include_event_description_in=1,
 61        @job_id=N'00000000-0000-0000-0000-000000000000';
 62 
 63EXEC msdb.dbo.sp_add_notification @alert_name=N'Error_Severity17', @operator_name=@Operator, @notification_method = 1;
 64 
 65EXEC msdb.dbo.sp_add_alert @name=N'Error_Severity18',
 66        @message_id=0,
 67        @severity=18,
 68        @enabled=1,
 69        @delay_between_responses=60, --throttle email sending
 70        @include_event_description_in=1,
 71        @job_id=N'00000000-0000-0000-0000-000000000000';
 72 
 73EXEC msdb.dbo.sp_add_notification @alert_name=N'Error_Severity18', @operator_name=@Operator, @notification_method = 1;
 74 
 75EXEC msdb.dbo.sp_add_alert @name=N'Error_Severity19',
 76        @message_id=0,
 77        @severity=19,
 78        @enabled=1,
 79        @delay_between_responses=60, --throttle email sending
 80        @include_event_description_in=1,
 81        @job_id=N'00000000-0000-0000-0000-000000000000';
 82 
 83EXEC msdb.dbo.sp_add_notification @alert_name=N'Error_Severity19', @operator_name=@Operator, @notification_method = 1;
 84 
 85EXEC msdb.dbo.sp_add_alert @name=N'Error_Severity20',
 86        @message_id=0,
 87        @severity=20,
 88        @enabled=1,
 89        @delay_between_responses=60, --throttle email sending
 90        @include_event_description_in=1,
 91        @job_id=N'00000000-0000-0000-0000-000000000000';
 92 
 93EXEC msdb.dbo.sp_add_notification @alert_name=N'Error_Severity20', @operator_name=@Operator, @notification_method = 1;
 94 
 95EXEC msdb.dbo.sp_add_alert @name=N'Error_Severity21',
 96        @message_id=0,
 97        @severity=21,
 98        @enabled=1,
 99        @delay_between_responses=60, --throttle email sending
100        @include_event_description_in=1,
101        @job_id=N'00000000-0000-0000-0000-000000000000';
102 
103EXEC msdb.dbo.sp_add_notification @alert_name=N'Error_Severity21', @operator_name=@Operator, @notification_method = 1;
104 
105EXEC msdb.dbo.sp_add_alert @name=N'Error_Severity22',
106        @message_id=0,
107        @severity=22,
108        @enabled=1,
109        @delay_between_responses=60, --throttle email sending
110        @include_event_description_in=1,
111        @job_id=N'00000000-0000-0000-0000-000000000000';
112 
113EXEC msdb.dbo.sp_add_notification @alert_name=N'Error_Severity22', @operator_name=@Operator, @notification_method = 1;
114 
115EXEC msdb.dbo.sp_add_alert @name=N'Error_Severity23',
116        @message_id=0,
117        @severity=23,
118        @enabled=1,
119        @delay_between_responses=60, --throttle email sending
120        @include_event_description_in=1,
121        @job_id=N'00000000-0000-0000-0000-000000000000';
122 
123EXEC msdb.dbo.sp_add_notification @alert_name=N'Error_Severity23', @operator_name=@Operator, @notification_method = 1;
124 
125EXEC msdb.dbo.sp_add_alert @name=N'Error_Severity24',
126        @message_id=0,
127        @severity=24,
128        @enabled=1,
129        @delay_between_responses=60, --throttle email sending
130        @include_event_description_in=1,
131        @job_id=N'00000000-0000-0000-0000-000000000000';
132 
133EXEC msdb.dbo.sp_add_notification @alert_name=N'Error_Severity24', @operator_name=@Operator, @notification_method = 1;
134 
135EXEC msdb.dbo.sp_add_alert @name=N'Error_Severity25',
136        @message_id=0,
137        @severity=25,
138        @enabled=1,
139        @delay_between_responses=60, --throttle email sending
140        @include_event_description_in=1,
141        @job_id=N'00000000-0000-0000-0000-000000000000';
142 
143EXEC msdb.dbo.sp_add_notification @alert_name=N'Error_Severity25', @operator_name=@Operator, @notification_method = 1;
144GO

Ezek után már csak várni kell a leveleket. Nem egy időigényes feladat, viszont nagyon sok kellemetlenséget el lehet kerülni azzal, hogy képben vagyunk a szerverünkkel. Sokkal rosszabb, ha az Ügyfél jelzi azt a hibát, amiről nekünk is tudni kellene.