L’altro giorno durante una copia di routine manuale di un server SQL Microsoft, qualcosa va storto e il database si mette in modalità single user mode, cioè una sorta di protezione per cui un solo utente (generalmente “sa” che sta per sql admin, ma questo non è un dato certo) può di fatto accedere al database.
Questo significa indirettamente che i servizi erogati sono bloccati e quindi anche gli applicativi ad esso correlati.
Inutile dire che riavviare il server SQL o i servizi non serve a nulla, alla ripartenza si ritroverà sempre nello stesso stato. Inoltre anche come “sa” il database non è consultabile, cioè non si vedranno gli oggetti, cioè tabelle, security eccetera.
Come se ne esce? la procedura si risolve con uno script, di fatto la cosa è un minimo complicata da spiegare, perché dobbiamo per prima cosa impostarci in modalità master, cioè una sorta di “super user”; trovare e uccidere tutte le connessioni, quindi anche quella del single user mode; impostare un deadlock (per evitare che qualcuno si re-impossessi dell’unico utente libero) e modificare le impostazioni del database affinché venga sovrascritta la modalità da single-user in multi-user.
Per fare questo andiamo da SQL Explorer in alto, sull’apice dell’albero, attiviamo con il tasto destro la console SQL dove potremo incollare il codice sottostante:
USE master
GO
DECLARE @DBNAME VARCHAR(255)
SET @DBNAME = 'mio_database_bloccato'
DECLARE @kill varchar(max) = '';
SELECT @kill = @kill + 'KILL ' + CONVERT(varchar(10), spid) + '; '
FROM master..sysprocesses
WHERE spid > 50 AND dbid = DB_ID('DBNAME')
EXEC(@kill);
GO
SET DEADLOCK_PRIORITY HIGH
ALTER DATABASE [DBNAME] SET MULTI_USER WITH NO_WAIT
ALTER DATABASE [DBNAME] SET MULTI_USER WITH ROLLBACK IMMEDIATE
GO
Prima di avviarlo abbiate cura di modificare il parametro alla quarta riga, dove cambieremo “mio_database_bloccato” con il nome del vostro database.
La procedura dovrebbe essere rapidissima e successivamente dovreste essere in grado di accedere voi, come utenti ed applicativi, ad SQL come di consueto.