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:
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.