Lite strul!


Har inte kunnat släppa varför ett jobb inte funkar som det ska.

För någon månad sedan hittade jag på en sajt 2 alert som jag tyckte var bra att sno och testa i labb-miljön. Den jag började använda igår skulle larma att det har skett en failover i en AG och nu har en annan server den primära replikan.

Igår började jag snickra på skript som skulle göra failover på samtliga AG om en (eller fler) gjorde failover till annan server.

Det jag gjorde var en hårdkodning av AG namnen. Det funkade precis som jag ville ha det 🙂

Idag började jag snygga på skriptet för att få den mer dynamiskt. Där jag har tänkt att börja använda är det 5 (eller var det 6 st) AG. Det är Basic AG (Standard Edition) på de 2 servrarna (Och så är det miljöer, så det blir 4 servrar!)

Nya servrar har satts upp och nya AG ska in där. Det är lite oklart hur många AG kommer att skapas på de nya servrarna som är nyss uppsatta.

Så det är inte praktiskt och är obra att ha hårdkodade namn i jobbet.

Det dynamiska skriptet jag snickrade på i morse (som jag snott delar av andra) var inte snygg och funkade inte.

Så jag har försökt snygga till det, men hur än jag gjorde funkade det inte, inte om man körde det som jobb 😮

Hittade till slut felet. Alerten hade inte triggats sedan i morse runt 10:45! Såg sedan att det hade nollställs vilket jobb som ska köras om alerten triggas 😮 Vad?

Kom på att jag bytte namn på jobbet i morse och jag är typ säkert att jag hade kollat alerten, men uppenbarligen inte. Så namnbytet rensade inställningar.

Så nu funkar skiten 🙂

Jag får:

  • Snygga till skriptet
  • Hitta bättre namn på jobbet (och se till att det är kopplad till alerten!)
  • Sätta kategori på alerten (såg nu att det saknas kategori)
  • Skapa flera AG och testa mera
-- Alert: AG Failover Detected - Now Primary 

USE [msdb]
GO

IF NOT EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = N'AG Failover Detected - Now Primary')
EXEC msdb.dbo.sp_add_alert @name=N'AG Failover Detected - Now Primary',
	@message_id=1480,
	@severity=0,
	@enabled=1,
	@delay_between_responses=0,
	@include_event_description_in=0,
	@event_description_keyword=N'"RESOLVING" to "PRIMARY"',
	@category_name=N'[Uncategorized]',
	@job_name=N'Failover på samtliga AG i händelse av failover av en AG'
GO
-- Jobb: Failover på samtliga AG i händelse av failover av en AG

SET NOCOUNT ON
DECLARE @AGName sysname, @Command nvarchar(Max);

DECLARE AG_Cursor CURSOR STATIC FOR
 
SELECT 
	AG.name AS [AvailabilityGroupName]
	--,ISNULL(agstates.primary_replica, '') AS [PrimaryReplicaServerName]

	FROM master.sys.availability_groups AS AG
		LEFT OUTER JOIN master.sys.dm_hadr_availability_group_states as agstates
		ON AG.group_id = agstates.group_id
		INNER JOIN master.sys.availability_replicas AS AR
		ON AG.group_id = AR.group_id
		INNER JOIN master.sys.dm_hadr_availability_replica_states AS arstates
		ON AR.replica_id = arstates.replica_id AND arstates.is_local = 1
	
WHERE ISNULL(agstates.primary_replica, '') <> @@SERVERNAME

OPEN AG_Cursor
FETCH NEXT FROM AG_Cursor into @AGName
WHILE @@FETCH_STATUS = 0
BEGIN

	SELECT @Command = N'ALTER AVAILABILITY GROUP ' 
	+ @AGName 
	+ ' FAILOVER';

	EXEC sp_executesql @Command;

FETCH NEXT FROM AG_Cursor into @AGName
END

CLOSE AG_Cursor;
DEALLOCATE AG_Cursor;

Edit: Ändrade senare till följande

CREATE OR ALTER PROC [dbo].[usp_Failover] AS

SET NOCOUNT ON
DECLARE @AGName sysname, @Command nvarchar(Max);

DECLARE AG_Cursor CURSOR STATIC FOR

	SELECT Groups.[Name] AS AGname
	FROM sys.dm_hadr_availability_group_states States
	INNER JOIN master.sys.availability_groups Groups 
		ON States.group_id = Groups.group_id
	WHERE primary_replica <> @@SERVERNAME

OPEN AG_Cursor
FETCH NEXT FROM AG_Cursor into @AGName
WHILE @@FETCH_STATUS = 0
BEGIN

	SELECT @Command = N'ALTER AVAILABILITY GROUP ' 
	+ @AGName 
	+ ' FAILOVER';

	EXEC sp_executesql @Command;

FETCH NEXT FROM AG_Cursor into @AGName
END

CLOSE AG_Cursor;
DEALLOCATE AG_Cursor;

Bytte namn på jobbet till ‘AG – Failover’ och där kickas proceduren när alert triggas.

-- Alert: AG Failover Detected - Now Primary 

USE [msdb]
GO

IF NOT EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = N'AG Failover Detected - Now Primary')
EXEC msdb.dbo.sp_add_alert @name=N'AG Failover Detected - Now Primary',
	@message_id=1480,
	@severity=0,
	@enabled=1,
	@delay_between_responses=0,
	@include_event_description_in=0,
	@event_description_keyword=N'"RESOLVING" to "PRIMARY"',
	@category_name=N'[Uncategorized]',
	@job_name=N'AG - Failover'
GO

Kommentera

Fyll i dina uppgifter nedan eller klicka på en ikon för att logga in:

WordPress.com Logo

Du kommenterar med ditt WordPress.com-konto. Logga ut /  Ändra )

Google-foto

Du kommenterar med ditt Google-konto. Logga ut /  Ändra )

Twitter-bild

Du kommenterar med ditt Twitter-konto. Logga ut /  Ändra )

Facebook-foto

Du kommenterar med ditt Facebook-konto. Logga ut /  Ändra )

Ansluter till %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.