SQL Server 2005 của tôi không khôi phục bản sao lưu do các kết nối hoạt động. Làm thế nào tôi có thể buộc nó?
SQL Server 2005 của tôi không khôi phục bản sao lưu do các kết nối hoạt động. Làm thế nào tôi có thể buộc nó?
Câu trả lời:
Khi bạn nhấp chuột phải vào một cơ sở dữ liệu và nhấp vào Tasks
và sau đó nhấp vào Detach Database
, nó sẽ trả về một hộp thoại với các kết nối hoạt động.
Bằng cách nhấp vào liên kết trong "Tin nhắn", bạn có thể tắt các kết nối đang hoạt động.
Sau đó, bạn có thể hủy các kết nối đó mà không cần tách cơ sở dữ liệu.
Thêm thông tin ở đây .
Giao diện đã thay đổi cho SQL Server Management studio 2008, đây là các bước (thông qua: Tim Leung )
Bạn muốn đặt db của mình thành chế độ người dùng, thực hiện khôi phục, sau đó đặt lại thành nhiều người dùng:
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
Tham khảo: Pinal Dave ( http://blog.SQLAuthority.com )
Tài liệu tham khảo chính thức: https://msdn.microsoft.com/en-us/l Library / ms345598.aspx
ROLLBACK IMMEDIATE
hay ROLLBACK AFTER 60
. Cách duy nhất để lưu dữ liệu đó là thực hiện sao lưu khác sau khi khôi phục. Nhưng bạn đang khôi phục từ một bản sao lưu khác. Vì vậy, những gì đang chờ đợi? Tui bỏ lỡ điều gì vậy?
Mã này làm việc cho tôi, nó giết tất cả các kết nối hiện có của cơ sở dữ liệu. Tất cả những gì bạn phải làm là thay đổi dòng Set @dbname = 'databaseName' để nó có tên cơ sở dữ liệu của bạn.
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
sau này tôi đã có thể khôi phục nó
Thử cái này:
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
Khởi động lại máy chủ SQL sẽ ngắt kết nối người dùng. Cách dễ nhất tôi đã tìm thấy - cũng tốt nếu bạn muốn đưa máy chủ ngoại tuyến.
Nhưng đối với một số lý do rất nghiêm trọng, tùy chọn 'Take Offline' không làm điều này một cách đáng tin cậy và có thể treo hoặc nhầm lẫn bảng điều khiển quản lý. Khởi động lại sau đó lấy tác phẩm ngoại tuyến
Đôi khi, đây là một tùy chọn - ví dụ: nếu bạn đã dừng một máy chủ web là nguồn của các kết nối.
Tôi đã gặp vấn đề này trong khi tự động hóa một bộ xử lý khôi phục trong SQL Server 2008. Cách tiếp cận (thành công) của tôi là sự kết hợp của hai trong số các câu trả lời được cung cấp.
Đầu tiên, tôi chạy qua tất cả các kết nối của cơ sở dữ liệu đã nói và giết chúng.
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
Sau đó, tôi đặt cơ sở dữ liệu sang chế độ single_user
ALTER DATABASE dbName SET SINGLE_USER
Sau đó, tôi chạy khôi phục ...
RESTORE DATABASE and whatnot
Giết các kết nối một lần nữa
(same query as above)
Và đặt cơ sở dữ liệu trở lại multi_user.
ALTER DATABASE dbName SET MULTI_USER
Bằng cách này, tôi đảm bảo rằng không có kết nối nào giữ cơ sở dữ liệu trước khi cài đặt ở chế độ đơn, vì trước đây sẽ đóng băng nếu có.
Không ai trong số này làm việc cho tôi, không thể xóa hoặc ngắt kết nối người dùng hiện tại. Cũng không thể thấy bất kỳ kết nối hoạt động nào với DB. Khởi động lại SQL Server (Nhấp chuột phải và chọn Khởi động lại) cho phép tôi làm điều đó.
Để thêm lời khuyên đã được đưa ra, nếu bạn có một ứng dụng web chạy qua IIS sử dụng DB, bạn cũng có thể cần phải dừng (không tái chế) nhóm ứng dụng cho ứng dụng trong khi khôi phục, sau đó khởi động lại. Việc dừng nhóm ứng dụng sẽ tắt các kết nối http đang hoạt động và không cho phép nữa, điều này có thể sẽ cho phép các quy trình được kích hoạt kết nối và từ đó khóa cơ sở dữ liệu. Đây là sự cố đã biết ví dụ với Hệ thống quản lý nội dung Umbraco khi khôi phục cơ sở dữ liệu của nó
Không ai ở trên làm việc cho tôi. Cơ sở dữ liệu của tôi không hiển thị bất kỳ kết nối hoạt động nào bằng Activity Monitor hoặc sp_who. Cuối cùng tôi đã phải:
Không phải là giải pháp tao nhã nhất nhưng nó hoạt động và nó không yêu cầu khởi động lại SQL Server (không phải là một tùy chọn cho tôi, vì máy chủ DB đã lưu trữ một loạt các cơ sở dữ liệu khác)
Tôi thích làm như thế này,
thay đổi cơ sở dữ liệu ngoại tuyến với rollback ngay lập tức
và sau đó khôi phục cơ sở dữ liệu của bạn. sau đó,
thay đổi cơ sở dữ liệu trực tuyến với rollback ngay lập tức