วิธีการวางฐานข้อมูลในโหมด Single_User


12

ฉันจะวางฐานข้อมูลที่แสดงDatabaseName (Single User)เป็นชื่อได้อย่างไร

เมื่อฉันพยายามลบฉันได้รับข้อผิดพลาดต่อไปนี้:

การแก้ไขล้มเหลวสำหรับฐานข้อมูล 'DatabaseName' (Microsoft.SqlServer.Smo)

คำสั่งเปลี่ยนแปลงฐานข้อมูลล้มเหลว (Microsoft SQL Server ข้อผิดพลาด: 5064)

ฉันพยายามที่จะดำเนินการALTERด้านล่างและยังมีปัญหาเดียวกัน

ALTER DATABASE [DatabaseName] SET MULTI_USER WITH NO_WAIT

คำตอบ:


23

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

เหตุผลคุณต้องใส่ฐานข้อมูลกลับสู่โหมด multi_user เพื่อให้คุณสามารถใส่ลงในโหมด single_user อีกครั้ง (แต่คราวนี้คุณจะสามารถควบคุมการเชื่อมต่อเดียวที่อนุญาตและวางฐานข้อมูลก่อนที่จะเชื่อมต่ออย่างอื่น) แล้วฐานข้อมูลของคุณจะ หายไป

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

-- Then attempt to take your database to multi_user mode, do this from master
USE MASTER 
GO

ALTER DATABASE myDatabaseName 
SET multi_user WITH ROLLBACK IMMEDIATE
GO

-- Now put it into single_user mode and drop it. Use Rollback Immediate to disconnect any sessions and rollback their transactions. Safe since you are about to drop the DB.
ALTER DATABASE myDatabaseName
SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO

DROP DATABASE myDatabaseName
GO

โซลูชันนี้จะไม่ทำงานหากฐานข้อมูลอยู่ในโหมดผู้ใช้คนเดียวอยู่แล้วและคุณพยายามเข้าถึงจากการเชื่อมต่ออื่น
Maxim Paukov

4
ใช่แล้ว Maxim - นั่นคือเหตุผลที่ฉันพูดว่าข้อสันนิษฐานของฉันที่นี่ตามข้อมูลที่ให้ไว้และคำตอบของตัวเองของ OPs คืออันที่มีการเชื่อมต่อแบบเปิดอาจผ่าน Object explorer หรือหน้าต่างแบบสอบถาม ... ถ้ามันเปิดด้วยวิธีอื่น ผู้ใช้รายอื่นคุณจะต้องพบว่ามีการเชื่อมต่อหนึ่งรายการที่ขโมยการเชื่อมต่อเดียวที่ได้รับอนุญาตและจากนั้นฆ่าเซสชันของการเชื่อมต่อที่หนึ่งแล้วทำตามขั้นตอนที่อธิบายไว้ด้านบน ..
Mike Walsh

13

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

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

แบบสอบถามต่อไปฆ่ากระบวนการการเข้าถึงฐานข้อมูล:

-- Create the sql to kill the active database connections  
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)
GO

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

ALTER DATABASE 'DatabaseName' SET MULTI_USER

2
นี่เป็นวิธีแก้ปัญหาที่ยุ่งยากและมีค่าเท่ากับเกมที่น่าผิดหวังของการตีตัวตุ่นบนระบบที่วุ่นวาย หากต้องการให้ผู้ใช้ทั้งหมดออกไปใช้งานง่ายขึ้นมากALTER DATABASE SET SINGLE_USER WITH ROLLBACK IMMEDIATEตามคำตอบของไมค์
แอรอนเบอร์ทรานด์ด์

1
@AaronBertrand โซลูชันของ Mike จะไม่ทำงานหากฐานข้อมูลอยู่ในโหมดผู้ใช้คนเดียวแล้วและคุณพยายามเข้าถึงจากการเชื่อมต่ออื่น
Maxim Paukov

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