Мой SQL Server 2005 не восстанавливает резервную копию из-за активных подключений. Как я могу заставить это?
Мой SQL Server 2005 не восстанавливает резервную копию из-за активных подключений. Как я могу заставить это?
Ответы:
Когда вы щелкаете правой кнопкой мыши по базе данных, Tasks
затем щелкаете Detach Database
, а затем щелкаете , открывается диалоговое окно с активными соединениями.
Нажав на гиперссылку в разделе «Сообщения», вы можете отключить активные соединения.
Затем вы можете уничтожить эти соединения, не отключая базу данных.
Больше информации здесь .
Интерфейс изменился для SQL Server Management Studio 2008, вот шаги (через: Тим Леунг )
Вы хотите установить 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
Ссылка: Пинал Дэйв ( http://blog.SQLAuthority.com )
Официальная ссылка: https://msdn.microsoft.com/en-us/library/ms345598.aspx
ROLLBACK IMMEDIATE
и у вас ROLLBACK AFTER 60
. Единственный способ сохранить эти данные - выполнить другое резервное копирование после отката. Но вы восстанавливаете из другой резервной копии. Итак, какой смысл ждать? Я что-то упускаю?
Этот код работал для меня, он убивает все существующие соединения базы данных. Все, что вам нужно сделать, это изменить строку 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
после этого я смог его восстановить
Попробуй это:
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 отключит пользователей. Самый простой способ, который я нашел - хорошо, если вы хотите отключить сервер.
Но по какой-то очень странной причине опция «Отключить» делает это ненадежно и может повредить или запутать консоль управления. Перезапуск, а затем работает в автономном режиме
Иногда это вариант - если, например, вы остановили веб-сервер, который является источником соединений.
Я столкнулся с этой проблемой при автоматизации процесса восстановления в 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
Таким образом, я гарантирую, что нет никаких соединений, удерживающих базу данных перед установкой в одиночный режим, так как первый будет зависать, если есть.
В дополнение к уже предоставленному совету, если у вас есть веб-приложение, работающее через IIS, использующее БД, вам также может понадобиться остановить (не перезапускать) пул приложений для приложения во время восстановления, а затем перезапустить. Остановка пула приложений убивает активные http-соединения и не позволяет больше, что в противном случае могло бы привести к запуску процессов, которые подключаются к базе данных и тем самым блокируют ее. Это известная проблема, например, с системой управления контентом Umbraco при восстановлении базы данных.
Ничто из вышеперечисленного не помогло мне. В моей базе данных не было активных соединений с использованием Activity Monitor или sp_who. В конечном итоге мне пришлось:
Не самое элегантное решение, но оно работает и не требует перезапуска SQL Server (для меня это не вариант, поскольку на сервере БД размещалась куча других баз данных)
Я предпочитаю делать так,
изменить базу данных в автономном режиме с немедленным откатом
а затем восстановить вашу базу данных. после этого,
изменить базу данных, установленную онлайн с немедленным откатом