SQL Server 2008 데이터베이스에서 사용자를 어떻게 추방합니까?


22

복원이 필요하며 다른 사용자가 연결되어 있기 때문에 복구 할 수 없습니다. 우리는 모든 프로세스의 연결을 끊었다 고 생각했지만 그렇지 않았습니다.

Management Studio에서이 백업을 수행 할 수 있도록 다른 모든 사람들을 어떻게 시작할 수 있습니까?

답변:


25

이를 수행하는 두 가지 방법이 있습니다.

  1. 오브젝트 탐색기에서 데이터베이스를 마우스 오른쪽 단추로 클릭하여 태스크> 분리로 이동하십시오. 연결 끊기 확인란을 선택하십시오.

  2. 여기에 설명 된대로 데이터베이스를 단일 사용자 모드 로 설정하십시오 .

    -- hit Ctrl+Shift+M in SSMS to fill in the template parameter
    USE master;
    GO
    
    ALTER DATABASE N'<Database Name, sysname,>'
    SET SINGLE_USER
    WITH ROLLBACK IMMEDIATE;
    GO
    
    ALTER DATABASE N'<Database Name, sysname,>'
    SET READ_ONLY;
    GO
    
    ALTER DATABASE N'<Database Name, sysname,>'
    SET MULTI_USER;
    GO

내가 너무 많은 의견을 가지고 있다는 것을 몰랐다. Marian은 정확합니다. 실제 분리를 실행할 필요가 없으며 스크립트를 사용하여 사용자를 강제 종료하십시오. @NickChammas 예, 읽기만하면 사용자가 다시 연결되지 않습니다. 다중 사용자로 설정하면 복원을 수행 할 수 있습니다. 또한 db 이름은 템플릿의 이름이므로 '<Database Name, sysname>'과 같은 태그는 Ctrl + Shift + M을 사용하여 대체됩니다. 템플릿이 아닌 스크립트에서 dbnames는 인용 부호가 없습니다.
Wil

43

나는 항상 다음을 사용합니다.

USE master; -- get out of dbname myself
GO
-- kick all other users out:
ALTER DATABASE [dbname] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
-- prevent sessions from re-establishing connection:
ALTER DATABASE [dbname] SET OFFLINE;

때때로 이것은 시간이 걸릴 수 있으며, 때때로이 차단되어 있기 때문에 당신이 그것을 실행하는 사람입니다, 그리고 당신은 데이터베이스에 대한 활성 연결이 . 데이터베이스 컨텍스트가 동일한 다른 쿼리 창을 확인하십시오. 여기에는 열린 대화 상자, 개체 탐색기, IntelliSense, 장기 실행 작업 등이 포함될 수 있습니다.

해당 데이터베이스의 구성을 변경 한 후에는 간단히 다음을 수행하십시오.

ALTER DATABASE [dbname] SET ONLINE;
ALTER DATABASE [dbname] SET MULTI_USER;

때로는 데이터베이스에 필요한 작업을 수행하려면 데이터베이스가 온라인 상태 여야하므로 단일 사용자 모드로 두어야합니다.

ALTER DATABASE [dbname] SET ONLINE;
GO
USE [dbname];

이제 변경 작업을 수행 한 다음 다른 사용자가 연결할 준비가되면 간단히 다음과 같이하십시오.

ALTER DATABASE [dbname] SET MULTI_USER;

2

나는 보통 single_user에 데이터베이스를 설정 한 다음 지연을 기다렸다가 다음과 같이 다중 사용자에 데이터베이스를 다시 설정합니다.

-- to kill all connections for particular db ... otherwise the restore will fail as exclusive lock cannot be obtained for the db being restored.

    alter database db_name
    set single_user with rollback immediate
    waitfor delay '00:00:05'  -- wait for 5 secs
    alter database db_name
    set multi_user
    restore database db_name from disk = 'D:\restore\db_name.bak'
    with replace, stats = 10, recovery -- if you want to recover your database online
    -- optional if you dont have the same directory/file structure
    move 'datafile logical name' to 'E:\data\physical_name.mdf',
    move 'logfile logical name' to 'F:\log\physical_name_log.ldf'

실제로, restore 문을 사용하여 단일 스크립트 (트랜잭션)를 실행하므로 "multi_user"를 설정할 필요가 없습니다. 복구를 통한 복원은 데이터베이스를 다중 사용자 모드로 되돌려 놓습니다.
Svein Terje Gaup

1

서버가 여러 원격 연결 시도로 망치로 인해 위의 옵션 중 어느 것도 효과가 없었습니다.

Windows 방화벽에서 특정 데이터베이스 포트를 닫으면 일반 Alter .. Set Multi_User가 첫 번째 시도 내에서 작동했습니다.


-1

다음은 실제로 모든 연결을 종료합니다. 단일 사용자 모드 설정이 실패한 경우에 매우 유용

declare @execSql varchar(1000), @databaseName varchar(100)
-- Set the database name for which to kill the connections
set @databaseName = 'databasename'
set @execSql = '' 
select  @execSql = @execSql + 'kill ' + convert(char(10), spid) + ' '
from    master.dbo.sysprocesses
where   db_name(dbid) = @databaseName
     and
     DBID <> 0
     and
     spid <> @@spid
exec(@execSql)

1
sysprocesses데이터베이스에서 잠금을 보유 할 수있는 모든 세션을 항상 설명하지는 않기 때문에 작동 하지 않습니다 (데이터베이스 A의 컨텍스트에서 쿼리가 실행되지만 A의 테이블과 B의 테이블을 조인하는 간단한 시나리오를 고려하십시오). .
Aaron Bertrand

-1

아래 스크립트를 사용하여 모든 사람을 해치거나 특정 DB를 수정할 수 있습니다.

죽일 수있는 것은 무엇이든 될 것입니다! 그러나 SQL 서비스 SPID는 영향을받지 않습니다.

Drop table #who

go 

Create table #who(  [spid] int,
                    [ECID] int,
                    [Status] varchar(100),
                    [Loginname] varchar(200),
                    [Hostname] varchar(200),
                    [blk] bit,
                    dbname varchar(200),
                    cmd varchar(1000),
                    requestID int
                  )

go

Insert into #who (Spid, ECID, Status, Loginname, hostname,blk, dbname, cmd, requestid)
exec sp_who

Declare cursKillUsers Cursor for Select 'Kill ' + cast(spid as varchar(100)) + ';' [SQL] from #who where dbname like '%'
Declare @sql varchar(200)
Open cursKillUsers
Fetch next from cursKillUsers into @sql
While @@fetch_status = 0 
begin

    print @sql
    Exec (@sql)
    Fetch next from cursKillUsers into @sql

end

close cursKillUsers
deallocate cursKillUsers

-3

이 코드를 사용합니다 :

ALTER DATABASE [Dbname] set offline with rollback immediate
GO
ALTER DATABASE [Dbname] set online
GO

그러나 SINGLE USER 예제가 입력하기가 적다는 것을 알 수 있습니다.


3
또한 데이터베이스를 온라인으로 다시 설정하면 복원을 시작하기 전에 다른 사용자가 다시 연결할 수 있습니다.
Aaron Bertrand
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.