controllo del nodo in caso di fail over su un cluster SQL

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

Inserito in Server che passione, sql, Utilità | 1 commento

Conversione di un file di testo da UNIX a DOS/WINDOWS e Viceversa

ottimissimo tool..

http://www.sg-chem.net/u2win/

Inserito in Batch Caverna, Utilità, windows | Lascia un commento

Salvare le stored procedure di un Server SQL

da quando ho iniziato a scrivere stored per SQL ho avut il problema di tenere da qualche parte che non fosse SQL le stored che scrivevo.
così mi son messo di buona lena ed approfittando di una sera con la signora in ferie (sì lo sò c’è altro da fare ma tant’è.. ) ho scritto un pò di righe

ed eccole qua, quando imparerò a copincollare per bene il codice dentro sto blocco appunti che è il mio blog sarà anche un pò più leggibile..

Max

 

PROCEDURE [dbo].[Uds_Save_Stored_Procedure]
AS
DECLARE @StrSQL NVarChar(400)
DECLARE @Db NVarChar(400)
DECLARE @Sp NVarChar(400)
DECLARE @i int
DECLARE @I_SP Int
DECLARE @cmd NVarChar(1000)
DECLARE @Path NVarChar(1000)
Set @path ='c:\trace\'
BEGIN
SET NOCOUNT ON;
SET @StrSQL = ' IF OBJECT_ID(''tempdb.dbo.##DB_List'') IS NOT NULL' + CHAR(13)
+ ' DROP TABLE ##DB_List ' + CHAR(13) + CHAR(13)
+ ' CREATE TABLE ##DB_List (' + CHAR(13)
+ ' id int identity(1,1)' + CHAR(13)
+ ' ,DB nvarchar(max)' + CHAR(13)
+ ' )' + CHAR(13) + CHAR(13)
+ ' Insert Into ##DB_List (DB)' + CHAR(13)
+ ' SELECT name ' + CHAR(13)
+ ' FROM master..sysdatabases' + CHAR(13)
+ ' where name not in (''master'',''tempdb'',''model'',''msdb'')' + CHAR(13)
--PRINT @strsql
EXEC sp_executesql @strsql
SET @StrSQL = ' IF OBJECT_ID(''tempdb.dbo.##SP_List'') IS NOT NULL' + CHAR(13)
+ ' DROP TABLE ##SP_List ' + CHAR(13) + CHAR(13)
+ ' CREATE TABLE ##SP_List (' + CHAR(13)
+ ' id int identity(1,1)' + CHAR(13)
+ ' ,DB nvarchar(max)' + CHAR(13)
+ ' ,SP nvarchar(max)' + CHAR(13)
+ ' )' + CHAR(13) + CHAR(13)
--PRINT @strsql
EXEC sp_executesql @strsql
SET @i = 0
select top 1 @i = id
from ##DB_List
where id > @i
order by id
While @@Rowcount = 1
BEGIN
select @db = DB
from ##DB_List
where id = @i
SET @StrSQL = ' USE [' + @Db + ']' + CHAR(13) + CHAR(13)
+' Insert into ##SP_List (DB,SP)' + Char(13)
+' SELECT ''' + @db +''' ,name' + Char(13)
+' FROM sys.objects' + Char(13)
+' WHERE type = ''P''' + Char(13)
+' AND left(name,3) ''sp_''' + Char(13)
+' AND left(name,3) ''dt_''' + Char(13)
+' AND left(name,7) ''aspnet_''' + Char(13)
EXEC sp_executesql @strsql
--PRINT @strSQL
select top 1 @i = id
from ##DB_List
where id > @i
order by id
END
SET @i = 0
select top 1 @i = id
from ##SP_List
where id > @i
order by id
While @@Rowcount = 1
BEGIN
select @db = DB, @sp = SP
from ##SP_List
where id = @i
SET @strSQL = ' Use [' + @Db + ']' + char(13) + char(13)
+ ' IF OBJECT_ID(''tempdb.dbo.##sp_helptext'') IS NOT NULL' + char(13)
+ ' drop table ##sp_helptext ' + char(13)
+ ' create table ##sp_helpText (' + char(13)
+ ' id int identity(1,1)' + char(13)
+ ' ,tmptext nvarchar(max))' + char(13) + char(13)
+ ' insert into ##sp_helptext exec sp_helptext ['+ @Sp +']'+ char(13)
--PRINT @strsql
EXEC sp_executesql @strsql
set @i_sp = 0
select top 1 @i_sp = id
from ##sp_helpText
where id > @i_sp
order by id
while @@rowcount = 1
BEGIN
SELECT @cmd = 'echo ' + left(tmptext,LEN(tmptext)-2) + ' >> '+ @Path + '[' + @db + '].dbo.[' + @Sp + '].sql'
from ##sp_helpText
where id = @i_sp
--PRINT @cmd
exec master..xp_cmdshell @cmd
select top 1 @i_sp = id
from ##sp_helpText
where id > @i_sp
order by id
END
select top 1 @i = id
from ##SP_List
where id > @i
order by id
END
END
Inserito in sql | Etichette | Lascia un commento

T-SQL usare una variabile nel predicato IN()

Articolo interessantissimo che ho letto solo velocemente. da commentare appena possibile.

Link

Inserito in Dove Stiamo Andando?, sql | Lascia un commento

rap futuristico!

Inserito in Dove Stiamo Andando? | Lascia un commento

yyyymmddhhnnss difficilissimo in dos script..

problema, nominare un file o inserire in una variabile di ambiente la data ed ora attuale nel formato: YYYYMMDDHHNNSS

di solito è una vera rottura, normalmente si usa un arzigogolo strano utilizzando le variabili d’ambiente %DATE% e %TIME% che però hanno un difetto, sono localizzate, quindi uno script che funziona su una localizzazione Italiana non funziona su una inglese e viceversa.. che fare in ambienti misti?

ecco la soluzione, uno script e una riga di codice da inserire nel nostro file batch:

create uno script chiamato dataora.vbs quindi inserite all’interno la seguente stringa

Wscript.Echo year(now())&right("00"&month(now()),2)&right("00"&day(now()),2)&right("00"&hour(now()),2)&right("00"&minute(now()),2)&right("00"&second(now()),2)

quindi la riga magica da utilizzare nei vostri batch è la seguente:

for /F %%a in ('cscript /nologo dataora.vbs ^|find /V ""') DO SET DATAORA=%%a

 

da ora potrete utilizzare la variabile d’ambiente %DATAORA% contenente la tanto agognata stringa

enjoy!

Inserito in Batch Caverna, Utilità | Etichette , , , , , | Lascia un commento

il magico mondo di SQL e XML

creare una struttura dati XML tramite T-SQL?

Facile!!

metterlo su un file?!

Difficilissimo!

Ebbene sì è un vero casino, pubblico un link di un articolo per un argomento che approfondirò in quanto davvero interessante.

http://www.15seconds.com/issue/001102.htm

Inserito in Dove Stiamo Andando? | Etichette , , | Lascia un commento

scrivere sul registry via VMI

riposto il post di active experts

http://www.activexperts.com/activmonitor/windowsmanagement/adminscripts/registry/

Inserito in Dove Stiamo Andando? | Lascia un commento

Transaction log, questo sconosciuto..

il transaction log, questo sconosciuto.. tutti (o quasi) sappiamo che il transaction log, è “quel file che mantiene le transazioni effettuate, o da effettuare, sul DB”.. ma come funziona? qual’è la sua configurazione migliore per il nostro DB? come manutenerlo al meglio?

mi sto cimentando in quest’impresa ardua e ho trovato un paio di articoli “terra terra” che possono aiutare a fare un pò di chiarezza a chi, ad esempio come me, ha diverse nozioni da riordinare.

questo è un articoli di MS molto carino in cui al termine c’è proprio uno specchietto che è possibile utilizzare per capire qual’è il recovery model per il DB migliore per il proprio database

http://msdn.microsoft.com/en-us/library/ms175987.aspx

in questo invece (me lo sto ancora leggendo) un pò di tips per la manutenzione del TL.

http://technotes.towardsjob.com/sql-server/dba-tips-maintenance-plan-to-avoid-transaction-log-file-growth/

Inserito in Server che passione, sql, Utilità, windows | Etichette , | Lascia un commento

Convertire un Intero in un Esadecimale e utilizzarlo come testo in SQL – Update

Ecco una cosina che mi ha fatto perdere quasi un giorno… in Transact SQL esiste la CONVERT che è in grado di convertire un valore in altri formati. Per quel che mi riguarda avevo la necessità di convertire un numero da decimale a esadecimale e quindi di trattare il risultato ottenuto come una stringa di testo.

Essendo io un pessimo conoscitore di TRANSACT (come di molti altri linguaggi) mi sono creato una funzioncina che è possibile chiamare utilizzando il suo nome preceduto dal prefisso dbo.

Update: Grazie a Gabriele (che legge il blog! fighissimo!) ho scoperto una funzione che ieri nelle mie ricerche non avevo trovato, al che deduco anche altre cose ma le risparmio…ovvero, esiste già una funzione di SQL che permette di convertire un esadecimale in testo!!… :-( Eccola qua:

master.dbo.fn_varbintohexstr

ed ecco un esempio di codice.

SELECT master.dbo.fn_varbintohexstr(CAST(Addr1 AS VARBINARY)) AS Expr1
FROM Customer
SELECT master.dbo.fn_varbintohexstr(CAST(Addr1 AS VARBINARY)) AS Expr1
FROM Customer

E io che ci ho perso tutto quel tempo.. vabhe lascio il codice per me come appunto e per chi necessitasse di qualche (pessimo) spunto.

Leggi l’articolo completo

Inserito in Batch Caverna, sql, Utilità, windows | Etichette , , , | Lascia un commento