Как вы выгнать пользователей из базы данных 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
Wil
источник
Не понял, у меня было так много комментариев, лол. Мариан прав, нет необходимости запускать фактическое отключение, просто получите скрипт для уничтожения пользователей. @NickChammas Да, только чтение делает невозможным повторное подключение пользователей. Когда вы установите его многопользовательский, вы можете сделать восстановление. Также имена БД взяты из шаблона, и поэтому такие теги, как «<Имя базы данных, sysname>», должны быть заменены с помощью Ctrl + Shift + M. В сценарии без шаблонов имена dbname не будут заключаться в кавычки.
Уил
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;

Иногда это может занять некоторое время, а иногда оно блокируется, потому что вы тот, кто его запускает, и у вас есть активное соединение с базой данных . Проверьте другие окна запросов, которые могут иметь тот же контекст базы данных - это может включать открытые диалоги, Object Explorer, 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'
Кин Шах
источник
На самом деле нет необходимости «устанавливать multi_user», поскольку вы запускаете один скрипт (транзакцию) с оператором восстановления. Восстановление с восстановлением позаботится о переводе базы данных в многопользовательский режим.
Свейн Терье Гауп
1

Ни один из вышеперечисленных вариантов не работал для меня, потому что сервер был забит из-за нескольких попыток удаленного подключения.

Когда я закрыл конкретный порт базы данных на брандмауэре Windows, обычный Alter .. Set Multi_User работал в первой попытке.

olafk
источник
-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) ,
Аарон Бертран
-1

Вы можете использовать приведенный ниже скрипт, чтобы либо убить всех, либо изменить для конкретной БД.

Все, что можно убить, будет! Однако SPID службы SQL не будут затронуты.

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
BITSYSUK
источник
-3

Я использую этот код:

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

Но я вижу, что пример ОДНОГО ПОЛЬЗОВАТЕЛЯ меньше печатать.

Пол Элс
источник
3
Кроме того, установка базы данных обратно в онлайн означает, что другие пользователи могут снова подключиться, прежде чем начать восстановление.
Аарон Бертран