Máy chủ SQL: Cơ sở dữ liệu bị kẹt trong trạng thái Khôi phục trạng thái


564

Tôi đã sao lưu cơ sở dữ liệu:

BACKUP DATABASE MyDatabase
TO DISK = 'MyDatabase.bak'
WITH INIT --overwrite existing

Và sau đó cố gắng khôi phục nó:

RESTORE DATABASE MyDatabase
   FROM DISK = 'MyDatabase.bak'
   WITH REPLACE --force restore over specified database

Và bây giờ cơ sở dữ liệu bị kẹt trong trạng thái khôi phục.

Một số người đã đưa ra giả thuyết rằng đó là vì không có tệp nhật ký trong bản sao lưu và nó cần được chuyển tiếp bằng cách sử dụng:

RESTORE DATABASE MyDatabase
WITH RECOVERY 

Ngoại trừ điều đó, tất nhiên, thất bại:

Msg 4333, Level 16, State 1, Line 1
The database cannot be recovered because the log was not restored.
Msg 3013, Level 16, State 1, Line 1
RESTORE DATABASE is terminating abnormally.

Và chính xác những gì bạn muốn trong một tình huống thảm khốc là một khôi phục sẽ không hoạt động.


Bản sao lưu chứa cả dữ liệu và tệp nhật ký:

RESTORE FILELISTONLY 
FROM DISK = 'MyDatabase.bak'

Logical Name    PhysicalName
=============   ===============
MyDatabase    C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\MyDatabase.mdf
MyDatabase_log  C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\MyDatabase_log.LDF

3
Tôi đã có cùng một vấn đề chính xác và tất cả các giải pháp đều thất bại. Thật thú vị, tôi đã đăng nhập trực tiếp vào máy chủ SQL và ban hành DROP DATABASE dblệnh thông qua SSMS và nó đã hoạt động (trước đó tôi đã sử dụng SSMS từ một máy khác để phát lệnh). Tôi đoán các giải pháp khác cũng sẽ làm việc.
Salman A

Câu trả lời:


437

Bạn cần sử dụng WITH RECOVERYtùy chọn, với RESTORElệnh cơ sở dữ liệu của bạn , để đưa cơ sở dữ liệu của bạn trực tuyến như một phần của quá trình khôi phục.

Điều này tất nhiên chỉ khi bạn không có ý định khôi phục bất kỳ bản sao lưu nhật ký giao dịch nào, tức là bạn chỉ muốn khôi phục bản sao lưu cơ sở dữ liệu và sau đó có thể truy cập cơ sở dữ liệu.

Lệnh của bạn sẽ trông như thế này,

RESTORE DATABASE MyDatabase
   FROM DISK = 'MyDatabase.bak'
   WITH REPLACE,RECOVERY

Bạn có thể thành công hơn khi sử dụng trình hướng dẫn cơ sở dữ liệu khôi phục trong SQL Server Management Studio. Bằng cách này, bạn có thể chọn các vị trí tệp cụ thể, tùy chọn ghi đè và tùy chọn VỚI Recovery.


3
Tôi chưa bao giờ phải sử dụng tuyên bố phục hồi khi làm những gì anh ta đang làm. VỚI THAY THẾ nên đủ.
Sam

8
Có, tôi đã sử dụng BÌNH THƯỜNG nhưng quá trình khôi phục bị treo. Sử dụng VỚI PHỤC HỒI, THAY THẾ nó sẽ không làm
hỏng

Điều này đã giải quyết vấn đề của tôi. Chúng tôi đã có một lỗi SAN ở giữa một khôi phục và đây là một giải pháp nhanh chóng và sạch sẽ.
Người dùng đã đăng ký

Tôi đã gặp một vấn đề tương tự ngày hôm nay với cơ sở dữ liệu SQL Server 2005. Trong trường hợp của tôi, tôi đã phải thêm ', RESTART' vào mệnh đề VỚI, để giải quyết vấn đề. Nó đã cho tôi một thông báo lỗi nói rằng hoạt động trước đó không thành công.
XpiritO

3
@FistOfFury Nếu một thao tác khôi phục trước đó trên cùng một cơ sở dữ liệu ở trạng thái lơ lửng / ngủ thì có. Chỉ cần dừng / hủy quá trình khôi phục trong quá trình sẽ có tác dụng tương tự.
John Sansom

692

Tôi đã gặp tình huống này khi khôi phục cơ sở dữ liệu cho phiên bản SQL Server 2005 Standard Edition bằng Symantec Backup Exec 11d. Sau khi hoàn thành công việc khôi phục, cơ sở dữ liệu vẫn ở trạng thái "Khôi phục". Tôi không gặp vấn đề về dung lượng ổ đĩa - cơ sở dữ liệu đơn giản là không thoát khỏi trạng thái "Khôi phục".

Tôi đã chạy truy vấn sau đối với phiên bản SQL Server và thấy rằng cơ sở dữ liệu ngay lập tức có thể sử dụng được:

RESTORE DATABASE <database name> WITH RECOVERY

4
Chúng tôi đã có một DB bị kẹt trong khôi phục trong 2 giờ. Chúng tôi đã chạy lệnh này từ một máy khác chống lại chủ và nó đã sửa chúng tôi ngay. Cảm ơn!
Pete

11
+1, với một hình ảnh xác thực. Khi tôi chạy nó, tôi nhận được một thông báo lỗi nói rằng cơ sở dữ liệu đã được khôi phục hoàn toàn. Nhưng nó vẫn hiển thị là trạng thái "Đang khôi phục". Vì vậy, tôi nhấp chuột phải vào Studio quản lý, nhấn Làm mới và nó đã trở lại bình thường.
dario_ramos

2
Tôi đã khôi phục bằng trình hướng dẫn Mng Studio, nhập tên cơ sở dữ liệu mới nhưng do nhầm tên đã để lại tên tệp giống như cơ sở dữ liệu hiện có. Tôi đã gặp lỗi "khôi phục thất bại nhưng đăng nhập đuôi thành công" và cơ sở dữ liệu được đính kèm với các tệp đó đã bị kẹt trong trạng thái khôi phục. Lệnh này dường như đã khôi phục cơ sở dữ liệu về trạng thái trước đó.
Chris

3
Điều này đã làm việc. Tôi đã cố gắng khôi phục bản sao lưu vào cơ sở dữ liệu phụ, nhưng cơ sở dữ liệu chính của tôi đã chuyển sang trạng thái khôi phục vì một số lý do. Điều này thực sự đã phục hồi DB của tôi. Cảm ơn nhiều!
Aravindh

2
Một số mặc định của trình hướng dẫn khôi phục SSMS sẽ để DB nguồn ở trạng thái khôi phục để bạn có thể tiếp tục khôi phục các bản sao lưu hoặc nhật ký khác nhau mà không sợ người dùng và lệnh này là cách thích hợp để đưa DB trở lại bình thường sau khi bạn hoàn thành.
Tim Lehner

102

Đây là cách bạn làm điều đó:

  1. Dừng dịch vụ (MSSQLSERVER);
  2. Đổi tên hoặc xóa các tệp Cơ sở dữ liệu và Nhật ký (C: \ Chương trình tệp \ Microsoft SQL Server \ MSSQL.1 \ MSSQL \ Data ...) hoặc bất cứ nơi nào bạn có các tệp;
  3. Bắt đầu dịch vụ (MSSQLSERVER);
  4. Xóa cơ sở dữ liệu có vấn đề;
  5. Khôi phục lại cơ sở dữ liệu.

Tipu, cảm ơn vì điều đó. Tôi gặp vấn đề tương tự với poster gốc, nhưng nguyên nhân là do máy chủ hết dung lượng đĩa trong khi khôi phục và do đó gây ra trạng thái khôi phục vĩnh viễn.
Pauk

8
Tại sao không bỏ cơ sở dữ liệu? Bằng cách đó bạn không phải dừng dịch vụ.
ErikE

8
@ErikE Đối với tôi, máy chủ SQL cho biết họ không thể bỏ cơ sở dữ liệu vào giữa quá trình khôi phục, mặc dù nó không thực sự khôi phục ....
Erik Philips

@ErikPhilips Trong trường hợp đó, tôi cho rằng một người đã quay lại dừng dịch vụ. Tôi tự hỏi nếu điều đó xảy ra mọi lúc hoặc chỉ trong một số trường hợp nhất định của vấn đề khôi phục bị mắc kẹt.
ErikE

5
Trong trường hợp của tôi, việc bỏ cơ sở dữ liệu treo ở trạng thái "Khôi phục ..." bằng lệnh SQL drop database <dbname>trong cửa sổ truy vấn là đủ. Sau đó, tôi nhấp chuột phải vào Cơ sở dữ liệu và chọn Làm mới loại bỏ mục trong Studio quản lý. Sau đó, tôi đã thực hiện khôi phục mới hoạt động tốt ( lưu ý rằng việc mang ngoại tuyến không hoạt động, khởi động lại dịch vụ SQL không hoạt động, khởi động lại máy chủ cũng không hoạt động tốt).
Matt

84

Tôi đã có một sự cố tương tự với việc dừng một máy chủ thứ cấp vận chuyển nhật ký. Sau lệnh xóa máy chủ khỏi vận chuyển nhật ký và dừng vận chuyển nhật ký từ máy chủ chính, cơ sở dữ liệu trên máy chủ thứ cấp bị kẹt trong trạng thái khôi phục sau lệnh

RESTORE DATABASE <database name> WITH RECOVERY

Các thông điệp cơ sở dữ liệu:

RESTORE DATABASE đã xử lý thành công 0 trang trong 18.530 giây (0.000 MB / giây).

Cơ sở dữ liệu đã có thể sử dụng lại sau 18 giây.


6
Đặc biệt hữu ích khi bạn đã khôi phục cơ sở dữ liệu nhưng quên tùy chọn THU HỒI ...
JBickford 18/03/2016

2
Đây là tất cả những gì tôi cần để khiến nó rời khỏi trạng thái "Khôi phục" sau khi khôi phục bản sao lưu của cơ sở dữ liệu này sang một tên DB khác. Cảm ơn nhiều.
Sean

81

Tôi gặp vấn đề tương tự với việc khôi phục bằng SQL Management Studio. Tôi đã cố gắng khôi phục bản sao lưu của cơ sở dữ liệu sang một cái mới với một tên khác. Lúc đầu, điều này không thành công và sau khi sửa tên tệp của cơ sở dữ liệu mới, nó đã được thực hiện thành công - trong mọi trường hợp, sự cố tôi mô tả lại xảy ra ngay cả khi tôi nhận được điều này ngay từ lần đầu tiên. Vì vậy, sau khi khôi phục, cơ sở dữ liệu ban đầu vẫn còn một (Khôi phục ...) bên cạnh tên của nó. Xem xét các câu trả lời của diễn đàn ở trên (Bhusan's) Tôi đã thử chạy trong trình soạn thảo truy vấn ở bên cạnh:

RESTORE DATABASE "[NAME_OF_DATABASE_STUCK_IN_RESTORING_STATE]"

mà đã khắc phục vấn đề. Lúc đầu tôi gặp rắc rối vì tên cơ sở dữ liệu chứa các ký tự đặc biệt. Tôi đã giải quyết vấn đề này bằng cách thêm các trích dẫn kép xung quanh - các trích dẫn đơn sẽ không hoạt động gây ra lỗi "Cú pháp không chính xác gần ...".

Đây là giải pháp tối thiểu tôi đã cố gắng giải quyết vấn đề này (cơ sở dữ liệu bị kẹt trong trạng thái khôi phục) và tôi hy vọng nó có thể được áp dụng cho nhiều trường hợp hơn.


2
Hoạt động hoàn hảo - không cần phải xé nó ra và lên lại. 3 Dbs của hơn 80 Gb mỗi lần mất một lúc! Cảm ơn!
Christer

1
Tôi gần như đã làm nó trên môi trường sản xuất. Tôi đã thử nó trên địa phương đầu tiên, kết thúc trong tình huống tương tự và tìm thấy nhận xét của bạn. Bài học rút ra: Sử dụng các tập lệnh và không tin tưởng SSMS trong các tình huống quan trọng.
Mariusz

1
Tôi gặp vấn đề này khi khôi phục tệp sao lưu chỉ sao lưu cơ sở dữ liệu sang cơ sở dữ liệu mới. Cơ sở dữ liệu ban đầu cho thấy lỗi. Giải pháp này đã hoạt động và phản hồi tôi nhận được là "RESTORE DATABASE đã xử lý thành công 0 trang trong 0.263 giây (0.000 MB / giây)." , do đó, có vẻ như SQL Server chỉ nhầm lẫn về trạng thái của cơ sở dữ liệu.
R. Schreurs

1
Làm việc cho tôi nhưng chỉ khi tôi xóa dấu ngoặc kép - tôi mới có [MY_DB_NAME] làm tham số.
StackOverflowUser

34

OK, tôi có vấn đề tương tự và chính xác như trong trường hợp của Pauk, nguyên nhân là do máy chủ hết dung lượng đĩa trong khi khôi phục và do đó gây ra trạng thái khôi phục vĩnh viễn. Làm thế nào để kết thúc trạng thái này mà không dừng dịch vụ SQL Server?

Tôi đã tìm thấy một giải pháp :)

Drop database *dbname*

29

Tùy chọn VỚI RECOVERY được sử dụng theo mặc định khi các lệnh RESTORE DATABASE / RESTORE LOG được thực thi. Nếu bạn bị kẹt trong quá trình "khôi phục", bạn có thể đưa cơ sở dữ liệu trở về trạng thái trực tuyến bằng cách thực hiện:

RESTORE DATABASE YourDB WITH RECOVERY
GO

Nếu có nhu cầu khôi phục nhiều tệp, các lệnh CLI yêu cầu CÓ BÌNH THƯỜNG và VỚI PHỤC HỒI tương ứng - chỉ có tệp cuối cùng trong lệnh nên có PHỤC HỒI để đưa cơ sở dữ liệu trực tuyến trở lại:

RESTORE DATABASE YourDB FROM DISK = 'Z:\YourDB.bak'
WITH NORECOVERY
GO
RESTORE LOG YourDB FROM DISK = 'Z:\YourDB.trn'
WITH RECOVERY
GO

Bạn cũng có thể sử dụng trình hướng dẫn SQL Server Management Studio:

nhập mô tả hình ảnh ở đây

Ngoài ra còn có quá trình khôi phục ảo, nhưng bạn sẽ phải sử dụng các giải pháp của bên thứ 3. Thông thường bạn có thể sử dụng sao lưu cơ sở dữ liệu như cơ sở dữ liệu trực tuyến. ApexSQL và Idera có giải pháp riêng của họ. Đánh giá bởi SQL Hammer về ApexQuery Restore . Khôi phục ảo là giải pháp tốt nếu bạn đang xử lý số lượng lớn bản sao lưu. Quá trình khôi phục nhanh hơn nhiều và cũng có thể tiết kiệm rất nhiều dung lượng trên ổ đĩa. Bạn có thể xem trên infographic ở đây để so sánh.


23

Điều này có thể khá rõ ràng, nhưng nó đã làm tôi vấp ngã ngay bây giờ:

Nếu bạn đang thực hiện sao lưu nhật ký đuôi, vấn đề này cũng có thể xảy ra do kiểm tra tùy chọn này trong trình hướng dẫn Khôi phục SSMS - "Để cơ sở dữ liệu nguồn ở trạng thái khôi phục (VỚI BÌNH THƯỜNG)"

nhập mô tả hình ảnh ở đây


7
Nếu bạn ở trạng thái này, thì cách tốt nhất của bạn là: 1. Nhấp chuột phải vào cơ sở dữ liệu, đi tới Nhiệm vụ-> Khôi phục-> Nhật ký giao dịch 2. Tìm tệp sao lưu được sử dụng cho Đăng nhập đuôi sao lưu 3. Khôi phục sao lưu Việc khôi phục sẽ thành công và đưa cơ sở dữ liệu trở lại trực tuyến.
Ryan Gross

16

Tôi đã tìm ra lý do tại sao.

Nếu khách hàng đã ban hành RESTORE DATABASE lệnh ngắt kết nối trong quá trình khôi phục, khôi phục sẽ bị kẹt.

Thật kỳ lạ khi máy chủ, khi được yêu cầu khôi phục cơ sở dữ liệu bằng kết nối máy khách, sẽ không hoàn thành khôi phục trừ khi máy khách vẫn kết nối toàn bộ thời gian.


10
Tất cả các lệnh SQL yêu cầu máy khách luôn kết nối toàn bộ thời gian.
mrdenny

2
@mrdenny: tôi đã giả định rằng các thay đổi sẽ được hoàn tác khi máy khách ngắt kết nối.
Ian Boyd

Tôi có cùng một vấn đề khi chạy lệnh này với trình điều khiển PDO PHP từ microsoft. tuy nhiên khi chạy với studio quản lý máy chủ microsoft sql Nó hoạt động tốt. Tôi tự hỏi làm thế nào để làm cho ứng dụng php của tôi kết nối toàn bộ thời gian?
Gorda ly

Cũng xảy ra ở đây, DB bị kẹt trong khôi phục / người dùng đơn sau khi có thể ngắt kết nối. Giết tất cả các SPID khác từ phiên mới nhưng vẫn bị kẹt. Đã có thể bỏ cơ sở dữ liệu như là giải pháp.
crokusek

10

cái này đã làm việc:

http://social.msdn.microsoft.com/Forums/en/sqldatabaseengine/thread/8dd1b91d-3e14-4486-abe6-e3a550bfe457

Tôi đã có một tình huống trong đó cơ sở dữ liệu của tôi cho thấy trạng thái khôi phục và tôi không thể chạy bất kỳ truy vấn nào và không thể kết nối với phần mềm của chúng tôi.

Những gì tôi đã làm để thoát khỏi tình huống này là:

  1. Dừng tất cả các dịch vụ liên quan đến SQL từ các dịch vụ windows.

  2. Tôi đã mở thư mục DATA trong đó các tệp Ldf và Mdf nằm trong thư mục SQL, thông thường nó giống như: "C: \ Tệp chương trình *********** \ MSSQL \ DATA

  3. Sau đó, tôi đã sao chép cả tệp Ldf và Mdf của cơ sở dữ liệu: [tên db] .mdf và [tên db] _log.ldf

Tôi đã sao chép cả hai tập tin này vào một thư mục khác.

  1. Sau đó, tôi bắt đầu lại tất cả các dịch vụ liên quan đến SQL (ở bước 1) từ các dịch vụ windows.

  2. Bắt đầu phòng thu MS SQL Management của tôi với thông tin đăng nhập bình thường.

  3. Nhấp chuột phải vào cơ sở dữ liệu thủ phạm và nhấn XÓA (để xóa cơ sở dữ liệu).

  4. Tất cả các tệp LDF và MDF liên quan đến cơ sở dữ liệu này đã đi từ thư mục DATA (được đề cập trong bước 2).

  5. Tạo một cơ sở dữ liệu mới có cùng tên (cùng tên với cơ sở dữ liệu tôi đã xóa trong bước 6 - cơ sở dữ liệu thủ phạm).

  6. Sau đó [tên cơ sở dữ liệu] -> nhấp chuột phải -> tác vụ -> Thực hiện ngoại tuyến.

  7. Sau đó tôi đã sao chép cả hai tệp (từ bước 3) trở lại thư mục DATA (bước 2).

  8. [tên cơ sở dữ liệu] -> nhấp chuột phải -> tác vụ -> Đưa trực tuyến.


Điều này làm việc cho tôi quá. Ở bước 10, tôi đã chọn ghi đè lên các tệp hiện có.
Divi perdomo

8

Tôi đã có một . trong tên cơ sở dữ liệu của tôi và truy vấn không hoạt động vì điều đó (nói cú pháp không chính xác gần '.') Sau đó tôi nhận ra rằng tôi cần một dấu ngoặc cho tên:

RESTORE DATABASE [My.DB.Name] WITH RECOVERY

5

Trong trường hợp của tôi, việc bỏ cơ sở dữ liệu treo ở trạng thái "Khôi phục ..." bằng lệnh SQL là đủ.

 drop database <dbname> 

trong một cửa sổ truy vấn.

Sau đó, tôi nhấp chuột phải vào Cơ sở dữ liệu và chọn Làm mới loại bỏ mục trong Studio quản lý. Sau đó, tôi đã thực hiện khôi phục mới hoạt động tốt (lưu ý rằng việc mang ngoại tuyến không hoạt động, khởi động lại dịch vụ SQL không hoạt động, khởi động lại máy chủ cũng không hoạt động tốt).


3

Tôi đã gặp vấn đề này khi tôi cũng nhận được lỗi TCP trong nhật ký sự kiện ...

Thả DB bằng sql hoặc nhấp chuột phải vào nó trong trình quản lý "xóa" và khôi phục lại.

Tôi thực sự đã bắt đầu làm điều này theo mặc định. Kịch bản thả DB, tạo lại và sau đó khôi phục.


3

Theo mặc định, mọi RESTORE DATABASEđi kèm với RECOVERYthiết lập. Các tùy chọn 'BÌNH THƯỜNG', về cơ bản cho SQL Server biết rằng cơ sở dữ liệu đang chờ thêm các tệp khôi phục (có thể là tệp DIFFLOG tệp và, có thể bao gồm tệp sao lưu nhật ký đuôi, nếu có thể). Các tùy chọn 'THU HỒI', hoàn thành tất cả các giao dịch và để cơ sở dữ liệu sẵn sàng thực hiện các giao dịch.

Vì thế:

  1. nếu cơ sở dữ liệu của bạn được thiết lập với mô hình khôi phục SIMPLE , bạn chỉ có thể thực hiện khôi phục ĐẦY ĐỦ với NORECOVERYtùy chọn, khi bạn có bản sao lưu DIFF . Không cho phép sao lưu LOG trong cơ sở dữ liệu mô hình phục hồi SIMPLE .
  2. Mặt khác, nếu cơ sở dữ liệu của bạn được thiết lập với mô hình khôi phục FULL hoặc BULK-LOGGED , bạn có thể thực hiện khôi phục FULL theo sau là NORECOVERYtùy chọn, sau đó thực hiện DIFF theo sau NORECOVERYvà cuối cùng, thực hiện khôi phục LOG với RECOVERYtùy chọn.

Hãy nhớ rằng, NHÀ HÀNG CUỐI CÙNG RECOVERYNHIỀU PHẢI CÓ TÙY CHỌN . Nó có thể là một cách rõ ràng hoặc không. Trong nhiệt độ của T-SQL, tình huống:

1.

 USE [master]
    GO
    RESTORE DATABASE Database_name 
    FROM DISK = N'\\path_of_backup_file.bak WITH FILE = 1, [REPLACE],NOUNLOAD, 
    RECOVERY -- This option could be omitted.
    GO

Tùy chọn REPLACE phải được sử dụng một cách thận trọng vì nó có thể dẫn đến mất dữ liệu

Hoặc, nếu bạn thực hiện sao lưu FULL và DIFF, bạn có thể sử dụng cái này

   USE [master]
    GO
    RESTORE DATABASE Database_name
      FROM DISK = N'\\path_of_backup_file.bak' WITH FILE = 1, 
       NOUNLOAD,NORECOVERY
    GO
    RESTORE DATABASE Database_name
      FROM DISK =N'\\path_of_**diff**backup_file.bak' WITH FILE = 1, 
     NOUNLOAD, RECOVERY
    GO

 2. USE [master]
    GO
   -- Perform a Tail-Log backup, if possible. 
   BACKUP LOG Database_name
   GO
   -- Restoring a FULL backup
   RESTORE DATABASE Database_name
    FROM DISK = N'\\path_of_backup_file.bak' WITH FILE = 1, 
     NOUNLOAD,NORECOVERY
  GO 
  -- Restore the last DIFF backup
  RESTORE DATABASE Database_name
    FROM DISK = N'\\path_of_DIFF_backup_file.bak' WITH FILE = 1,
     NORECOVERY,NOUNLOAD
  GO
  -- Restore a Log backup
  RESTORE LOG Database_name
    FROM DISK = N'path_of_LOG_backup_file.trn' WITH FILE = 2,
    RECOVERY, NOUNLOAD
  GO

Tất nhiên, bạn có thể thực hiện khôi phục với tùy chọn STATS = 10 yêu cầu SQL Server báo cáo cứ sau 10% hoàn thành.

Nếu bạn thích, bạn có thể quan sát quá trình hoặc khôi phục trong truy vấn dựa trên thời gian thực. Như sau:

USE[master]
GO
SELECT session_id AS SPID, command, a.text AS Query, start_time, percent_complete, dateadd(second,estimated_completion_time/1000, getdate()) as estimated_completion_time 
    FROM sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) a 
        WHERE r.command in ('BACKUP DATABASE','RESTORE DATABASE')
GO

Hy vọng điều này giúp đỡ.


2

Cũng có thể có vấn đề xóa cơ sở dữ liệu bị kẹt nếu bật snapshot. Đối với tôi điều này đã làm việc:

  1. Đầu tiên tôi làm theo các bước của Tipu Delacablu (đọc một vài bài đăng lên)
  2. lệnh chạy: thả cơ sở dữ liệu [cơ sở dữ liệu của bạn], sẽ báo lỗi cho bạn biết tên của cơ sở dữ liệu ảnh chụp
  3. lệnh chạy: thả cơ sở dữ liệu [cơ sở dữ liệu chụp nhanh], và sau đó chạy lại lệnh trong bước 2.


1

Tôi đã gặp trường hợp MyDbName (Khôi phục ...) vì giới hạn được cấp phép của SQL Express.

Trong tệp nhật ký, tôi tìm thấy điều này:

TẠO cơ sở dữ liệu hoặc thay đổi cơ sở dữ liệu không thành công vì kích thước cơ sở dữ liệu tích lũy kết quả sẽ vượt quá giới hạn được cấp phép của bạn là 10240 MB cho mỗi cơ sở dữ liệu.

Vì vậy, nếu bạn đang cố gắng khôi phục cơ sở dữ liệu lớn hơn, bạn cần chuyển máy chủ SQL Express sang phiên bản Nhà phát triển chẳng hạn.


Đó là cơ sở dữ liệu TFS và máy khách TFS đã nói với tôi: Cơ sở dữ liệu đầy đủ.
cskwg

1

Gặp vấn đề tương tự trong khi khôi phục cơ sở dữ liệu bằng cách sử dụng phòng quản lý máy chủ SQL và nó bị kẹt trong chế độ khôi phục. Sau vài giờ theo dõi vấn đề, truy vấn sau đây đã làm việc cho tôi. Truy vấn sau đây khôi phục cơ sở dữ liệu từ bản sao lưu hiện có về trạng thái trước đó. Tôi tin rằng, cái bắt là để có tệp .mdf và .log trong cùng một thư mục.

RESTORE DATABASE aqua_lc_availability
FROM DISK = 'path to .bak file'
WITH RECOVERY

0
  1. Trước tiên hãy kiểm tra và chạy SQL Agent Service.
  2. Sử dụng T-SQL sau:

    CHỌN tên tệp TỪ master.sys.sysaltfiles WHERE dbid = DB_ID ('db_name');

  3. Sử dụng T-SQL liên tục:

    RESTORE DatabASE TỪ DISK = 'DB_path' VỚI RESTART, REPLACE;

Hy vọng điều này giúp đỡ!


0

Tất cả các tùy chọn CÓ THU HỒI đều không phù hợp với tôi.

Những gì đã làm là thực hiện khôi phục hoàn toàn từ Management Studio.

USE [master]
RESTORE DATABASE Sales_SSD
FROM  DISK = N'D:\databaseBackups02\Daily_Sales_20150309_0941.bak' 
WITH  FILE = 1,  
MOVE N'Sales_Data' TO N'C:\Data\SSD\Sales.mdf',  
MOVE N'Sales_Log' TO N'C:\Data\SSD\Sales_1.ldf',  
NOUNLOAD,  REPLACE,  STATS = 5

0

Tôi có cùng một vấn đề ... mặc dù tôi không biết tại sao cơ sở dữ liệu của tôi gặp phải sự cố này vì ổ đĩa của tôi không đầy ... Nó giống như nó bị hỏng hoặc một cái gì đó. Tôi đã thử tất cả các cách trên mà không có cái nào hoạt động hoàn toàn, tôi đặc biệt nghĩ rằng đề nghị dừng dịch vụ và xóa các tệp mdf và ldf sẽ hoạt động ... nhưng nó vẫn bị đóng băng khi khôi phục?

Cuối cùng tôi đã giải quyết vấn đề này bằng cách xóa các tệp như đã đề cập nhưng thay vì cố gắng khôi phục lại DB, tôi đã sao chép qua các tệp .mdf và .ldf mới và Đính kèm các tệp này bằng thuật sĩ Đính kèm Front End. Cứu trợ, nó đã làm việc !!

Phải mất FOREVER để sao chép các tệp mới khi tôi đang sử dụng Máy ảo ... vì vậy việc sao chép và dán bằng bảng tạm chỉ mất một giờ vì vậy tôi chỉ đề nghị đây là lần thử cuối cùng.


0

Điều cố định nó cho tôi là

  1. dừng ví dụ
  2. tạo bản sao lưu của các tệp .mdf và .ldf trong thư mục dữ liệu
  3. Khởi động lại ví dụ
  4. xóa cơ sở dữ liệu bị kẹt khôi phục
  5. đặt các tệp .mdf và.ldf trở lại thư mục dữ liệu
  6. Đính kèm ví dụ vào các tệp .mdf và .ldf

0
RESTORE DATABASE {DatabaseName}
   FROM DISK = '{databasename}.bak'
   WITH REPLACE, RECOVERY

Vui lòng chỉ ra cái nhìn sâu sắc bổ sung mà câu trả lời này cung cấp khi so sánh với câu trả lời cũ hơn, được chấp nhận và được đánh giá cao. Điều đó sẽ giúp tránh ấn tượng về việc vừa sao chép nó với hy vọng có được danh tiếng. Ngoài ra, các câu trả lời chỉ có mã (là sự khác biệt có thể nhìn thấy chính) không được đánh giá cao ở đây, vì chúng cho ấn tượng sai rằng StackOverflow là một dịch vụ viết mã miễn phí,
Yunnosch

Tôi đã sửa định dạng, chỉ để làm cho sự giống nhau với câu trả lời cũ rõ ràng hơn. Nhưng bạn có thể học cách làm điều đó tại đây stackoverflow.com/editing-help trong trường hợp bạn cố gắng thực hiện các câu trả lời dễ đọc hơn trong tương lai.
Yunnosch

0

Sử dụng lệnh sau để giải quyết vấn đề này

RESTORE DATABASE [DatabaseName] WITH RECOVERY
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.