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!

/*============================================================================
  File:     PostInstall-SetUpAgentAlerts.sql

  Summary:  This script sets up alerts for severity 17-25
  Date:     August 2008
  Updated:	January 2013

  SQL Server Version: 10.50.1600.0 (SQL Server 2008 or later)
------------------------------------------------------------------------------
  Written by Janos Berke, IamBerke.com

  For more scripts and sample code, check out http://www.IamBerke.com
  
  THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF 
  ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED 
  TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  PARTICULAR PURPOSE.
============================================================================*/
USE [msdb]
GO

DECLARE @Operator varchar(100) = 'DBA Team';
DECLARE @Email varchar(100) = 'DBA_Team@sql.sql';
DECLARE @MailProfileName varchar(100) = 'SQL Server Alert Mail Profile';

EXEC msdb.dbo.sp_add_operator @name=@Operator, 
		@enabled=1, 
		@pager_days=0, 
		@email_address=@Email;
		
IF ((SELECT @@version) LIKE '%SQL Server 2008%')
BEGIN
	--SQL Server 2008 or later
	USE [msdb];
	EXEC master.dbo.xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'SOFTWARE\Microsoft\MSSQLServer\SQLServerAgent', N'UseDatabaseMail', N'REG_DWORD', 1;
	EXEC master.dbo.xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'SOFTWARE\Microsoft\MSSQLServer\SQLServerAgent', N'DatabaseMailProfile', N'REG_SZ', @MailProfileName;
	EXEC msdb.dbo.sp_set_sqlagent_properties @email_save_in_sent_folder=1;
	EXEC master.dbo.sp_MSsetalertinfo @failsafeoperator=@Operator, @notificationmethod=1;
	select 2008
END

IF ((SELECT @@version) LIKE '%SQL Server 2012%')
BEGIN
	--SQL Server 2012
	EXEC master.dbo.sp_MSsetalertinfo @failsafeoperator=@Operator, @notificationmethod=1;

	EXEC msdb.dbo.sp_set_sqlagent_properties @email_save_in_sent_folder=1, 
											 @databasemail_profile=@MailProfileName, 
											 @use_databasemail=1;
END


/* set up alerts for severity17-25*/

EXEC msdb.dbo.sp_add_alert @name=N'Error_Severity17', 
		@message_id=0, 
		@severity=17, 
		@enabled=1, 
		@delay_between_responses=60, --throttle email sending
		@include_event_description_in=1, 
		@job_id=N'00000000-0000-0000-0000-000000000000';

EXEC msdb.dbo.sp_add_notification @alert_name=N'Error_Severity17', @operator_name=@Operator, @notification_method = 1;

EXEC msdb.dbo.sp_add_alert @name=N'Error_Severity18', 
		@message_id=0, 
		@severity=18, 
		@enabled=1, 
		@delay_between_responses=60, --throttle email sending
		@include_event_description_in=1, 
		@job_id=N'00000000-0000-0000-0000-000000000000';

EXEC msdb.dbo.sp_add_notification @alert_name=N'Error_Severity18', @operator_name=@Operator, @notification_method = 1;

EXEC msdb.dbo.sp_add_alert @name=N'Error_Severity19', 
		@message_id=0, 
		@severity=19, 
		@enabled=1, 
		@delay_between_responses=60, --throttle email sending
		@include_event_description_in=1, 
		@job_id=N'00000000-0000-0000-0000-000000000000';

EXEC msdb.dbo.sp_add_notification @alert_name=N'Error_Severity19', @operator_name=@Operator, @notification_method = 1;

EXEC msdb.dbo.sp_add_alert @name=N'Error_Severity20', 
		@message_id=0, 
		@severity=20, 
		@enabled=1, 
		@delay_between_responses=60, --throttle email sending
		@include_event_description_in=1, 
		@job_id=N'00000000-0000-0000-0000-000000000000';

EXEC msdb.dbo.sp_add_notification @alert_name=N'Error_Severity20', @operator_name=@Operator, @notification_method = 1;

EXEC msdb.dbo.sp_add_alert @name=N'Error_Severity21', 
		@message_id=0, 
		@severity=21, 
		@enabled=1, 
		@delay_between_responses=60, --throttle email sending
		@include_event_description_in=1, 
		@job_id=N'00000000-0000-0000-0000-000000000000';

EXEC msdb.dbo.sp_add_notification @alert_name=N'Error_Severity21', @operator_name=@Operator, @notification_method = 1;

EXEC msdb.dbo.sp_add_alert @name=N'Error_Severity22', 
		@message_id=0, 
		@severity=22, 
		@enabled=1, 
		@delay_between_responses=60, --throttle email sending
		@include_event_description_in=1, 
		@job_id=N'00000000-0000-0000-0000-000000000000';

EXEC msdb.dbo.sp_add_notification @alert_name=N'Error_Severity22', @operator_name=@Operator, @notification_method = 1;

EXEC msdb.dbo.sp_add_alert @name=N'Error_Severity23', 
		@message_id=0, 
		@severity=23, 
		@enabled=1, 
		@delay_between_responses=60, --throttle email sending
		@include_event_description_in=1, 
		@job_id=N'00000000-0000-0000-0000-000000000000';

EXEC msdb.dbo.sp_add_notification @alert_name=N'Error_Severity23', @operator_name=@Operator, @notification_method = 1;

EXEC msdb.dbo.sp_add_alert @name=N'Error_Severity24', 
		@message_id=0, 
		@severity=24, 
		@enabled=1, 
		@delay_between_responses=60, --throttle email sending
		@include_event_description_in=1, 
		@job_id=N'00000000-0000-0000-0000-000000000000';

EXEC msdb.dbo.sp_add_notification @alert_name=N'Error_Severity24', @operator_name=@Operator, @notification_method = 1;

EXEC msdb.dbo.sp_add_alert @name=N'Error_Severity25', 
		@message_id=0, 
		@severity=25, 
		@enabled=1, 
		@delay_between_responses=60, --throttle email sending
		@include_event_description_in=1, 
		@job_id=N'00000000-0000-0000-0000-000000000000';

EXEC msdb.dbo.sp_add_notification @alert_name=N'Error_Severity25', @operator_name=@Operator, @notification_method = 1;
GO

 

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.

Add comment