Как при восстановлении резервной копии отключить все активные соединения?

мой SQL Server 2005 не восстанавливает резервную копию из-за активных соединений. Как я могу заставить его?

9 ответов


среда SQL Server Management Studio 2005

когда вы щелкните правой кнопкой мыши на базе данных и нажмите кнопку Tasks и нажмите кнопку Detach Database, он вызывает диалог с активными соединениями.

отсоединить экран http://www.kodyaz.com/images/articles/kill-all-processes/detach-database.JPG

нажав на гиперссылку в разделе "Сообщения", вы можете убить активные соединения.

затем вы можете убить эти соединения, не отсоединяя база данных.

дополнительная информация здесь.

среда SQL Server Management Studio 2008

интерфейс изменился для SQL Server Management studio 2008, вот шаги (через:Тим Люн)

  1. щелкните правой кнопкой мыши сервер в Обозревателе объектов и выберите "Монитор активности".
  2. когда это откроется, разверните группу процессы.
  3. теперь используйте раскрывающийся список для фильтрации результатов по имени базы данных.
  4. выключите подключения к серверу, выбрав опцию "убить процесс" Правой Кнопкой Мыши.

вы хотите установить БД в однопользовательский режим, выполните восстановление, а затем установите его обратно в многопользовательский:

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

Ссылка : Pinal Dave (http://blog.SQLAuthority.com)

официальная ссылка:https://msdn.microsoft.com/en-us/library/ms345598.aspx


этот код работал для меня, он убивает все существующие подключения к базе данных. Все, что вам нужно сделать, это изменить строку Set @dbname = 'databaseName', чтобы она имела имя вашей базы данных.

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

после этого я смог восстановить его


перезапуск SQL server отключит пользователей. Простой способ я нашел - хорошо также, если вы хотите отключить сервер.

но по какой-то очень странной причине опция "Take Offline" не делает этого надежно и может зависнуть или запутать консоль управления. Перезапуск, а затем автономные работы

иногда это опция-если, например, вы остановили веб-сервер, который является источником соединений.


попробуйте это ...

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

ни один из них не работал для меня, не мог удалить или отключить текущих пользователей. Также не удалось увидеть активных подключений к БД. Перезапуск SQL Server (щелкните правой кнопкой мыши и выберите перезагрузка) позволил мне это сделать.


чтобы добавить к уже данному совету, если у вас есть веб-приложение, работающее через IIS, которое использует БД, вам также может потребоваться остановка (не рециркулировать) пул приложений для приложения во время восстановления, а затем перезапустить. Остановка пула приложений убивает активные http-соединения и больше не позволяет, что в противном случае может привести к запуску процессов, которые подключаются и тем самым блокируют базу данных. Это известная проблема, например, с системой управления контентом Umbraco, когда восстановление базы данных


я столкнулся с этой проблемой при автоматизации процесса восстановления в SQL Server 2008. Мой (успешный) подход состоял из двух ответов.

во-первых, я запускаю все соединения указанной базы данных и убиваю их.

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

затем я установил базу данных в режим single_user

ALTER DATABASE dbName SET SINGLE_USER

затем, я запускаю восстановление...

RESTORE DATABASE and whatnot

убейте соединения снова

(same query as above)

и настройка базы данных multi_user.

ALTER DATABASE dbName SET MULTI_USER

таким образом, я гарантирую, что нет никаких соединений, удерживающих базу данных перед установкой в одиночный режим, так как первый замерзнет, если есть.


ничего из вышеперечисленного не сработало для меня. Моя база данных не показывала активных соединений с помощью Activity Monitor или sp_who. В конце концов мне пришлось:

  • щелкните правой кнопкой мыши узел базы данных
  • Выберите "Отсоединить..."
  • установите флажок "Drop Connections"
  • Reattach

Не самое элегантное решение, но оно работает и не требует перезапуска SQL Server (не вариант для меня, так как сервер БД размещал кучу других базы данных)