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


189

ความต้องการความช่วยเหลือผมด้วยการตั้งค่าฐานข้อมูลที่ได้รับการบูรณะในโหมดSINGLE_USER MULTI_USERทุกครั้งที่ฉันวิ่ง

ALTER DATABASE BARDABARD
SET MULTI_USER;
GO

ฉันได้รับข้อผิดพลาดนี้:

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

ฐานข้อมูลอยู่ในโหมดผู้ใช้คนเดียวและผู้ใช้เชื่อมต่อกับมันในขณะนี้

ต้องอยู่ในSINGLE_USERโหมดที่ไม่ใช่เพื่อตั้งเป็นโหมดอื่น แต่ฉันไม่สามารถตั้งค่าฐานข้อมูลในโหมดอื่นใด ๆ ในขณะที่มันเป็นSINGLE_USERโหมด

คำตอบ:


114

“ ผู้ใช้เชื่อมต่อกับมันในขณะนี้” อาจเป็นหน้าต่างของ SQL Server Management Studio ลองเลือกฐานข้อมูลหลักและเรียกใช้ALTERแบบสอบถามอีกครั้ง


1
การเพิ่มในสิ่งนี้: ปรากฏว่าหน้าต่างแบบสอบถามอาจถูกแนบกับฐานข้อมูลแม้ว่าจะมีการเลือกฐานข้อมูลอื่น (เช่นmaster) ในแถบเครื่องมือฐานข้อมูลที่พร้อมใช้งานแบบหล่นลงเมื่อหน้าต่างแบบสอบถามเปิดใช้งานอยู่ หากยังคงทำให้คุณปวดหัวอยู่ให้ปิดหน้าต่างคิวรีอื่นทั้งหมดแล้วเลือกฐานข้อมูลระบบที่ไร้เดียงสาเช่นmasterหรือtempdbในเมนูแบบเลื่อนลงในหน้าต่างเดียวที่คุณทิ้งไว้
CVn

ลองยกเลิกการเชื่อมต่อฐานข้อมูลและเชื่อมต่ออีกครั้งในสตูดิโอการจัดการเซิร์ฟเวอร์ Microsoft microsoft จากนั้นรันคำสั่งอีกครั้ง
Isuru Madusanka

ความคิดเห็นแรกมีประโยชน์มากและสามารถเพิ่มในคำตอบได้จริง ฉันไม่สามารถเรียกใช้คิวรีก่อนที่จะปิดคิวรีอื่นทั้งหมด
user2216

88

โดยทั่วไปแล้วข้อความแสดงข้อผิดพลาดหมายความว่ามีกระบวนการอื่นที่เชื่อมต่อกับฐานข้อมูล ลองใช้วิธีนี้เพื่อดูว่ามีการเชื่อมต่อใด:

exec sp_who

ซึ่งจะส่งคืนกระบวนการและจากนั้นคุณควรจะสามารถเรียกใช้:

kill [XXX]

ที่ [xxx] เป็นspidกระบวนการที่คุณพยายามฆ่า

จากนั้นคุณสามารถเรียกใช้คำสั่งด้านบนของคุณ

โชคดี.


kill [xxx] กำจัดกระบวนการ แต่เมื่อฉันพยายามเรียกใช้คำสั่งมันจะกลับมา!
colmde

74

คุณสามารถเพิ่มตัวเลือกในการย้อนการเปลี่ยนแปลงของคุณได้ทันที

ALTER DATABASE BARDABARD
SET MULTI_USER
WITH ROLLBACK IMMEDIATE
GO

1
ทำอะไรROLLBACK IMMEDIATEกันแน่
dakab

3
@dakab บังคับให้ธุรกรรมที่ค้างอยู่ทั้งหมดย้อนกลับทันทีเมื่อเริ่มต้นALTER DATABASEธุรกรรมของคำสั่งซึ่งตรงข้ามกับWITH ROLLBACK X SECONDSที่รอให้ธุรกรรมเสร็จสิ้นก่อนที่จะบังคับให้ยกเลิกหรือรออย่างไม่มีกำหนดจนกว่าจะไม่มีธุรกรรมที่รอดำเนินการ (ซึ่งฉันเชื่อว่าเป็นค่าเริ่มต้น ดูเหมือนจะไม่พบเอกสารในขณะนี้) มันเทียบเท่ากับ "หยุดทุกสิ่งที่คุณทำในขณะนี้และทำสิ่งนี้"
เบคอน Bits

39

SQL Server 2012:

คลิกขวาที่DB > Properties > Options > [Scroll down] State > RestrictAccess > select Multi_userและคลิกตกลง

Voila!


5
ไม่จริงนี่คือสิ่งที่ฉันได้รับเมื่อพยายามแก้ไขปัญหาของคุณ: / "ฐานข้อมูล 'XXX' เปิดอยู่แล้วและสามารถมีผู้ใช้ได้ครั้งละหนึ่งคนเท่านั้น (Microsoft SQL Server, ข้อผิดพลาด: 924)"
Krzysztof Wolny

1
ได้รับการยืนยันเพิ่มเติมใน SQL 2008R2
codo-sapien

คำตอบที่ดีที่สุดทำงานได้แม้ในกรณีที่คุณไม่ได้รับอนุญาตให้ใช้คำสั่ง KILL
Marco Marsala

22

ฉันมีปัญหาเดียวกันและแก้ไขตามขั้นตอนต่อไปนี้ - การอ้างอิง: http://giladka8.blogspot.com.au/2011/11/database-is-in-single-user-mode-and-.html

use master
GO

select 
    d.name, 
    d.dbid, 
    spid, 
    login_time, 
    nt_domain, 
    nt_username, 
    loginame
from sysprocesses p 
    inner join sysdatabases d 
        on p.dbid = d.dbid
where d.name = 'dbname'
GO

kill 56 --=> kill the number in spid field
GO

exec sp_dboption 'dbname', 'single user', 'FALSE'
GO

13

มันใช้ได้ดีสำหรับฉัน

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

ขั้นตอนที่ 2.

USE [master];
GO
ALTER DATABASE [YourDatabaseNameHere] SET MULTI_USER WITH NO_WAIT;
GO  

และรีเฟรชฐานข้อมูล


9

ที่จริงฉันมีปัญหาที่ db ของฉันถูกล็อคโดยกระบวนการและสภาพการแข่งขันกับพวกเขาตอนที่ฉันได้รับคำสั่งหนึ่งครั้งดำเนินการรีเฟรชและพวกเขาล็อคอีกครั้ง ... ฉันต้องเรียกใช้คำสั่งต่อไปนี้กลับไปด้านหลัง ใน SSMS และให้ฉันออฟไลน์และจากที่นั่นฉันทำการกู้คืนและกลับมาออนไลน์ได้ดีคำถามสองข้อที่:

วิ่งครั้งแรก:

USE master
GO

DECLARE @kill varchar(8000) = '';
SELECT @kill = @kill + 'kill ' + CONVERT(varchar(5), spid) + ';'
FROM master..sysprocesses 
WHERE dbid = db_id('<yourDbName>')

EXEC(@kill);

จากนั้นทันทีหลังจาก (ในหน้าต่างแบบสอบถามที่สอง):

USE master ALTER DATABASE <yourDbName> SET OFFLINE WITH ROLLBACK IMMEDIATE

ทำในสิ่งที่ฉันต้องการแล้วนำกลับมาออนไลน์ ขอบคุณทุกคนที่เขียนชิ้นส่วนเหล่านี้ออกมาเพื่อให้ฉันได้รวบรวมและแก้ไขปัญหาของฉัน


7

อาจเป็นการดีที่สุดที่จะเข้าสู่เซิร์ฟเวอร์โดยตรงแทนที่จะใช้ SQL Management Studio

ตรวจสอบให้แน่ใจว่าบัญชีที่คุณเข้าสู่ระบบเป็น dbowner สำหรับฐานข้อมูลที่คุณต้องการตั้งค่าเป็น MULTI_USER เข้าสู่ระบบในชื่อ sa (โดยใช้การพิสูจน์ตัวจริงของเซิร์ฟเวอร์ SQL) ถ้าทำได้

หาก IIS ใช้ฐานข้อมูลของคุณให้หยุดเว็บไซต์และแอพพลิเคชั่นที่ใช้งาน - นี่อาจเป็นกระบวนการที่เชื่อมต่อและบล็อกคุณไม่ให้ตั้งค่าเป็น MULTI_USER

USE MASTER
GO

-- see if any process are using *your* database specifically

SELECT * from master.sys.sysprocesses
WHERE spid > 50 -- process spids < 50 are reserved by SQL - we're not interested in these
AND dbid=DB_ID ('YourDbNameHere')

-- if so, kill the process:

KILL n -- where 'n' is the 'spid' of the connected process as identified using query above

-- setting database to read only isn't generally necessary, but may help:

ALTER DATABASE YourDbNameHere
SET READ_ONLY;
GO

-- should work now:

ALTER DATABASE Appswiz SET MULTI_USER WITH ROLLBACK IMMEDIATE

อ้างอิงที่นี่หากคุณยังมีปัญหา:

http://www.sqlservercentral.com/blogs/pearlknows/2014/04/07/help-im-stuck-in-single-user-mode-and-can-t-get-out/

เป็นทางเลือกสุดท้าย - หากคุณลองทุกอย่างด้านบนและคุณหมดหวังคุณสามารถลองหยุดอินสแตนซ์ของเซิร์ฟเวอร์ SQL และเริ่มต้นใหม่อีกครั้ง


5

ฉันเพิ่งแก้ไขโดยใช้ขั้นตอนต่อไปนี้อาจช่วยคุณได้

ขั้นตอนที่ 1

คลิกขวาที่ฐานข้อมูลผู้ใช้เดียว


ขั้นตอนที่ 2

ออฟไลน์


ขั้นตอนที่ 3

วางการเชื่อมต่อและออฟไลน์


ขั้นตอนที่: 4

ใช้ออนไลน์


ขั้นตอน: 5

จากนั้นเรียกใช้แบบสอบถามต่อไปนี้

ALTER DATABASE YourDBName
SET MULTI_USER
WITH ROLLBACK IMMEDIATE
GO

สนุก...!


2

รหัสด้านล่างใช้ได้กับฉันเมื่อฉันไม่ทราบ SPID เฉพาะที่ใช้ในการเปลี่ยนเป็นsingleuserโหมด

use master
GO

select 
    d.name, 
    d.dbid, 
    spid, 
    login_time, 
    nt_domain, 
    nt_username, 
    loginame
from sysprocesses p 
    inner join sysdatabases d 
        on p.dbid = d.dbid
where d.name = 'dbname'
GO

kill 52 -- kill the number in spid field
GO

exec sp_dboption 'dbname', 'single user', 'FALSE'
GO

1
  1. ความพยายามทุกอย่างใช้งานไม่ได้
  2. ลงชื่อเข้าใช้เซิร์ฟเวอร์นั้นจากระยะไกลเนื่องจากเราจะฆ่าการเชื่อมต่อทั้งหมด
  3. เรียกใช้รหัสด้านล่างมากกว่าหนึ่งครั้งจนกระทั่งมันกลับมาเสร็จสมบูรณ์และไม่มีการทดสอบ "กระบวนการฆ่า" อีกต่อไป
  4. เปิดใช้งานอีกครั้งโดยใช้รหัสด้านล่างรหัสด้านล่าง

ใช้ master GO ประกาศ @sql เป็น varchar (20), @spid เป็น int

เลือก @spid = min (spid) จาก master..sysprocesses โดยที่ dbid = db_id ('DB_NAME') และ spid! = @@ spid

ในขณะที่ (@spid ไม่เป็นโมฆะ) ให้เริ่มพิมพ์ 'กระบวนการฆ่า' + นำแสดงโดย (@spid as varchar) + '... ' set @sql = 'kill' + นำแสดงโดย (@spid เป็น varchar) exec (@sql)

select 
    @spid = min(spid)  
from 
    master..sysprocesses  
where 
    dbid = db_id('DB_NAME') 
    and spid != @@spid end

จากนั้นนำมันกลับมามีชีวิตอีกครั้ง

แก้ไขฐานข้อมูล DB_NAME SET MULTI_USER ไป


1

มันใช้ได้ดีสำหรับฉัน

  1. ทำการสำรองข้อมูล
  2. สร้างฐานข้อมูลใหม่และกู้คืนข้อมูลสำรอง
  3. จากนั้นคุณสมบัติ> ตัวเลือก> [เลื่อนลง] สถานะ> RestrictAccess> เลือก Multi_user และคลิกตกลง
  4. ลบฐานข้อมูลเก่า

หวังว่านี่จะใช้ได้ผลกับทุกคนขอบคุณ Ramesh Kumar


1

หากข้อมูลด้านบนใช้ไม่ได้ให้ค้นหาชื่อเข้าสู่ระบบของ spid และปิดการใช้งานในการรักษาความปลอดภัย - เข้าสู่ระบบ


1

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

USE [master];
GO
ALTER DATABASE [tuncayoto] SET MULTI_USER WITH NO_WAIT;
GO 

ทำทุกอย่างให้ f5 wolla โอเค!


0

ฉันแก้ไขปัญหาได้อย่างง่ายดาย

  1. คลิกขวาที่ชื่อฐานข้อมูลเปลี่ยนชื่อ

  2. หลังจากเปลี่ยนให้คลิกขวาที่ชื่อฐานข้อมูล -> Properties -> options -> ไปที่ด้านล่างของการเลื่อน RestrictAccess (SINGLE_USER ถึง MULTI_USER)

  3. ตอนนี้อีกครั้งคุณสามารถเปลี่ยนชื่อฐานข้อมูลเป็นชื่อเก่าของคุณ


0

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

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


0

เพียงไปที่คุณสมบัติของฐานข้อมูล และเปลี่ยนโหมดผู้ใช้คนเดียวเป็นผู้ใช้หลายคน

ป้อนคำอธิบายรูปภาพที่นี่

หมายเหตุ: ถ้ามันไม่ทำงานสำหรับคุณให้ทำการสำรองข้อมูล Db และกู้คืนอีกครั้งและทำวิธีการข้างต้นอีกครั้ง

* Single = SINGLE_USER

หลาย = MULTI_USER

จำกัด = RESTRICTED_USER


สิ่งนี้แตกต่างจาก OP การสืบค้นอย่างไร
Squazz

ใช่ทั้งสองจะทำงานเหมือนกันเหมือนกันแทนที่จะใช้ CREATE Table เคียวรีเราใช้ sql server GUI Table Designer เพื่อสร้าง Table, BTS ทั้งสองจะทำงานเหมือนกันหนึ่งคือวิธีการสืบค้นและอื่น ๆ คือวิธี GUI ใช้สิ่งที่คุณชอบ
Hassan Saeed

OP ระบุไว้อย่างชัดเจนว่าข้อความค้นหา hes มีข้อผิดพลาด ในขณะที่คุณกำลังบอกว่านี่เป็นสิ่งเดียวกับที่ใช้แบบสอบถามที่คุณไม่ได้ให้คำตอบเลยคุณเพียงแค่เพิ่มและเติมคำตอบที่ผิดจำนวนมากที่นี่
Squazz

0

หลังจากเข้าสู่โหมดผู้ใช้คนเดียวไคลเอนต์สามารถสร้างการเชื่อมต่อหนึ่งเดียวกับ SQL Server ได้โปรดจำไว้ว่า "Object Explorer" ใช้การเชื่อมต่อ (แยกต่างหาก) ดังนั้นหากคุณพยายามเรียกใช้คำสั่ง Multi-User ในแบบสอบถาม หน้าต่างคุณจะได้รับข้อผิดพลาดในโหมดผู้ใช้คนเดียวคุณไม่สามารถสร้างการเชื่อมต่ออื่น

สำหรับฉันนี่ไม่ใช่ปัญหา แต่ในกรณีของฉันมีกระบวนการอัตโนมัติไม่กี่กระบวนการที่ไม่หยุดหย่อน (ในทุกสองสามวินาที) ที่สร้างการเชื่อมต่อดังนั้นทันทีที่ฉันนำ DB เข้าสู่โหมดผู้ใช้คนเดียวและตัดการเชื่อมต่อตัวเองหนึ่งใน กระบวนการที่สร้างขึ้น / ครอบครองการเชื่อมต่อ (ก่อนที่ฉันจะเริ่มการดำเนินการกู้คืนของฉัน) ทันทีที่ฉันฆ่าการเชื่อมต่อเหล่านั้น - พวกเขาจะเชื่อมต่อใหม่และเมื่อฉันเรียกใช้คำสั่งกู้คืนฉันจะได้รับข้อผิดพลาดว่าการเชื่อมต่อถูกครอบครองอยู่แล้ว

เพื่อแก้ไขปัญหานี้ฉันต้องเขียนkillคำสั่งเปลี่ยนUser-Modeคำสั่งและRestoreการดำเนินการทั้งหมดในหน้าต่างแบบสอบถามหนึ่งและเมื่อฉันวิ่งพวกเขาทั้งหมดในครั้งเดียว voila !!! มันทำงานได้

หวังว่านี่จะช่วยผู้อื่น


0

ฉันมีปัญหากับฐานข้อมูลท้องถิ่น

ฉันสามารถแก้ปัญหานี้ได้โดยหยุดเซิร์ฟเวอร์ SQL จากนั้นเริ่มเซิร์ฟเวอร์ SQL จากนั้นใช้ SSMS UI เพื่อเปลี่ยนคุณสมบัติฐานข้อมูลเป็น Multi_User

ฐานข้อมูลเข้าสู่โหมด "ผู้ใช้คนเดียว" เมื่อฉันพยายามกู้คืนการสำรองข้อมูล ฉันไม่ได้สร้างการสำรองข้อมูลของฐานข้อมูลเป้าหมายก่อนที่จะพยายามกู้คืน (SQL 2017) คุณจะได้รับทุกครั้ง

หยุด SQL Server เริ่ม SQL Server จากนั้นเรียกใช้สคริปต์ข้างต้นหรือใช้ UI


0

ฉันไปหาทางแก้ปัญหาอยู่พักหนึ่งแล้วก็หาทางแก้ปัญหาด้านล่าง

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

คุณจะต้องฆ่าการเชื่อมต่อเหล่านี้ก่อนที่จะเปลี่ยนโหมดการเข้าถึง (ฉันได้ทำกับEXEC (@kill);ในเทมเพลตรหัสด้านล่าง)

จากนั้น

เรียกใช้ 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

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

ALTER DATABASE [<Your_DB_Name>] SET SINGLE_USER

สิ่งนี้น่าจะใช้ได้ การเข้ารหัสที่มีความสุข !!

ขอบคุณ !!

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