ออกจากโหมดผู้ใช้คนเดียว


208

ขณะนี้ฐานข้อมูลของฉันอยู่ในโหมดผู้ใช้คนเดียว เมื่อฉันพยายามขยายฐานข้อมูลฉันพบข้อผิดพลาด:

ไม่สามารถเข้าถึงฐานข้อมูล 'my_db' (ObjectExplorer)

นอกจากนี้เมื่อฉันพยายามลบฐานข้อมูลฉันได้รับข้อผิดพลาด:

การเปลี่ยนแปลงสถานะหรือตัวเลือกของฐานข้อมูล 'my_db' ไม่สามารถทำได้ในขณะนี้ ฐานข้อมูลอยู่ในโหมดผู้ใช้คนเดียวและผู้ใช้เชื่อมต่อกับมันในขณะนี้

ฉันจะออกจากโหมดผู้ใช้คนเดียวได้อย่างไร ฉันไม่มีผู้ใช้ที่ใช้ฐานข้อมูลนี้

เมื่อฉันพยายามเรียกดูไซต์ด้วย IIS ข้อผิดพลาดที่ฉันได้รับคือ:

ข้อยกเว้นที่ไม่สามารถจัดการได้ถูกสร้างขึ้นระหว่างการดำเนินการตามคำขอเว็บปัจจุบัน ข้อมูลเกี่ยวกับที่มาและตำแหน่งของข้อยกเว้นสามารถระบุได้โดยใช้การติดตามสแต็กข้อยกเว้นด้านล่าง

ฉันรู้สึกว่าโหมดผู้ใช้คนเดียวทำให้เกิดสิ่งนี้

คำตอบ:


381

โดยทั่วไปแล้ว SSMS จะใช้การเชื่อมต่อไปยังฐานข้อมูลเบื้องหลัง

คุณจะต้องฆ่าการเชื่อมต่อเหล่านี้ก่อนที่จะเปลี่ยนโหมดการเข้าถึง

ขั้นแรกตรวจสอบให้แน่ใจว่า object explorer ชี้ไปที่ฐานข้อมูลระบบเช่นมาสเตอร์

ขั้นที่สองรัน sp_who2 และค้นหาการเชื่อมต่อทั้งหมดไปยังฐานข้อมูล 'my_db' ฆ่าทุกการเชื่อมต่อด้วยการทำKILL { session id }ที่ id เซสชั่นเป็นรายการโดยSPIDsp_who2

ประการที่สามเปิดหน้าต่างแบบสอบถามใหม่

ดำเนินการรหัสต่อไปนี้

-- Start in master
USE MASTER;

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

ดูบทความบล็อกของฉันเกี่ยวกับการจัดการไฟล์ฐานข้อมูล สิ่งนี้เขียนขึ้นสำหรับการย้ายไฟล์ แต่การจัดการผู้ใช้เหมือนกัน


2
เมื่อฉันใช้คำสั่ง 'sp_who2' ฉันไม่เห็น DBName ใด ๆ ที่เชื่อมต่อกับ 'my_db' ฉันไม่ได้ฆ่าการเชื่อมต่อเหล่านั้น หลังจากที่ฉันรันคำสั่งฉันได้รับข้อผิดพลาดเดียวกัน = [: 'การเปลี่ยนแปลงสถานะหรือตัวเลือกของฐานข้อมูล' my_db 'ไม่สามารถทำได้ในเวลานี้ ฐานข้อมูลอยู่ในโหมดผู้ใช้คนเดียวและผู้ใช้เชื่อมต่อกับมันในขณะนี้ ข่าวสารเกี่ยวกับ 5069 ระดับ 16 สถานะ 1 บรรทัด 1 แก้ไขคำสั่งฐานข้อมูลล้มเหลว '
Liondancer

2
คุณแน่ใจหรือไม่ว่าคุณอยู่ในระดับผู้เชี่ยวชาญ sp_who2 ไม่แสดงแถวใด ๆ ที่มีฐานข้อมูล = my_db และวัตถุสำรวจของคุณไม่ได้อยู่ใน my_db
DBA CRAFTY

1
ลองยกเลิกการเชื่อมต่อและเชื่อมต่อ SSMS มีบางสิ่งที่จะต้องเชื่อมต่อกับฐานข้อมูลนั้น ตัวเลือกอื่นคือการเชื่อมต่อกับคอนโซลผู้ดูแลระบบเฉพาะ (DAC) สิ่งนี้ถือว่าคุณเป็นผู้ดูแลระบบ จากนั้นฆ่า spid ที่ละเมิด
DBA CRAFTY

1
นอกจากนี้ให้โหลดสคริปต์ usp_who2 ของฉันด้วย ( craftydba.com/wp-content/uploads/2011/09/usp-who2.txt ) ดำเนินการ มันวางยูทิลิตี้ใน msdb.dbo.usp_who2 มันบันทึกผลลัพธ์ของ sp_who2 ลงในตารางใน tempdb ภายใต้ ID ผู้ใช้ของคุณกรองตามชื่อฐานข้อมูล โพสต์ภาพของข้อผิดพลาดเพื่อช่วยให้เรามากขึ้น โชคดี.
DBA CRAFTY

3
ค้นหา SPID ใช้สิ่งต่อไปนี้: ฆ่า 100 100 คือจำนวนเซสชัน (SPID)
DBA CRAFTY

45

ก่อนอื่นให้ค้นหาและKILLกระบวนการทั้งหมดที่ทำงานอยู่ในปัจจุบัน

จากนั้นรันสิ่งต่อไปนี้T-SQLเพื่อตั้งค่าฐานข้อมูลในMULTI_USERโหมด

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

วิธีนี้จะไม่ทำงานกับฉันใน SQL Server 2016 ถ้าฉันค้นหา master..sysprocesses ฉันเห็นหลายแถวปรากฏขึ้น แต่จากนั้นแถวจะถูกแทนที่ด้วยข้อความแสดงข้อผิดพลาดว่าฐานข้อมูลที่กำหนดอยู่ในโหมดผู้ใช้เดี่ยวเป็นต้น
youcantryreachingme

@ycantryreachingme โปรดระบุข้อความแสดงข้อผิดพลาดที่คุณได้รับใน SQL Server 2016 ที่นี่ดังนั้นฉัน / คนอื่นจะสามารถช่วยคุณแก้ไขปัญหาได้
Sathish

เช่นเดียวกับใน OP: การเปลี่ยนแปลงสถานะหรือตัวเลือกของฐานข้อมูล 'my_db' ไม่สามารถทำได้ในขณะนี้ ฐานข้อมูลอยู่ในโหมดผู้ใช้คนเดียวและผู้ใช้เชื่อมต่อกับมันในขณะนี้
youcantryreachingme

25

หากต้องการเปลี่ยนจากโหมดผู้ใช้คนเดียวให้ลอง:

ALTER DATABASE [my_db] SET MULTI_USER

หากต้องการเปลี่ยนกลับไปเป็นโหมดผู้ใช้คนเดียวคุณสามารถใช้:

ALTER DATABASE [my_db] SET SINGLE_USER


1
ฉันได้รับข้อผิดพลาด: 'การเปลี่ยนแปลงสถานะหรือตัวเลือกของฐานข้อมูล' my_db 'ไม่สามารถทำได้ในขณะนี้ ฐานข้อมูลอยู่ในโหมดผู้ใช้คนเดียวและผู้ใช้เชื่อมต่อกับมันในขณะนี้ เกี่ยวกับข่าวสาร 5069 ระดับ 16 สถานะ 1 คำสั่งแก้ไขฐานข้อมูลบรรทัดที่ 1 ล้มเหลว '
Liondancer

1
คุณสามารถหยุดและรีสตาร์ทฐานข้อมูล (เห็นได้ชัดว่านี่ไม่ใช่ระบบการผลิตที่จะส่งผลกระทบต่อผู้ใช้รายอื่น) จากนั้นลองคำสั่งอีกครั้ง และในฐานะที่เป็น @CRAFTYDBA ระบุว่าคำสั่งควรดำเนินการจากฐานข้อมูลหลัก
rsbarro

1
ฉันขยาย 'ฐานข้อมูลระบบ' และคลิกขวา 'ต้นแบบ' และเลือก 'แบบสอบถามใหม่' และลองทั้งในของคุณและของ @ CRAFTYDBA commamds Same error = [
Liondancer

1
คุณลองหยุดและรีสตาร์ทฐานข้อมูลเพื่อหยุดการเชื่อมต่อที่มีอยู่หรือไม่? คุณสามารถดูวิธีเพิ่มเติมในการกำจัดการเชื่อมต่อกับฐานข้อมูลได้ที่นี่: stackoverflow.com/questions/11620/…
rsbarro

2
คลิกขวาที่เซิร์ฟเวอร์ในบานหน้าต่างด้านซ้ายและคลิก 'ยกเลิกการเชื่อมต่อ' ตรวจสอบให้แน่ใจว่าคุณมีแท็บ SSMS เพียงแท็บเดียวที่เปิดอยู่ในฐานข้อมูลของคุณ (คลิกขวาและเลือก 'ตัดการเชื่อมต่อการเชื่อมต่ออื่น ๆ ') จากนั้นดำเนินการคำสั่ง แต่ละแท็บและวัตถุสำรวจคือการเชื่อมต่อ คุณสามารถเปิดการเชื่อมต่อฐานข้อมูลได้เพียงครั้งเดียวเท่านั้น ('โหมดผู้ใช้คนเดียว' ผู้ใช้คนเดียวควรเป็น 'การเชื่อมต่อเดียว' :) ขอให้โชคดี
tommy_o

20
  1. คลิกขวาที่ฐานข้อมูลของคุณในส่วนฐานข้อมูล
  2. เลือก "Properties"
  3. เลือกหน้า "ตัวเลือก"
  4. เลื่อนลง "ตัวเลือกอื่น ๆ " และแก้ไขช่อง "จำกัด การเข้าถึง"

สกรีนช็อตของหน้าตัวเลือกของเซิร์ฟเวอร์ sql


1
โซลูชันนี้จะไม่ทำงานกับฉันใน SQL Server 2016 ความพยายามในการเข้าถึงคุณสมบัติแสดงข้อผิดพลาดว่าฐานข้อมูลอยู่ในโหมดผู้ใช้คนเดียวและมีผู้ใช้เชื่อมต่ออยู่แล้ว
youcantryreachingme


8

ฉันมีปัญหาเดียวกันและพบ session_id to kill โดยใช้แบบสอบถามนี้:

Select request_session_id From sys.dm_tran_locks Where resource_database_id=DB_ID('BI_DB_Rep');

มันสมบูรณ์แบบ พบ SPID ที่น่ารำคาญและรับ DB กลับมาออนไลน์ ขอบคุณมาก!
Russell Speight

8

กด CTRL + 1

ค้นหากระบวนการที่ล็อคฐานข้อมูลของคุณ ค้นหาในคอลัมน์ dbname สำหรับ db ของคุณและบันทึก spid ตอนนี้คุณต้องรันคำสั่งนั้น:

kill <your spid>
ALTER DATABASE <your db> SET MULTI_USER;

CTRL + 1 เป็นทางลัดที่มีประโยชน์มากที่ฉันไม่รู้!
Tyler Forsythe

7

การทำงานต่อไปนี้สำหรับฉัน:

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

7

ตัวเลือกอื่นคือ:

  • ใช้ฐานข้อมูลออฟไลน์ ใน SMSS คลิกขวาที่ฐานข้อมูลและเลือกใช้ออฟไลน์ทำเครื่องหมาย 'วางการเชื่อมต่อทั้งหมด'
  • วิ่ง ALTER DATABASE [Your_Db] SET MULTI_USER

ฉันจะไม่ให้ฉันทำแบบออฟไลน์มันแค่บอกว่ามันอยู่ในโหมดผู้ใช้คนเดียวและผู้ใช้เชื่อมต่อ! (ใช่ฉันเลือก "วางการเชื่อมต่อทั้งหมด") ลงเอยด้วยการถอดฐานข้อมูลแทน!
TabbyCool

ฉันต้องใช้ตัวเลือกนี้เนื่องจากไม่มีผู้ใช้เชื่อมต่อและคำสั่ง KILL จะไม่ทำงานในการเชื่อมต่อ sa
Derek K

6

ในกรณีที่มีคนสะดุดหัวข้อนี้นี่เป็นวิธีแก้ปัญหา bullet bullet เซิร์ฟเวอร์ SQL ติดอยู่ในโหมดผู้ใช้คนเดียว

- รับ ID กระบวนการ (spid) ของการเชื่อมต่อที่คุณต้องการฆ่า
- แทนที่ 'DBName' ด้วยชื่อจริงของ DB

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'

นอกจากนี้คุณยังสามารถใช้คำสั่ง“ sp_who” เพื่อรับ“ spid” ของการเชื่อมต่อแบบเปิด:

- หรือใช้ SP นี้แทน

exec sp_who

- จากนั้นดำเนินการดังต่อไปนี้และแทนที่ [spid] และ [DBName] ด้วยค่าที่ถูกต้อง

KILL SpidToKillGoesHere
GO

SET DEADLOCK_PRIORITY HIGH
GO

ALTER DATABASE [DBName] SET MULTI_USER WITH ROLLBACK IMMEDIATE
GO

ขอบคุณสำหรับข้อมูลเพิ่มเติมสร้างความแตกต่างใหญ่!
Daniel

5

ไม่แน่ใจว่าสิ่งนี้จะช่วยใครได้หรือไม่ แต่ฉันมีปัญหาเดียวกันและไม่สามารถหากระบวนการที่ทำให้ฉันหมดแรงได้ ฉันปิด SSMS และหยุดบริการทั้งหมดที่กดปุ่มอินสแตนซ์ในเครื่อง จากนั้นเมื่อฉันกลับเข้ามาและบริหาร exec sp_who2 มันแสดงให้ฉันเห็นว่าผู้กระทำผิด ฉันฆ่ากระบวนการและสามารถให้ Multi_User ทำงานจากนั้นเริ่มบริการใหม่ เราให้ IIS กดปุ่มมันทุกสองสามนาที / วินาทีเพื่อค้นหาแพคเกจบางอย่าง


3

เช้านี้ฉันพบปัญหาเดียวกัน มันกลายเป็นเรื่องง่าย ฉันเปิดหน้าต่างคิวรีที่ตั้งค่าเป็นฐานข้อมูลผู้ใช้เดียวใน object explorer กระบวนการ sp_who2 ที่เก็บไว้ไม่แสดงการเชื่อมต่อ เมื่อฉันปิดมันฉันก็สามารถตั้งค่าได้


3

การเพิ่มคำตอบ Jespersให้มีประสิทธิภาพยิ่งขึ้น:

SET DEADLOCK_PRIORITY 10;-- Be the top dog.

SET DEADLOCK_PRIORITY HIGHการใช้DEADLOCK_PRIORITY5

สิ่งที่เกิดขึ้นก็คือกระบวนการอื่น ๆ จะเกิดการแตกร้าวที่ฐานข้อมูลและหากกระบวนการของคุณต่ำกว่าDEADLOCK_PRIORITYนั้นก็จะเสียการแข่งขันไป

สิ่งนี้จะขัดขวางการค้นหาและฆ่า spid อื่น ๆ (ซึ่งอาจต้องทำหลายครั้ง)

เป็นไปได้ว่าคุณจะต้องวิ่งALTER DATABASEมากกว่าหนึ่งครั้ง (แต่ Jesper ทำเช่นนั้น) รหัสที่แก้ไข:

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

3

ใช้สคริปต์นี้

exec sp_who

ค้นหาคอลัมน์ dbname และ spid

ตอนนี้รัน

kill spid 
go
ALTER DATABASE [DBName]
SET MULTI_USER;

2

วันนี้ฉันประสบปัญหาเดียวกันกับที่ฐานข้อมูลของฉันเปลี่ยนจากโหมดผู้ใช้หลายคนเป็นโหมดผู้ใช้เดี่ยวและในที่สุดก็หยุดฉันในการเผยแพร่ฐานข้อมูล

เพื่อแก้ไขปัญหานี้ฉันต้องปิดอินสแตนซ์ Visual Studio ทั้งหมดและเรียกใช้คำสั่งด้านล่างในหน้าต่างแบบสอบถาม SQL Server -

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

คำสั่งนี้เปลี่ยน DB จากผู้ใช้คนเดียวเป็นผู้ใช้หลายคนและหลังจากนั้นฉันก็สามารถเผยแพร่ได้สำเร็จ


1

แม้ว่าฉันจะเจอปัญหาเดียวกัน แต่ไม่สามารถค้นหาการเชื่อมต่อที่ใช้งานกับ my_db เพื่อฆ่าได้ แต่ยังคงแสดงข้อผิดพลาดเดียวกัน ฉันสิ้นสุดการยกเลิกการเชื่อมต่อการเชื่อมต่อ SSMS ที่เป็นไปได้ทั้งหมดสำหรับฐานข้อมูลใด ๆ บนเซิร์ฟเวอร์สร้างการเชื่อมต่อใหม่จาก SSMS และเปลี่ยนเป็นผู้ใช้หลายคน

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

หมายเหตุ: นี่เป็นข้อผิดพลาดที่เป็นไปได้ใน SQL Server 2005!


1

เราเพิ่งพบสิ่งนี้ใน SQL 2012 กระบวนการจำลองแบบเพิ่มขึ้นเมื่อเราฆ่าเซสชันดั้งเดิมที่ตั้งค่าเป็นผู้ใช้คนเดียว แต่ sp_who2 ไม่ได้แสดงว่ากระบวนการใหม่ที่แนบมากับฐานข้อมูล การปิด SSMS และเปิดใหม่อีกครั้งทำให้เราเห็นกระบวนการนี้ในฐานข้อมูลจากนั้นเราสามารถฆ่ามันและเปลี่ยนเป็นโหมด multi_user ได้ทันทีและใช้งานได้

ฉันไม่สามารถหาตรรกะที่อยู่เบื้องหลังสิ่งนี้ได้ แต่ดูเหมือนจะเป็นข้อผิดพลาดใน SSMS และยังคงปรากฏตัวใน SQL 2012


0

ใช้ต้นแบบ

ไป

เลือก d.name, d.dbid, spid, login_time, nt_domain, nt_username, loginame จาก sysprocesses p ภายในเข้าร่วม sysdatabase d บน p.dbid = d.dbid โดยที่ d.name = 'ชื่อฐานข้อมูล'

kill 568 - ฆ่า spid

แก้ไขฐานข้อมูลชื่อฐานข้อมูล '

SET MULTI_USER ไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.