Мой SQL Server 2005 не восстанавливает резервную копию из-за активных подключений. Как я могу заставить его?
Как при восстановлении резервной копии отключить все активные подключения?
Ответы (10)
Студия управления SQL Server 2005
Если щелкнуть правой кнопкой мыши базу данных и выбрать Tasks
, а затем Detach Database
, появится диалоговое окно с активными подключениями.
Нажав на гиперссылку в разделе «Сообщения», вы можете отключить активные соединения.
Затем вы можете уничтожить эти соединения, не отсоединяя базу данных.
Дополнительная информация здесь.
Студия управления SQL Server 2008
Интерфейс изменился для SQL Server Management Studio 2008, вот шаги (через: Тим Люн)
- Щелкните правой кнопкой мыши сервер в обозревателе объектов и выберите «Мониторинг активности».
- Когда это откроется, разверните группу «Процессы».
- Теперь используйте раскрывающийся список, чтобы отфильтровать результаты по имени базы данных.
- Отключите соединения с сервером, выбрав правой кнопкой мыши опцию «Убить процесс».
Вы хотите установить базу данных в однопользовательский режим, выполнить восстановление, а затем снова установить ее в многопользовательский режим:
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
. Единственный способ сохранить эти данные — выполнить еще одну резервную копию после отката. Но вы восстанавливаетесь из другой резервной копии. Так какой смысл ждать? Я что-то упускаю?
- person Dave Mason; 13.11.2015
У меня этот код сработал, он убивает все существующие соединения базы данных. Все, что вам нужно сделать, это изменить строку 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
Таким образом, я гарантирую, что нет соединений, удерживающих базу данных, прежде чем установить одиночный режим, поскольку первое зависнет, если они есть.
Ни один из них не работал у меня, не мог удалить или отключить текущих пользователей. Также не удалось увидеть никаких активных подключений к БД. Перезапуск SQL Server (щелкните правой кнопкой мыши и выберите «Перезагрузить») позволил мне это сделать.
В дополнение к уже данному совету: если у вас есть веб-приложение, работающее через IIS, которое использует базу данных, вам также может потребоваться остановить (не перезапускать) пул приложений для приложения во время восстановления, а затем повторно -Начало. Остановка пула приложений убивает активные http-соединения и не разрешает больше, что в противном случае может привести к запуску процессов, которые подключаются к базе данных и тем самым блокируют ее. Это известная проблема, например, с системой управления контентом Umbraco при восстановлении базы данных.
Ничего из вышеперечисленного не работало для меня. В моей базе данных не было активных подключений с использованием Activity Monitor или sp_who. В итоге мне пришлось:
- Щелкните правой кнопкой мыши узел базы данных
- Выберите «Отключить…».
- Установите флажок «Отключить соединения».
- Прикрепить
Не самое элегантное решение, но оно работает и не требует перезапуска SQL Server (для меня это не вариант, так как на сервере БД размещена куча других баз данных)
Я предпочитаю делать так,
изменить базу данных, установленную в автономном режиме, с немедленным откатом
а затем восстановить базу данных. после этого,
изменить базу данных, установленную в сети, с немедленным откатом