답변:
당신이 바로 데이터베이스를 클릭 클릭하면 Tasks
다음을 클릭 Detach Database
, 그것은 활성 연결이있는 대화 상자가 나타납니다.
"메시지"아래의 하이퍼 링크를 클릭하면 활성 연결을 종료 할 수 있습니다.
그런 다음 데이터베이스를 분리하지 않고 해당 연결을 종료 할 수 있습니다.
SQL Server Management Studio 2008의 인터페이스가 변경되었습니다. 단계는 다음과 같습니다 ( Tim Leung 사용 ).
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 Server를 다시 시작하면 사용자 연결이 끊어집니다. 내가 찾은 가장 쉬운 방법-서버를 오프라인으로 전환하려는 경우에도 좋습니다.
그러나 매우 까다로운 이유로 'Take Offline (오프라인으로 가져 오기)'옵션을 사용하면이 작업을 안정적으로 수행 할 수 없으며 관리 콘솔이 중단되거나 혼동 될 수 있습니다. 다시 시작한 후 오프라인 작업 수행
예를 들어 연결의 소스 인 웹 서버를 중지 한 경우 옵션입니다.
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
이렇게하면 단일 모드로 설정하기 전에 데이터베이스를 유지하는 연결이 없는지 확인합니다.
위의 어느 것도 나를 위해 일하지 않았습니다. 내 데이터베이스에 Activity Monitor 또는 sp_who를 사용한 활성 연결이 표시되지 않았습니다. 나는 궁극적으로 :
가장 우아한 솔루션은 아니지만 작동하며 SQL Server를 다시 시작할 필요가 없습니다 (DB 서버가 많은 다른 데이터베이스를 호스팅했기 때문에 옵션이 아닙니다)
나는 이것을 좋아한다.
롤백 즉시 데이터베이스 세트를 오프라인으로 변경
데이터베이스를 복원하십시오. 그 후
롤백 즉시 데이터베이스 세트를 온라인으로 변경