Kami perlu melakukan pemulihan, dan tidak bisa karena pengguna lain terhubung. Kami pikir kami telah memutus setiap proses, tetapi ternyata tidak.
Bagaimana kita, dari Management Studio, memulai orang lain sehingga kita dapat melakukan backup ini?
Kami perlu melakukan pemulihan, dan tidak bisa karena pengguna lain terhubung. Kami pikir kami telah memutus setiap proses, tetapi ternyata tidak.
Bagaimana kita, dari Management Studio, memulai orang lain sehingga kita dapat melakukan backup ini?
Jawaban:
Ada dua cara untuk melakukannya:
Klik kanan pada database di Object Explorer pergi ke Tugas> Lepaskan. Pilih kotak centang Jatuhkan Koneksi.
Setel basis data ke mode satu-pengguna seperti diuraikan di sini :
-- 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
Saya selalu menggunakan yang berikut ini:
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;
Kadang-kadang ini membutuhkan waktu, dan kadang-kadang diblokir karena kaulah yang menjalankannya, dan Anda memiliki koneksi aktif ke database . Periksa jendela kueri lain yang mungkin memiliki konteks database yang sama - ini dapat mencakup dialog terbuka, Object Explorer, IntelliSense, pekerjaan yang sudah berjalan lama, dll.
Ketika saya selesai melakukan perubahan pada konfigurasi database itu, saya hanya:
ALTER DATABASE [dbname] SET ONLINE;
ALTER DATABASE [dbname] SET MULTI_USER;
Meskipun, kadang-kadang, hal yang perlu saya lakukan untuk database itu mengharuskan database untuk online, jadi kadang-kadang saya harus meninggalkannya dalam mode pengguna tunggal dan melakukan ini:
ALTER DATABASE [dbname] SET ONLINE;
GO
USE [dbname];
Sekarang saya bisa melakukan perubahan, dan kemudian ketika saya siap bagi pengguna lain untuk terhubung, cukup:
ALTER DATABASE [dbname] SET MULTI_USER;
Saya biasanya mengatur database di single_user dan kemudian menunggu untuk menunda dan kemudian mengatur kembali database di multiuser seperti di bawah ini:
-- 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'
Yang berikut ini benar-benar membunuh semua koneksi. Cukup berguna dalam kasus di mana pengaturan mode pengguna tunggal gagal
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)
sysprocesses
tidak selalu memperhitungkan semua sesi yang mungkin memegang kunci dalam basis data tersebut (pikirkan skenario sederhana di mana kueri dijalankan dalam konteks basis data A tetapi bergabung dengan tabel dalam A dan tabel di B) .
Anda dapat menggunakan skrip di bawah ini untuk mem-nuke semua orang, atau memodifikasi untuk DB tertentu.
Apa pun yang bisa dibunuh, akan! Namun, SPID layanan SQL tidak akan terpengaruh.
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
Saya menggunakan kode ini:
ALTER DATABASE [Dbname] set offline with rollback immediate
GO
ALTER DATABASE [Dbname] set online
GO
Tapi saya bisa melihat contoh SINGLE USER kurang mengetik.