При восстановлении резервной копии, как отключить все активные подключения? - PullRequest
164 голосов
/ 20 июля 2009

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

Ответы [ 10 ]

186 голосов
/ 20 июля 2009

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

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

Ссылка: Пинал Дэйв (http://blog.SQLAuthority.com)

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

172 голосов
/ 20 июля 2009

SQL Server Management Studio 2005

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

Detach Screen

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

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

Подробнее здесь .

SQL Server Management Studio 2008

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

  1. Щелкните правой кнопкой мыши сервер в обозревателе объектов и выберите «Монитор активности».
  2. Когда это откроется, разверните группу Процессы.
  3. Теперь используйте раскрывающийся список для фильтрации результатов по имени базы данных.
  4. Завершите соединение с сервером, выбрав опцию «Kill Process», щелкнув правой кнопкой мыши.
38 голосов
/ 31 мая 2012

Этот код работал для меня, он убивает все существующие подключения базы данных. Все, что вам нужно сделать, это изменить строку 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

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

5 голосов
/ 11 апреля 2010

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

Но по какой-то очень странной причине опция «Отключить» делает это ненадежно и может повредить или запутать консоль управления. Перезапуск, а затем отключение работает

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

4 голосов
/ 13 апреля 2013

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

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
2 голосов
/ 05 октября 2016

Я столкнулся с этой проблемой при автоматизации процесса восстановления в 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

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

2 голосов
/ 31 июля 2013

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

2 голосов
/ 01 мая 2012

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

1 голос
/ 27 января 2016

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

  • Щелкните правой кнопкой мыши узел базы данных
  • Выберите «Отделить ...»
  • Установите флажок «Отключить соединения»
  • 1010 * Присоедините *

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

0 голосов
/ 04 апреля 2019

Я предпочитаю делать так,

изменение базы данных, отключенной с немедленным откатом

и затем восстановите вашу базу данных. после этого

изменить базу данных, установленную онлайн с немедленным откатом

...