Keluar dari mode pengguna tunggal

208

Saat ini, basis data saya dalam mode Pengguna Tunggal. Ketika saya mencoba memperluas basis data saya, saya mendapatkan kesalahan:

Basis data 'my_db' tidak dapat diakses. (ObjectExplorer)

Juga, ketika saya mencoba untuk menghapus database, saya mendapatkan kesalahan:

Perubahan ke keadaan atau opsi database 'my_db' tidak dapat dilakukan saat ini. Basis data dalam mode satu pengguna, dan pengguna saat ini terhubung dengannya.

Bagaimana cara keluar dari mode pengguna tunggal? Saya tidak memiliki pengguna yang menggunakan database ini.

Ketika saya mencoba menelusuri situs saya dengan IIS, kesalahan yang saya dapatkan adalah:

Pengecualian yang tidak tertangani dihasilkan selama eksekusi permintaan web saat ini. Informasi mengenai asal dan lokasi pengecualian dapat diidentifikasi menggunakan jejak tumpukan pengecualian di bawah ini.

Saya merasa seolah-olah mode single-user yang menyebabkan ini.

Liondancer
sumber

Jawaban:

381

SSMS secara umum menggunakan beberapa koneksi ke database di belakang layar.

Anda harus mematikan koneksi ini sebelum mengubah mode akses.

Pertama, pastikan objek explorer diarahkan ke sistem database seperti master.

Kedua, jalankan sp_who2 dan temukan semua koneksi ke database 'my_db'. Bunuh semua koneksi dengan melakukan di KILL { session id }mana id sesi SPIDterdaftar oleh sp_who2.

Ketiga, buka jendela permintaan baru.

Jalankan kode berikut.

-- Start in master
USE MASTER;

-- Add users
ALTER DATABASE [my_db] SET MULTI_USER
GO

Lihat artikel blog saya tentang mengelola file database. Ini ditulis untuk memindahkan file, tetapi manajemen pengguna adalah sama.

DBA KERAJINAN
sumber
2
Ketika saya menggunakan perintah 'sp_who2', saya tidak melihat DBName terhubung ke 'my_db'. Saya tidak membunuh koneksi itu. Setelah saya menjalankan perintah, saya mendapatkan error yang sama = [: 'Perubahan ke status atau opsi database' my_db 'tidak dapat dibuat saat ini. Basis data dalam mode satu pengguna, dan pengguna saat ini terhubung dengannya. Msg 5069, Level 16, Negara 1, Baris 1 Pernyataan ALTER DATABASE gagal '
Liondancer
2
Apakah Anda memastikan Anda berada di master, sp_who2 tidak menunjukkan baris dengan database = my_db, dan objek explorer Anda tidak ada di my_db.
CRAFTY DBA
1
Coba, lepaskan dan sambungkan SSMS. Sesuatu harus terhubung ke database itu. Opsi lainnya adalah terhubung dengan konsol admin khusus (DAC). Ini mengasumsikan Anda adalah sysadmin. Kemudian bunuh spid yang menyinggung.
CRAFTY DBA
1
Juga, unduh skrip usp_who2 saya ( craftydba.com/wp-content/uploads/2011/09/usp-who2.txt ). Jalankan itu. Itu menempatkan utilitas di msdb.dbo.usp_who2. Ini menyimpan hasil sp_who2 ke dalam tabel di tempdb di bawah id pengguna Anda, filter dengan nama database. Posting gambar kesalahan untuk membantu kami lebih banyak. Semoga berhasil.
CRAFTY DBA
3
Temukan SPID, gunakan yang berikut: Bunuh 100. Angka 100 adalah nomor sesi (SPID).
CRAFTY DBA
45

Pertama, temukan dan KILLsemua proses yang telah berjalan saat ini.

Kemudian, jalankan berikut ini T-SQLuntuk mengatur database dalam MULTI_USERmode.

USE master
GO
DECLARE @kill varchar(max) = '';
SELECT @kill = @kill + 'KILL ' + CONVERT(varchar(10), spid) + '; '
FROM master..sysprocesses 
WHERE spid > 50 AND dbid = DB_ID('<Your_DB_Name>')
EXEC(@kill);

GO
SET DEADLOCK_PRIORITY HIGH
ALTER DATABASE [<Your_DB_Name>] SET MULTI_USER WITH NO_WAIT
ALTER DATABASE [<Your_DB_Name>] SET MULTI_USER WITH ROLLBACK IMMEDIATE
GO
Sathish
sumber
Solusi ini tidak akan bekerja untuk saya di SQL Server 2016. Jika saya meminta master..sysprocesses, saya melihat beberapa baris muncul, tetapi kemudian baris diganti dengan pesan kesalahan bahwa database yang diberikan dalam mode pengguna tunggal, dll.
youcantryreachingme
@youcantryreachingme, berikan pesan kesalahan yang Anda dapatkan di SQL Server 2016 di sini sehingga saya / orang lain akan dapat membantu Anda menyelesaikannya.
Sathish
sama seperti di OP: Perubahan ke keadaan atau opsi database 'my_db' tidak dapat dibuat saat ini. Basis data dalam mode satu pengguna, dan pengguna saat ini terhubung dengannya.
youcantryreachingme
25

Untuk beralih dari mode Pengguna Tunggal, coba:

ALTER DATABASE [my_db] SET MULTI_USER

Untuk beralih kembali ke mode Pengguna Tunggal, Anda dapat menggunakan:

ALTER DATABASE [my_db] SET SINGLE_USER

rsbarro
sumber
1
Saya mendapatkan kesalahan: 'Perubahan ke keadaan atau opsi database' my_db 'tidak dapat dibuat saat ini. Basis data dalam mode satu pengguna, dan pengguna saat ini terhubung dengannya. Msg 5069, Level 16, Status 1, Baris 1 Pernyataan DATABASE ALTER gagal. '
Liondancer
1
Bisakah Anda berhenti dan mulai ulang basis data (jelas jika ini bukan sistem produksi yang akan memengaruhi pengguna lain), lalu coba lagi perintahnya? Dan seperti @CRAFTYDBA menyatakan perintah harus dieksekusi dari database master.
rsbarro
1
Saya memperluas 'Database Sistem' dan mengklik kanan 'master' dan memilih 'Permintaan Baru' dan mencoba di kedua milik Anda dan commamds @ CRAFTYDBA. Kesalahan yang sama = [
Liondancer
1
Apakah Anda mencoba menghentikan dan memulai kembali basis data untuk mematikan koneksi yang ada? Anda juga dapat melihat di sini untuk
mengetahui
2
Klik kanan pada server di panel kiri dan klik 'Putus'. Pastikan Anda hanya memiliki satu tab SSMS terbuka di database Anda (klik kanan dan pilih 'Putuskan koneksi lain') dan kemudian jalankan pernyataan. Setiap tab dan objek explorer adalah koneksi; Anda hanya dapat memiliki satu koneksi yang terbuka ke database (karenanya, 'mode single-user'). Pengguna tunggal harus 'koneksi tunggal' :) Semoga beruntung
tommy_o
20
  1. Klik kanan basis data Anda di bagian basis data
  2. Pilih "Properti"
  3. Pilih halaman "Opsi"
  4. Gulir ke bawah "Opsi lain" dan ubah bidang "Batasi akses"

tangkapan layar halaman opsi dari sql server

Tomas
sumber
1
Solusi ini tidak akan berfungsi untuk saya di SQL Server 2016. Mencoba mengakses properti menunjukkan kesalahan bahwa database berada dalam mode pengguna tunggal dan sudah memiliki pengguna yang terhubung.
youcantryreachingme
15

Saya mencoba ini berfungsi

ALTER DATABASE dbName SET MULTI_USER WITH ROLLBACK IMMEDIATE
Elanchezhian Narayanasamy
sumber
8

Saya memiliki masalah yang sama, dan session_id untuk membunuh ditemukan menggunakan kueri ini:

Select request_session_id From sys.dm_tran_locks Where resource_database_id=DB_ID('BI_DB_Rep');
Geri Reshef
sumber
Ini sempurna. Menemukan SPID sial dan mendapatkan DB kembali online. Terimakasih banyak!
Russell Speight
8

Tekan CTRL + 1

temukan proses yang mengunci basis data Anda. Lihat di dbname kolom untuk db Anda dan perhatikan spid. Sekarang Anda harus menjalankan pernyataan itu:

kill <your spid>
ALTER DATABASE <your db> SET MULTI_USER;
greg121
sumber
CTRL + 1 adalah jalan pintas yang sangat berguna yang tidak saya ketahui!
Tyler Forsythe
7

Berikut ini bekerja untuk saya:

USE [master]
SET DEADLOCK_PRIORITY HIGH
exec sp_dboption '[StuckDB]', 'single user', 'FALSE';
ALTER DATABASE [StuckDB] SET MULTI_USER WITH NO_WAIT
ALTER DATABASE [StuckDB] SET MULTI_USER WITH ROLLBACK IMMEDIATE
Jesper Lehtinen
sumber
7

Pilihan lain adalah:

  • membuat database offline; dalam SMS, klik kanan basis data dan pilih Ambil Offline, centang 'Jatuhkan semua koneksi'
  • Lari ALTER DATABASE [Your_Db] SET MULTI_USER
testpattern
sumber
Milik saya tidak akan membiarkan saya menjadikannya offline, hanya terus mengatakan itu dalam mode pengguna tunggal dan bahwa pengguna terhubung! (ya, saya mencentang "jatuhkan semua koneksi"). Saya akhirnya memisahkan basis data!
TabbyCool
Saya harus menggunakan opsi ini karena tidak ada pengguna yang terhubung, dan perintah KILL tidak akan berfungsi pada koneksi sa.
Derek K
6

Untuk berjaga-jaga jika seseorang tersandung ke utas ini maka berikut ini adalah solusi anti peluru untuk SQL Server yang terjebak dalam MODE PENGGUNA TUNGGAL

- Dapatkan ID proses (spid) dari koneksi yang harus Anda bunuh
- Ganti 'DBName' dengan nama DB yang sebenarnya

SELECT sd.[name], sp.spid, sp.login_time, sp.loginame 
FROM sysprocesses sp 
INNER JOIN sysdatabases sd on sp.dbid = sd.dbid  
WHERE sd.[name] = 'DBName'

Sebagai alternatif, Anda juga dapat menggunakan perintah "sp_who" untuk mendapatkan "spid" dari koneksi terbuka:

- Atau gunakan SP ini sebagai gantinya

exec sp_who

- Kemudian Jalankan yang berikut dan ganti [spid] dan [DBName] dengan nilai yang benar

KILL SpidToKillGoesHere
GO

SET DEADLOCK_PRIORITY HIGH
GO

ALTER DATABASE [DBName] SET MULTI_USER WITH ROLLBACK IMMEDIATE
GO
Einar Larusson
sumber
Terima kasih atas info tambahannya, membuat perbedaan besar!
Daniel
5

Tidak yakin apakah ini membantu siapa pun, tetapi saya memiliki masalah yang sama dan tidak dapat menemukan proses yang menghambat saya. Saya menutup SSMS dan menghentikan semua layanan yang mengenai instance lokal. Kemudian begitu saya kembali dan menjalankan exec sp_who2, itu menunjukkan saya pelakunya. Saya mematikan proses dan bisa membuat Multi_User berfungsi, lalu restart layanan. Kami memiliki IIS memukulnya setiap beberapa menit / detik mencari paket tertentu.

Bindum
sumber
3

Saya mengalami masalah yang sama pagi ini. Ternyata menjadi masalah sederhana. Saya memiliki jendela permintaan terbuka yang diatur ke database pengguna tunggal di objek explorer. Prosedur tersimpan sp_who2 tidak menunjukkan koneksi. Setelah saya menutupnya, saya dapat mengaturnya

Mistik
sumber
3

Menambah jawaban Jespers , agar lebih efektif:

SET DEADLOCK_PRIORITY 10;-- Be the top dog.

SET DEADLOCK_PRIORITY HIGHpenggunaan DEADLOCK_PRIORITY5.

Apa yang terjadi adalah bahwa proses lain mendapatkan celah di database dan, jika proses Anda memiliki yang lebih rendah DEADLOCK_PRIORITY, maka itu kehilangan balapan.

Ini menghindarkan menemukan dan membunuh spid lain (yang mungkin perlu dilakukan beberapa kali).

Mungkin saja Anda perlu berlari ALTER DATABASElebih dari sekali, (tetapi Jesper melakukan itu). Kode yang dimodifikasi:

USE [master]
SET DEADLOCK_PRIORITY HIGH
exec sp_dboption '[StuckDB]', 'single user', 'FALSE';
ALTER DATABASE [StuckDB] SET MULTI_USER WITH NO_WAIT
ALTER DATABASE [StuckDB] SET MULTI_USER WITH ROLLBACK IMMEDIATE
Roy Latham
sumber
3

Gunakan Skrip ini

exec sp_who

Temukan dbname dan kolom spid

sekarang jalankan

kill spid 
go
ALTER DATABASE [DBName]
SET MULTI_USER;
Aminur Rahman
sumber
2

Hari ini saya menghadapi masalah yang sama di mana basis data saya diubah dari mode Multi User ke Single User dan ini akhirnya menghentikan saya untuk menerbitkan database.

Untuk memperbaiki masalah ini, saya harus menutup semua instance Visual Studio dan menjalankan perintah di bawah ini di jendela kueri Sql Server -

USE [Your_Database_Name]; ALTER DATABASE [Your_Database_Name] SET MULTI_USER GO

Perintah ini telah mengubah DB dari Satu pengguna ke Multi Pengguna dan setelah itu, saya berhasil menerbitkan.

Vivek
sumber
1

Bahkan saya menemukan masalah yang sama, tidak dapat menemukan koneksi aktif ke my_db untuk membunuhnya tetapi masih menunjukkan kesalahan yang sama. Saya akhirnya memutuskan semua koneksi SSMS yang mungkin untuk setiap database di Server, membuat koneksi baru dari SSMS dan mengubahnya ke Multi user.

-- Actual Code to change my_db to multi user mode
USE MASTER;
GO
ALTER DATABASE [my_db] SET MULTI_USER

Catatan: Tampaknya ini adalah bug yang mungkin di SQL Server 2005!

Vijred
sumber
1

Kami baru saja mengalami ini di SQL 2012. Proses replikasi melompat ketika kami membunuh sesi asli yang mengaturnya untuk satu pengguna. Tetapi sp_who2 tidak menunjukkan bahwa proses baru dilampirkan ke DB. Menutup SSMS dan membuka kembali kemudian memungkinkan kami untuk melihat proses ini pada database dan kemudian kami dapat membunuhnya dan segera beralih ke mode multi_user dan itu berhasil.

Saya tidak dapat menemukan logika di balik ini, tetapi tampaknya ada bug di SSMS dan masih memanifestasikan dirinya dalam SQL 2012.

Tuan McGoo
sumber
0

gunakan master

PERGILAH

pilih d.name, d.dbid, spid, login_time, nt_domain, nt_username, loginame dari sysprocesses p inner join sysdatabases d pada p.dbid = d.dbid mana d.name = 'nama basis data'

bunuh 568 - bunuh spid

ALTER DATABASE nama database '

SET MULTI_USER pergi

ARYA
sumber