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

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

Ответ 1

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".

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

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

Ответ 9

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

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

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

Ответ 10

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

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

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

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