Мій SQL Server 2005 не відновлює резервну копію через активні з'єднання. Як я можу це змусити?
Мій SQL Server 2005 не відновлює резервну копію через активні з'єднання. Як я можу це змусити?
Відповіді:
Коли ви клацніть правою кнопкою миші на базі даних і натисніть, Tasks
а потім натисніть Detach Database
, вона відкриє діалогове вікно з активними з'єднаннями.
Натиснувши на гіперпосилання в розділі "Повідомлення", ви можете перервати активні з'єднання.
Потім ви можете вбити ці з'єднання, не відриваючи базу даних.
Більше інформації тут .
Інтерфейс змінився для студії управління SQL Server 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
Довідка: Pinal Dave ( 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
Потім я встановив базу даних в режим однокористувача
ALTER DATABASE dbName SET SINGLE_USER
Потім я запускаю відновлення ...
RESTORE DATABASE and whatnot
Знову вбийте з'єднання
(same query as above)
І поверніть базу даних на багатокористувацьку.
ALTER DATABASE dbName SET MULTI_USER
Таким чином я переконуюсь у відсутності з’єднань, що підтримують базу даних, перш ніж встановити один режим, оскільки колишній заморозиться, якщо є.
Щоб додати до вже наданих порад, якщо у вас є веб-додаток, що працює через IIS, який використовує БД, вам також може знадобитися зупинити (не переробляти) пул додатків під час відновлення, а потім перезапустити. Припинення пулу додатків виключає активні з’єднання http і не дозволяє більше, що в іншому випадку може призвести до запуску процесів, що підключаються до і тим самим блокують базу даних. Це відома проблема, наприклад, із системою управління вмістом Umbraco при відновленні бази даних
Ніщо з перерахованого вище не працювало для мене. У моїй базі даних не було показано жодних активних з'єднань за допомогою Monitor Monitor або sp_who. Я в кінцевому рахунку повинен був:
Це не найелегантніше рішення, але воно працює, і воно не вимагає перезавантаження SQL Server (не для мене варіант, оскільки на сервері БД розміщена купа інших баз даних)
Я вважаю за краще робити так,
змінити набір баз даних офлайн з негайним відкатом
а потім відновіть вашу базу даних. після того,
змінити базу даних в Інтернеті з негайним відкатом