เมื่อกู้คืนข้อมูลสำรองฉันจะยกเลิกการเชื่อมต่อที่ใช้งานอยู่ทั้งหมดได้อย่างไร


166

SQL Server 2005 ของฉันไม่คืนค่าการสำรองข้อมูลเนื่องจากการเชื่อมต่อที่ใช้งานอยู่ ฉันจะบังคับมันได้อย่างไร


คุณมักจะต้องการที่จะฆ่าทุกการเชื่อมต่อกับฐานข้อมูลที่คุณต้องการที่จะ "เรียกคืนกว่า"? หรือจะมีบางครั้งที่คุณไม่ต้องการที่จะฆ่าการเชื่อมต่อที่มีอยู่? นอกจากนี้คุณต้องกังวลเกี่ยวกับการรวมการเชื่อมต่อหรือไม่
Philip Kelley

คำตอบ:


177

SQL Server Management Studio 2005

เมื่อคุณคลิกขวาที่ฐานข้อมูลและคลิกTasksจากนั้นคลิกDetach Databaseมันจะแสดงกล่องโต้ตอบกับการเชื่อมต่อที่ใช้งานอยู่

แยกหน้าจอ

โดยการคลิกที่ไฮเปอร์ลิงก์ภายใต้ "ข้อความ" คุณสามารถฆ่าการเชื่อมต่อที่ใช้งานอยู่

จากนั้นคุณสามารถฆ่าการเชื่อมต่อเหล่านั้นโดยไม่ต้องถอดฐานข้อมูล

ข้อมูลเพิ่มเติมที่นี่

SQL Server Management Studio 2008

อินเทอร์เฟซที่มีการเปลี่ยนแปลงสำหรับ SQL Server Management studio 2008 นี่คือขั้นตอน (ผ่าน: Tim Leung )

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

21
หากคุณมีปัญหาเช่นเดียวกับ @Ryan อาจเป็นเพราะคุณใช้ Management Studio 2008 (หรือสูงกว่า) มากกว่า Management Studio 2005 หากต้องการทำสิ่งเดียวกันใน Management Studio 2008 ให้คลิกขวาที่เซิร์ฟเวอร์ของคุณใน Object Explorer และเลือก 'การตรวจสอบกิจกรรม' เมื่อสิ่งนี้เปิดขึ้นให้ขยายกลุ่มกระบวนการ ตอนนี้ใช้เมนูแบบเลื่อนลงเพื่อกรองผลลัพธ์ตามชื่อฐานข้อมูล ตอนนี้คุณสามารถปิดการเชื่อมต่อของคุณโดยเลือกตัวเลือก 'ฆ่ากระบวนการ' คลิกขวา
Tim Leung

195

คุณต้องการตั้งค่า db ของคุณเป็นโหมดผู้ใช้เดี่ยวทำการคืนค่าจากนั้นตั้งค่ากลับเป็นผู้ใช้หลายคน:

ALTER DATABASE YourDB
SET SINGLE_USER WITH
ROLLBACK AFTER 60 --this will give your current connections 60 seconds to complete

--Do Actual Restore
RESTORE DATABASE YourDB
FROM DISK = 'D:\BackUp\YourBaackUpFile.bak'
WITH MOVE 'YourMDFLogicalName' TO 'D:\Data\YourMDFFile.mdf',
MOVE 'YourLDFLogicalName' TO 'D:\Data\YourLDFFile.ldf'

/*If there is no error in statement before database will be in multiuser
mode.  If error occurs please execute following command it will convert
database in multi user.*/
ALTER DATABASE YourDB SET MULTI_USER
GO

การอ้างอิง: Pinal Dave ( http://blog.SQLAuthority.com )

การอ้างอิงอย่างเป็นทางการ: https://msdn.microsoft.com/en-us/library/ms345598.aspx


11
แทนที่จะออก ROLLBACK ทันทีอาจเกี่ยวข้องเฉพาะกับ ROLLBACK หลังจาก DELAY ที่เจาะจงเท่านั้นซึ่งจะทำให้ผู้ใช้มีโอกาสที่จะดำเนินการตามปกติ
John Sansom

2
จุดที่ดี, การปรับปรุงเพื่อย้อนกลับที่จะรวมคำสั่งหลังจาก 60 เพื่ออนุญาตให้มีคำสั่งในปัจจุบันเพื่อที่สมบูรณ์
เบรนแดน

สวัสดี @brendan จะเกิดอะไรขึ้นถ้าการย้อนกลับใช้เวลานานกว่า 60 วินาที ขอบคุณ
user3583912

11
หากคุณกำลังกู้คืนฐานข้อมูลการทำธุรกรรมเปิดจะหายไปไม่ว่าคุณหรือROLLBACK IMMEDIATE ROLLBACK AFTER 60วิธีเดียวที่จะบันทึกข้อมูลนั้นคือการสำรองข้อมูลอื่นหลังจากย้อนกลับ แต่คุณกำลังกู้คืนจากข้อมูลสำรองอื่น ดังนั้นประเด็นของการรอคืออะไร? ฉันพลาดอะไรไปรึเปล่า?
Dave Mason

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

43

รหัสนี้ทำงานสำหรับฉันมันฆ่าการเชื่อมต่อที่มีอยู่ทั้งหมดของฐานข้อมูล สิ่งที่คุณต้องทำคือเปลี่ยนบรรทัด Set @dbname = 'databaseName' เพื่อให้มีชื่อฐานข้อมูลของคุณ

Use Master
Go

Declare @dbname sysname

Set @dbname = 'databaseName'

Declare @spid int
Select @spid = min(spid) from master.dbo.sysprocesses
where dbid = db_id(@dbname)
While @spid Is Not Null
Begin
        Execute ('Kill ' + @spid)
        Select @spid = min(spid) from master.dbo.sysprocesses
        where dbid = db_id(@dbname) and spid > @spid
End

หลังจากนี้ฉันสามารถกู้คืนได้


1
นี่เป็นวิธีที่เร็วที่สุด (SingleUserMode * 20 = 60s, Kill * 20 = 5s)
Karson

มันไม่ได้ผลสำหรับฉัน ฐานข้อมูลยังใช้งานอยู่ ผมใช้ SQL Server 2008
มาเร็คบาร์

ฉันพบว่าใช้งานรหัสนั้นหลายครั้งหนึ่งต่อจากนั้นจะทำเคล็ดลับอย่างชัดเจน บางครั้งมีบางสิ่งแอบเข้ามาในระหว่างการสังหารและเรียกคืน และบางครั้งคุณต้องเรียกใช้ kill จากนั้นเรียกคืนหนึ่งทันที
John Waclawski

ขึ้นอยู่กับความก้าวร้าวของแอปพลิเคชันที่พยายามเชื่อมต่อใหม่ คู่ของผู้ใช้ที่ขี้เกียจ? ใช้งานได้ดี แอปเซิร์ฟเวอร์ปริมาณสูงที่เชื่อมต่อใหม่ภายในไม่กี่วินาที? ไม่มากนัก.
BradC

5

ลองสิ่งนี้:

DECLARE UserCursor CURSOR LOCAL FAST_FORWARD FOR
SELECT
    spid
FROM
    master.dbo.sysprocesses
WHERE DB_NAME(dbid) = 'dbname'--replace the dbname with your database
DECLARE @spid SMALLINT
DECLARE @SQLCommand VARCHAR(300)
OPEN UserCursor
FETCH NEXT FROM UserCursor INTO
    @spid
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @SQLCommand = 'KILL ' + CAST(@spid AS VARCHAR)
    EXECUTE(@SQLCommand)
    FETCH NEXT FROM UserCursor INTO
        @spid
END
CLOSE UserCursor
DEALLOCATE UserCursor
GO

4

การรีสตาร์ทเซิร์ฟเวอร์ SQL จะยกเลิกการเชื่อมต่อผู้ใช้ วิธีที่ง่ายที่สุดที่ฉันพบ - ดีเช่นกันหากคุณต้องการออฟไลน์เซิร์ฟเวอร์

แต่ด้วยเหตุผลที่แปลกประหลาดบางอย่างตัวเลือก 'ใช้ออฟไลน์' ไม่ได้ทำสิ่งนี้อย่างน่าเชื่อถือและสามารถวางหรือสร้างความสับสนให้กับคอนโซลการจัดการ รีสตาร์ทแล้วใช้งานออฟไลน์

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


+1 คำตอบที่ยอมรับจะไม่ทำงานสำหรับ SQL Express (เช่นในสภาพแวดล้อมการพัฒนา) เนื่องจาก SQL Express ไม่มีการตรวจสอบกิจกรรม
Matt Frear

1
@MattFrear: นี่ไม่เป็นความจริง! อย่างน้อยใน 2008 R2 Express ฉันเห็นปุ่มแถบเครื่องมือและรายการเมนูบริบทบนโหนดเซิร์ฟเวอร์
เตฟาน

4
การรีสตาร์ทเซิร์ฟเวอร์ SQL ทั้งหมดจะทำให้การเชื่อมต่อไปยังฐานข้อมูลทั้งหมดหมดลง เซิร์ฟเวอร์อาจสนับสนุนฐานข้อมูลจำนวนมาก แต่มีเพียงหนึ่งเดียวที่จำเป็นต้องกู้คืนในขณะนี้
Ross Presser

3
นี่เป็นวิธีที่แย่ที่สุดในการทำลายการเชื่อมต่อกับฐานข้อมูล 1 ตัว โดยเฉพาะอย่างยิ่งถ้าคุณมีฐานข้อมูลอื่น ๆ ที่ยังคงถูกใช้โดยผู้ใช้อื่น ฉันขอแนะนำต่อให้ใช้วิธีนี้ มันเป็น 100%, overkill ทั้งหมด !!
John Waclawski

@ JohnWaclawski ฉันไม่รู้เกี่ยวกับสิ่งที่แย่ที่สุด แต่ก็ขี้เกียจ - นั่นเป็นเหตุผลที่ฉันพูดบางครั้ง มันไม่ได้ช่วยประหยัดเวลาได้มากกว่าวิธีอื่น ๆ อยู่แล้ว
Simon_Weaver

3

ฉันพบปัญหานี้ในขณะที่ดำเนินการคืนค่าอัตโนมัติใน SQL Server 2008 โดยอัตโนมัติแนวทางของฉัน (successfull) คือการผสมผสานของสองคำตอบที่มีให้

ก่อนอื่นฉันจะพบการเชื่อมต่อทั้งหมดของฐานข้อมูลดังกล่าวและฆ่าพวกเขา

DECLARE @SPID int = (SELECT TOP 1 SPID FROM sys.sysprocess WHERE dbid = db_id('dbName'))
While @spid Is Not Null
Begin
        Execute ('Kill ' + @spid)
        Select @spid = top 1 spid from master.dbo.sysprocesses
        where dbid = db_id('dbName')
End

จากนั้นฉันจะตั้งฐานข้อมูลเป็นโหมด single_user

ALTER DATABASE dbName SET SINGLE_USER

จากนั้นฉันเรียกใช้การคืนค่า ...

RESTORE DATABASE and whatnot

ฆ่าการเชื่อมต่ออีกครั้ง

(same query as above)

และตั้งค่าฐานข้อมูลกลับเป็น multi_user

ALTER DATABASE dbName SET MULTI_USER

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


2

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


2

หากต้องการเพิ่มคำแนะนำที่ได้ให้ไว้หากคุณมีเว็บแอปที่ทำงานผ่าน IIS ที่ใช้ฐานข้อมูลคุณอาจต้องหยุด (ไม่รีไซเคิล) กลุ่มแอพสำหรับแอปในขณะที่กู้คืนจากนั้นเริ่มใหม่อีกครั้ง การหยุดแอพพูลนั้นเป็นการปิดการเชื่อมต่อ http ที่แอ็คทีฟและไม่อนุญาตอีกต่อไปซึ่งอาจจบลงด้วยการอนุญาตให้มีการทริกเกอร์กระบวนการที่เชื่อมต่อและล็อกฐานข้อมูล นี่เป็นปัญหาที่ทราบตัวอย่างเช่นกับ Umbraco Content Management System เมื่อกู้คืนฐานข้อมูล


1

ไม่มีข้อใดถูกเลยสำหรับฉัน ฐานข้อมูลของฉันไม่แสดงการเชื่อมต่อที่ใช้งานอยู่โดยใช้ Activity Monitor หรือ sp_who ในที่สุดฉันก็ต้อง:

  • คลิกขวาที่โหนดฐานข้อมูล
  • เลือก "แยก ... "
  • ทำเครื่องหมายที่ช่อง "วางการเชื่อมต่อ"
  • ใส่กลับเข้าไป

ไม่ใช่โซลูชันที่หรูหราที่สุด แต่ใช้งานได้และไม่ต้องรีสตาร์ท SQL Server (ไม่ใช่ตัวเลือกสำหรับฉันเนื่องจากเซิร์ฟเวอร์ DB โฮสต์ฐานข้อมูลอื่น ๆ )


นี่คือ overkill ทั้งหมด ใช้รหัส KILL ด้านบน ทำงานกับงานคืนค่าหลายร้อยสำหรับฉัน
John Waclawski

ฐานข้อมูลที่ฉันทำงานด้วยจะไม่ฆ่าทุกอย่าง - แต่อาจมีปัญหากับการตั้งค่าของพวกเขา ฉันเห็นด้วยที่ง่ายกว่าปกติมาก
Brent Wagoner

0

ฉันชอบทำแบบนี้

แก้ไขชุดฐานข้อมูลออฟไลน์ด้วยการย้อนกลับทันที

จากนั้นคืนค่าฐานข้อมูลของคุณ หลังจากนั้น,

แก้ไขชุดฐานข้อมูลออนไลน์ด้วยการย้อนกลับทันที

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