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