[sql-server] 백업을 복원 할 때 모든 활성 연결을 해제하려면 어떻게합니까?

활성 연결로 인해 SQL Server 2005가 백업을 복원하지 않습니다. 어떻게 강제 할 수 있습니까?



답변

SQL Server Management Studio 2005

당신이 바로 데이터베이스를 클릭 클릭하면 Tasks다음을 클릭 Detach Database, 그것은 활성 연결이있는 대화 상자가 나타납니다.

분리 화면

“메시지”아래의 하이퍼 링크를 클릭하면 활성 연결을 종료 할 수 있습니다.

그런 다음 데이터베이스를 분리하지 않고 해당 연결을 종료 할 수 있습니다.

자세한 내용은 여기를 참조 하십시오 .

SQL Server Management Studio 2008

SQL Server Management Studio 2008의 인터페이스가 변경되었습니다. 단계는 다음과 같습니다 ( Tim Leung 사용 ).

  1. 개체 탐색기에서 서버를 마우스 오른쪽 단추로 클릭하고 ‘활동 모니터’를 선택하십시오.
  2. 이것이 열리면 프로세스 그룹을 펼치십시오.
  3. 이제 드롭 다운을 사용하여 데이터베이스 이름별로 결과를 필터링하십시오.
  4. 마우스 오른쪽 단추로 ‘Kill Process’옵션을 선택하여 서버 연결을 종료하십시오.

답변

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


답변

이 코드는 저에게 효과적이며 데이터베이스의 기존 연결을 모두 종료합니다. 데이터베이스 이름을 갖도록 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

이렇게하면 단일 모드로 설정하기 전에 데이터베이스를 유지하는 연결이 없는지 확인합니다.


답변

이 중 어느 것도 나를 위해 일하지 않았으며 현재 사용자를 삭제하거나 연결을 끊을 수 없습니다. 또한 DB에 대한 활성 연결을 볼 수 없습니다. SQL Server를 다시 시작하면 (마우스 오른쪽 버튼을 클릭하고 다시 시작을 선택하면) 가능합니다.