Trước hết, hãy kiểm tra lỗi SQL để xem nó có thực sự đạt kích thước tối đa cho nhật ký không. Nếu có, thì truy vấn không có hy vọng hoàn thành, có lẽ nó đã ở trạng thái khôi phục.
Ngay cả nếu có, tôi luôn thích giết spid bằng tay (sử dụng sp_who2
hoặc sp_WhoIsActive
tìm spid, sau đó làm kill 59
bất cứ điều gì). Bạn cũng không thể kiểm tra trạng thái rollback trừ khi bạn thực hiện KILL rõ ràng, xem chủ đề liên quan này .
Vì đây là xóa và không phải là cập nhật hoặc chèn, bạn có thể rất may mắn và thấy rằng nó sẽ quay trở lại ngay lập tức. Nếu không, có thể mất nhiều thời gian (hoặc lâu hơn) để quay trở lại như đã làm để đi đến điểm này.
Để xem trạng thái rollback, sử dụng
kill 59 with statusonly
Thật không may, tôi đã thấy điều này thường xuyên không hiển thị bất cứ điều gì hữu ích, chỉ là "hoàn thành 0%". Trong trường hợp đó, bạn sẽ phải sử dụng sp_who2
và xem IO và CPU để xem liệu nó có còn hoạt động không.
Liên quan đến việc khởi động lại, đây là một rủi ro nghiêm trọng. Nếu spid đang tích cực quay trở lại (CPU và IO đang thay đổi), thì việc khởi động lại SQL sẽ chỉ đưa cơ sở dữ liệu ngoại tuyến hoàn toàn cho đến khi quá trình khôi phục hoàn tất (giờ và giờ). Nhưng , nếu CPU và IO không di chuyển, thì thực tế nó có thể xóa nó ngay lập tức. Dù bằng cách nào, đó là một rủi ro.
Một tùy chọn cuối cùng, nếu mọi thứ đặc biệt tồi tệ: Nếu bạn có bản sao lưu ngay trước khi xóa bắt đầu (và chưa có bản cập nhật khác cho db) , thì cách nhanh nhất để khôi phục có thể là bỏ DB, khởi động lại SQL và khôi phục từ bản sao lưu.
Nếu bạn không thể loại bỏ DB (hoặc nếu bạn đã khởi động lại cá thể và báo lỗi sql dự đoán thời gian phục hồi 24 giờ), thì hãy tắt các dịch vụ SQL, xóa các tệp MDF và LDF khỏi đĩa, khởi động SQL, thả SQL cơ sở dữ liệu (ma) và khôi phục từ bản sao lưu.
Rõ ràng là bạn chỉ cố gắng nếu đây là cơ sở dữ liệu xử lý back-end mà người dùng không tương tác.