Il mio SQL Server 2005 non ripristina un backup a causa delle connessioni attive. Come posso forzarlo?
Il mio SQL Server 2005 non ripristina un backup a causa delle connessioni attive. Come posso forzarlo?
Risposte:
Quando si fa clic con il tasto destro su un database e si fa clic Tasks
e quindi Detach Database
si fa clic , si apre una finestra di dialogo con le connessioni attive.
Facendo clic sul collegamento ipertestuale in "Messaggi" è possibile interrompere le connessioni attive.
È quindi possibile interrompere tali connessioni senza scollegare il database.
Maggiori informazioni qui .
L'interfaccia è cambiata per SQL Server Management Studio 2008, ecco i passaggi (tramite: Tim Leung )
Vuoi impostare il tuo db in modalità utente singolo, eseguire il ripristino, quindi ripristinarlo su multiutente:
ALTER DATABASE YourDB
SET SINGLE_USER WITH
ROLLBACK AFTER 60 --this will give your current connections 60 seconds to complete
--Do Actual Restore
RESTORE DATABASE YourDB
FROM DISK = 'D:\BackUp\YourBaackUpFile.bak'
WITH MOVE 'YourMDFLogicalName' TO 'D:\Data\YourMDFFile.mdf',
MOVE 'YourLDFLogicalName' TO 'D:\Data\YourLDFFile.ldf'
/*If there is no error in statement before database will be in multiuser
mode. If error occurs please execute following command it will convert
database in multi user.*/
ALTER DATABASE YourDB SET MULTI_USER
GO
Riferimento: Pinal Dave ( http://blog.SQLAuthority.com )
Riferimento ufficiale: https://msdn.microsoft.com/en-us/library/ms345598.aspx
ROLLBACK IMMEDIATE
o ROLLBACK AFTER 60
. L'unico modo per salvare tali dati è eseguire un altro backup dopo il rollback. Ma stai ripristinando da un backup diverso. Allora, qual è il punto di attesa? Mi sto perdendo qualcosa?
Questo codice ha funzionato per me, uccide tutte le connessioni esistenti di un database. Tutto quello che devi fare è cambiare la riga Set @dbname = 'databaseName' in modo che abbia il nome del tuo database.
Use Master
Go
Declare @dbname sysname
Set @dbname = 'databaseName'
Declare @spid int
Select @spid = min(spid) from master.dbo.sysprocesses
where dbid = db_id(@dbname)
While @spid Is Not Null
Begin
Execute ('Kill ' + @spid)
Select @spid = min(spid) from master.dbo.sysprocesses
where dbid = db_id(@dbname) and spid > @spid
End
dopo questo sono stato in grado di ripristinarlo
Prova questo:
DECLARE UserCursor CURSOR LOCAL FAST_FORWARD FOR
SELECT
spid
FROM
master.dbo.sysprocesses
WHERE DB_NAME(dbid) = 'dbname'--replace the dbname with your database
DECLARE @spid SMALLINT
DECLARE @SQLCommand VARCHAR(300)
OPEN UserCursor
FETCH NEXT FROM UserCursor INTO
@spid
WHILE @@FETCH_STATUS = 0
BEGIN
SET @SQLCommand = 'KILL ' + CAST(@spid AS VARCHAR)
EXECUTE(@SQLCommand)
FETCH NEXT FROM UserCursor INTO
@spid
END
CLOSE UserCursor
DEALLOCATE UserCursor
GO
Il riavvio del server SQL disconnetterà gli utenti. Il modo più semplice che ho trovato - buono anche se vuoi portare il server offline.
Ma per qualche ragione molto strana l'opzione 'Take Offline' non lo fa in modo affidabile e può bloccare o confondere la console di gestione. Riavvio quindi esecuzione offline
A volte questa è un'opzione - se per esempio hai fermato un server web che è la fonte delle connessioni.
Ho riscontrato questo problema durante l'automazione di un processo di ripristino in SQL Server 2008. Il mio approccio (riuscito) era una combinazione di due delle risposte fornite.
Innanzitutto, corro attraverso tutte le connessioni di detto database e li uccido.
DECLARE @SPID int = (SELECT TOP 1 SPID FROM sys.sysprocess WHERE dbid = db_id('dbName'))
While @spid Is Not Null
Begin
Execute ('Kill ' + @spid)
Select @spid = top 1 spid from master.dbo.sysprocesses
where dbid = db_id('dbName')
End
Quindi, ho impostato il database in modalità single_user
ALTER DATABASE dbName SET SINGLE_USER
Quindi, eseguo il ripristino ...
RESTORE DATABASE and whatnot
Uccidi di nuovo le connessioni
(same query as above)
E reimpostare il database su multi_user.
ALTER DATABASE dbName SET MULTI_USER
In questo modo, mi assicuro che non ci siano connessioni che trattengono il database prima di impostare la modalità singola, poiché la prima si bloccherà se ci sono.
Per aggiungere consigli già forniti, se si dispone di un'app Web in esecuzione su IIS che utilizza il DB, potrebbe essere necessario arrestare (non riciclare) il pool di app per l'app durante il ripristino, quindi riavviare. L'arresto del pool di app interrompe le connessioni http attive e non consente più, il che potrebbe altrimenti consentire l'attivazione di processi che si collegano e quindi bloccare il database. Questo è un problema noto, ad esempio con Umbraco Content Management System durante il ripristino del suo database
Nessuna delle precedenti ha funzionato per me. Il mio database non ha mostrato alcuna connessione attiva utilizzando Activity Monitor o sp_who. Alla fine ho dovuto:
Non è la soluzione più elegante ma funziona e non richiede il riavvio di SQL Server (non è un'opzione per me, poiché il server DB ha ospitato un sacco di altri database)
Preferisco fare così
modifica database impostato offline con rollback immediato
e quindi ripristinare il database. dopo di che,
modifica database impostato online con rollback immediato