Meu SQL Server 2005 não restaura um backup por causa de conexões ativas. Como posso forçá-lo?
Meu SQL Server 2005 não restaura um backup por causa de conexões ativas. Como posso forçá-lo?
Respostas:
Quando você clica com o botão direito do mouse em um banco de dados, clica Tasks
e, em seguida Detach Database
, clica em , ele exibe uma caixa de diálogo com as conexões ativas.
Ao clicar no hiperlink em "Mensagens", você pode matar as conexões ativas.
Você pode matar essas conexões sem desanexar o banco de dados.
Mais informações aqui .
A interface foi alterada para o SQL Server Management studio 2008, eis as etapas (via: Tim Leung )
Você deseja definir seu banco de dados para o modo de usuário único, fazer a restauração e configurá-lo novamente para multiusuário:
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
Referência: Pinal Dave ( http://blog.SQLAuthority.com )
Referência oficial: https://msdn.microsoft.com/en-us/library/ms345598.aspx
ROLLBACK IMMEDIATE
ou ROLLBACK AFTER 60
. A única maneira de salvar esses dados é executar outro backup após a reversão. Mas você está restaurando a partir de um backup diferente. Então, qual é o sentido de esperar? Estou esquecendo de algo?
Esse código funcionou para mim, mata todas as conexões existentes de um banco de dados. Tudo que você precisa fazer é alterar a linha Set @dbname = 'databaseName' para que ele tenha o nome do seu banco de dados.
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
depois disso eu fui capaz de restaurá-lo
Tente o seguinte:
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
Reiniciar o servidor SQL desconectará os usuários. A maneira mais fácil que eu encontrei - boa também se você quiser colocar o servidor offline.
Mas, por algum motivo muito estranho, a opção 'Take Offline' não faz isso de maneira confiável e pode travar ou confundir o console de gerenciamento. Reiniciando e executando trabalhos offline
Às vezes, essa é uma opção - se, por exemplo, você parou um servidor da web que é a fonte das conexões.
Eu deparei com esse problema ao automatizar um processo de restauração no SQL Server 2008. Minha abordagem (com êxito) foi uma mistura de duas das respostas fornecidas.
Primeiro, eu corro por todas as conexões do referido banco de dados e as mato.
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
Em seguida, defino o banco de dados para o modo single_user
ALTER DATABASE dbName SET SINGLE_USER
Então, eu executo a restauração ...
RESTORE DATABASE and whatnot
Mate as conexões novamente
(same query as above)
E defina o banco de dados novamente para multi_usuário.
ALTER DATABASE dbName SET MULTI_USER
Dessa forma, garanto que não há conexões mantendo o banco de dados antes de definir o modo único, pois o primeiro congelará se houver.
Nenhuma delas estava funcionando para mim, não foi possível excluir ou desconectar os usuários atuais. Também não foi possível ver nenhuma conexão ativa com o banco de dados. Reiniciar o SQL Server (clique com o botão direito do mouse e selecione Reiniciar) me permitiu fazê-lo.
Para adicionar conselhos já fornecidos, se você tiver um aplicativo Web executando o IIS que usa o banco de dados, também poderá ser necessário interromper (não reciclar) o pool de aplicativos para o aplicativo enquanto você restaura e reinicia. A interrupção do pool de aplicativos elimina as conexões http ativas e não permite mais, o que poderia resultar no desencadeamento de processos que se conectam e bloqueiam o banco de dados. Esse é um problema conhecido, por exemplo, com o Umbraco Content Management System ao restaurar seu banco de dados
Nenhuma das opções acima funcionou para mim. Meu banco de dados não mostrou nenhuma conexão ativa usando o Activity Monitor ou sp_who. Eu finalmente tive que:
Não é a solução mais elegante, mas funciona e não requer a reinicialização do SQL Server (não é uma opção para mim, pois o servidor DB hospedou vários outros bancos de dados)
Eu prefiro fazer assim,
alterar o conjunto de banco de dados offline com reversão imediata
e depois restaure seu banco de dados. depois disso,
alterar banco de dados definido on-line com reversão imediata