come controllare quando uno dei nodi del cluster cade?
prendendo (molto) spunto da un articolo apparso su SQLSERVER Central (sempre sia lodato) ho creato un pò di codice che verifica il nodo su cui l’istanza attuale sta girando.
in questa maniera è possibile confrontarla con una precedentemente salvata e poi decidere se inviare alert o quant’altro..
tutto si basa su questa riga di codice
exec master..xp_regread 'HKEY_LOCAL_Machine', 'SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName\', 'ComputerName'
che permette di capire il nome macchina sulla quale sta girando attualmente il codice lanciato.
giocando un pò è venuto fuori il codice qui sotto:
se non la trova, crea una tabella nel MSDB chiamata UT_DBParameter
esegue poi il codice di cui sopra andando ad estrapolare il nome del nodo sulla quale sta girando l’istanza.
se questo è diverso da quello memorizzato allora invio una mail di allerta e memorizzo il nome del nodo attuale nella riga della mia istanza nella tabella UT_DBParameter
DECLARE @previous Nvarchar(50)
DECLARE @Actual Nvarchar(50)
DECLARE @Sbj NVarChar(200)
Set @Sbj ='IStanza ' + @@SERVERNAME
DECLARE @Bdy NVarChar(4000)
DECLARE @OperatorEmail nvarchar(100)
Set @OperatorEmail = (select email_address from msdb.dbo.sysoperators where name = 'operatore') --**
IF OBJECT_ID('MSDB..UT_DBParameters') is null
BEGIN
CREATE TABLE UT_DBParameters
(
Parametro NVARCHAR(50),
Valore NVARCHAR(50)
)
END
SELECT @previous = isnull(Valore,'') FROM UT_DBParameters
WHERE Parametro = @@ServerName
IF OBJECT_ID('tempdb..#PHYSICALHOSTNAME') is not null
BEGIN
drop table #PHYSICALHOSTNAME
END
CREATE TABLE #PHYSICALHOSTNAME
(
VALUE VARCHAR(30),
CURRENT_ACTIVE_NODE VARCHAR(30)
)
INSERT #PHYSICALHOSTNAME
exec master..xp_regread 'HKEY_LOCAL_Machine',
'SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName\',
'ComputerName'
SELECT @Actual=CURRENT_ACTIVE_NODE FROM #PHYSICALHOSTNAME
IF @previous <> @Actual
BEGIN
SET @Bdy = CHAR(13) + 'Istanza ' + @@SERVERNAME + ' passata dal nodo ' + @previous + ' al nodo ' + @Actual
IF @Previous <> ''
EXEC msdb.dbo.sp_send_dbmail -- ***
@profile_name = '4tsmailrobot'
,@recipients = @OperatorEmail
,@body = @Bdy
,@subject = @Sbj
Update Msdb..UT_DBParameters
Set Valore = @Actual
WHERE Parametro = @@ServerName
END
NOTA
**operatore va sostituito con un operator valido per il server
*** si presuppone che il servizio di invio mail sia configurato..
Ti ho lascato la mia mail in questa maniera così potrai contattarmi