Tôi đã được giao nhiệm vụ cố gắng khôi phục cơ sở dữ liệu bị hỏng (do lỗi I / O, đã được sửa chữa từ đó). Tôi không quen thuộc với cơ sở dữ liệu hoặc những gì nó chứa.
Tôi đã nhận được một bản sao lưu cũ (~ 3 tuần) và một loạt nhật ký giao dịch ... tuy nhiên vẫn còn thiếu nhật ký giao dịch, vì vậy tôi chỉ có thể khôi phục tối đa một ngày nhất định. Có khoảng 2,5 tuần dữ liệu bị mất (và có rất nhiều dữ liệu được thêm vào cơ sở dữ liệu này liên tục).
Tôi cũng đã nhận được một bản sao của cơ sở dữ liệu bị hỏng (có thể truy cập được, nhưng có rất nhiều trang bị hỏng / thiếu).
Tôi đã thử các DBCC CHECKDB
lệnh thông thường (vẫn không repair_allow_data_loss
, đó sẽ là phương án cuối cùng của tôi nếu không có gì khác hoạt động).
Sau nhiều lần đến và đi đến cơ sở dữ liệu (db là một con quái vật nhỏ 1,5 terabyte và mọi thứ tôi làm đều chậm và mất một lúc), tôi đã cố gắng thực hiện khôi phục trang trực tuyến từ bản sao lưu tốt được biết đến cuối cùng cho các trang bị hỏng.
Để làm điều đó, tôi đã thực hiện một tập lệnh tạo ra nhiều RESTORE DATABASE <foo> PAGE='pages' FROM DISK='<bar.bak>'
lệnh từ DBCC CHECKDB
đầu ra (về cơ bản là một biểu thức chính quy và khác biệt) ... cho đến nay, điều này đã làm việc đến mức nó nói rằng tôi đã đạt đến giới hạn 1000 trang mỗi tệp (có 8 tệp trên db này) cho mỗi lệnh khôi phục.
Vì vậy, nó yêu cầu tôi "hoàn thành khôi phục trực tuyến", nhưng tôi không biết làm thế nào để làm điều đó ... Tôi không có nhật ký đuôi hoặc bất cứ điều gì hoàn chỉnh hơn bản sao lưu đầy đủ mà tôi bắt đầu, vì vậy Về cơ bản, tôi không biết cách hoàn tất khôi phục để tiếp tục thử với các trang còn lại.
Tôi đã thử RESTORE DATABASE <foo> WITH RECOVERY
nhưng nó cũng không hoạt động, nó yêu cầu tôi đăng nhập mà tôi không có.
Có ai có bất cứ lời khuyên nào về cách tôi có thể cố gắng phục hồi bất cứ điều gì từ đây không? Hoặc làm thế nào để "hoàn thành" khôi phục trực tuyến để tôi có thể tiếp tục cố gắng khôi phục nhiều trang hơn? Tôi có gặp vấn đề tương tự không nếu tôi thử khôi phục ngoại tuyến (về cơ bản là thêm WITH NORECOVERY
vào mọi thứ và sau đó cố gắng đưa nó trở lại vào cuối?)
Xây dựng cơ sở dữ liệu bằng tay về cơ bản là không thể hoàn tác ... có hàng trăm bảng với hàng triệu hàng và không có ý nghĩa rõ ràng về bất kỳ bảng nào trong số đó. DB bị hỏng sẽ thất bại trong SELECT
các truy vấn sau vài triệu hàng nhưng tôi không chắc mình có thể tìm ra ở đâu. Tôi đã thử xây dựng lại tất cả các chỉ mục không được nhóm, nhưng có những trang bị hỏng với dữ liệu hàng, do đó cũng không hoạt động.
Một số mất dữ liệu sẽ được chấp nhận, nhưng ít nhất là phải đạt được sự nhất quán trên DB.
Cơ sở dữ liệu bị hỏng là trực tuyến và khách hàng đang làm việc với nó (vì vậy nó tiếp tục nhận được dữ liệu mới), do đó, bất kỳ quy trình nào tôi thực hiện trên băng ghế dự bị nên được sao chép trên cơ sở dữ liệu sản xuất sau đó (thời gian chết sẽ khó khăn cho nó).
Đây là SQL Server 2014 Enterprise
PS: Tôi không phải là DBA ... Tôi là một lập trình viên, nhưng khách hàng đã thử một số dịch vụ phục hồi thảm họa sql "chuyên gia" và họ đã từ bỏ, vì vậy tôi đã được yêu cầu xem xét và xem liệu tôi có thể làm bất cứ gì.
Cập nhật : sau nhiều thử nghiệm, việc khôi phục trang theo từng trang là không có, vì vậy chúng tôi đã từ bỏ ý tưởng này. Chúng tôi sẽ phục hồi thủ công (chọn thủ công các bản ghi bị thiếu từ các bảng bị hỏng và chèn chúng vào bản sao lưu tốt đã biết trước), thực hiện một số công cụ tự động cho nó (một lần nữa, có hàng trăm và hàng trăm bảng).