Ha a mirroringgal gond van, arról fontos azonnal tudni. Két esetet szoktunk figyelni. Az egyik a state change, azaz ha valamiért átvándorol a kiszolgálás az egyik lábról a másikra, illetve, ha feltorlódnak a tranzakciók valamelyik oldalon.
A monitorozásra vannak beépített dolgok, ezekről itt lehet bővebben olvasni, itt szinte minden infó megvan az alertezés felépítéséhez.
Két problémás pontba akadtunk bele. Az előbbi cikkben a WMI események hatására csak számok jöttek vissza státuszként, ezek nem túl beszédesek egy emailben. Ezeket elég könnyű visszafejteni stringekké:
declare @msg nvarchar(4000) = 'State of $(ESCAPE_SQUOTE(WMI(DatabaseName))) database changed to '''; declare @state nvarchar(50) = '$(ESCAPE_SQUOTE(WMI(State)))'; declare @newStateString nvarchar(100) = case @state when '2' then 'Synchronized Principal without Witness' when '7' then 'Manual Failover' ... end; set @msg += @newStateString + ''' on $(ESCAPE_SQUOTE(WMI(StartTime)))'; EXEC msdb..sp_send_dbmail @profile_name='SQL Server 2008 Mirroring Notifications', @recipients='foo@bar.com', @subject= 'DB Mirroring Alert', @body=@msg;
Lehetne elegánsabban is lookup táblával, de a célnak ez megfelelt.
A másik kérdés macarásabb. Egy job percenként mintavételezi a mirror queue-jainak a mértét, és ezeket beírja egy rendszertáblába. Ha valamelyik túlmegy egy megadott határértéken, akkor ez beírja az event logba, onnan egy alert ki tudja olvasni, és emailt küldeni róla. Csak éppen a lényeg nincs ebben benne, melyik adatbázissal van a baj. Ez bug, ez van.
Hogy valami képünk mégis legyen már email alapján mi a gond, az alábbi jobot futtatjuk le a threshold alert alapján:
EXEC msdb..sp_send_dbmail @profile_name='SQL Server 2008 Mirroring Notifications', @recipients='foo@bar.com', @subject= 'DB Mirroring Alert', @execute_query_database = 'msdb', @query = ' select * from (select distinct(database_id) id from dbo.dbm_monitor_data) d cross apply (select top 5 cast(DB_NAME(database_id) as nvarchar(20)) db, local_time, redo_queue_size, send_queue_size from dbo.dbm_monitor_data where ((send_queue_size > 0 or redo_queue_size > 0) and local_time > GETDATE() - 3 and database_id = d.id)) t order by db, local_time desc'
Ez az utóbbi 3 nap torlódásait küldi el emailben, ebből már látszik, melyik db akadt el.
Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.