SQL Server 2005 ของฉันไม่คืนค่าการสำรองข้อมูลเนื่องจากการเชื่อมต่อที่ใช้งานอยู่ ฉันจะบังคับมันได้อย่างไร
SQL Server 2005 ของฉันไม่คืนค่าการสำรองข้อมูลเนื่องจากการเชื่อมต่อที่ใช้งานอยู่ ฉันจะบังคับมันได้อย่างไร
คำตอบ:
เมื่อคุณคลิกขวาที่ฐานข้อมูลและคลิกTasks
จากนั้นคลิกDetach Database
มันจะแสดงกล่องโต้ตอบกับการเชื่อมต่อที่ใช้งานอยู่
โดยการคลิกที่ไฮเปอร์ลิงก์ภายใต้ "ข้อความ" คุณสามารถฆ่าการเชื่อมต่อที่ใช้งานอยู่
จากนั้นคุณสามารถฆ่าการเชื่อมต่อเหล่านั้นโดยไม่ต้องถอดฐานข้อมูล
อินเทอร์เฟซที่มีการเปลี่ยนแปลงสำหรับ SQL Server Management studio 2008 นี่คือขั้นตอน (ผ่าน: Tim Leung )
คุณต้องการตั้งค่า 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
ROLLBACK IMMEDIATE
ROLLBACK AFTER 60
วิธีเดียวที่จะบันทึกข้อมูลนั้นคือการสำรองข้อมูลอื่นหลังจากย้อนกลับ แต่คุณกำลังกู้คืนจากข้อมูลสำรองอื่น ดังนั้นประเด็นของการรอคืออะไร? ฉันพลาดอะไรไปรึเปล่า?
รหัสนี้ทำงานสำหรับฉันมันฆ่าการเชื่อมต่อที่มีอยู่ทั้งหมดของฐานข้อมูล สิ่งที่คุณต้องทำคือเปลี่ยนบรรทัด 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
หลังจากนี้ฉันสามารถกู้คืนได้
ลองสิ่งนี้:
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
การรีสตาร์ทเซิร์ฟเวอร์ SQL จะยกเลิกการเชื่อมต่อผู้ใช้ วิธีที่ง่ายที่สุดที่ฉันพบ - ดีเช่นกันหากคุณต้องการออฟไลน์เซิร์ฟเวอร์
แต่ด้วยเหตุผลที่แปลกประหลาดบางอย่างตัวเลือก 'ใช้ออฟไลน์' ไม่ได้ทำสิ่งนี้อย่างน่าเชื่อถือและสามารถวางหรือสร้างความสับสนให้กับคอนโซลการจัดการ รีสตาร์ทแล้วใช้งานออฟไลน์
บางครั้งตัวเลือกนี้เป็นตัวเลือก - ตัวอย่างเช่นถ้าคุณหยุดเว็บเซิร์ฟเวอร์ซึ่งเป็นที่มาของการเชื่อมต่อ
ฉันพบปัญหานี้ในขณะที่ดำเนินการคืนค่าอัตโนมัติใน 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
ด้วยวิธีนี้ฉันมั่นใจว่าไม่มีการเชื่อมต่อที่ถือฐานข้อมูลไว้ก่อนที่จะตั้งค่าเป็นโหมดเดียวเนื่องจากผู้ใช้เดิมจะหยุดถ้ามี
สิ่งเหล่านี้ไม่ทำงานสำหรับฉันไม่สามารถลบหรือตัดการเชื่อมต่อผู้ใช้ปัจจุบัน ยังไม่เห็นการเชื่อมต่อที่ใช้งานกับฐานข้อมูล การรีสตาร์ท SQL Server (คลิกขวาและเลือกรีสตาร์ท) อนุญาตให้ฉันทำ
หากต้องการเพิ่มคำแนะนำที่ได้ให้ไว้หากคุณมีเว็บแอปที่ทำงานผ่าน IIS ที่ใช้ฐานข้อมูลคุณอาจต้องหยุด (ไม่รีไซเคิล) กลุ่มแอพสำหรับแอปในขณะที่กู้คืนจากนั้นเริ่มใหม่อีกครั้ง การหยุดแอพพูลนั้นเป็นการปิดการเชื่อมต่อ http ที่แอ็คทีฟและไม่อนุญาตอีกต่อไปซึ่งอาจจบลงด้วยการอนุญาตให้มีการทริกเกอร์กระบวนการที่เชื่อมต่อและล็อกฐานข้อมูล นี่เป็นปัญหาที่ทราบตัวอย่างเช่นกับ Umbraco Content Management System เมื่อกู้คืนฐานข้อมูล
ไม่มีข้อใดถูกเลยสำหรับฉัน ฐานข้อมูลของฉันไม่แสดงการเชื่อมต่อที่ใช้งานอยู่โดยใช้ Activity Monitor หรือ sp_who ในที่สุดฉันก็ต้อง:
ไม่ใช่โซลูชันที่หรูหราที่สุด แต่ใช้งานได้และไม่ต้องรีสตาร์ท SQL Server (ไม่ใช่ตัวเลือกสำหรับฉันเนื่องจากเซิร์ฟเวอร์ DB โฮสต์ฐานข้อมูลอื่น ๆ )
ฉันชอบทำแบบนี้
แก้ไขชุดฐานข้อมูลออฟไลน์ด้วยการย้อนกลับทันที
จากนั้นคืนค่าฐานข้อมูลของคุณ หลังจากนั้น,
แก้ไขชุดฐานข้อมูลออนไลน์ด้วยการย้อนกลับทันที