Xây dựng lại nhật ký giao dịch


20

Chúng tôi có một cơ sở dữ liệu rất lớn (~ 6TB), có tệp nhật ký giao dịch đã bị xóa (trong khi SQL Server bị tắt. Chúng tôi đã thử:

  1. Tách rời và gắn lại cơ sở dữ liệu; và
  2. Hoàn tác tệp nhật ký giao dịch

... nhưng không có gì đã làm việc cho đến nay.

Chúng tôi hiện đang chạy:

ALTER DATABASE <dbname> REBUILD 
LOG ON (NAME=<dbname>,FILENAME='<logfilepath>')

... nhưng với kích thước của cơ sở dữ liệu, việc này có thể sẽ mất vài ngày để hoàn thành.

Câu hỏi

  • Có sự khác biệt giữa lệnh trên và lệnh sau không?

    DBCC CHECKDB ('<dbname>', REPAIR_ALLOW_DATA_LOSS)
  • Chúng ta có nên thực hiện REPAIR_ALLOW_DATA_LOSSThay vào đó ?

Điều đáng chú ý là dữ liệu được lấy từ các nguồn khác để cơ sở dữ liệu có thể được xây dựng lại, tuy nhiên chúng tôi nghi ngờ việc sửa chữa cơ sở dữ liệu sẽ nhanh hơn nhiều so với việc lắp lại tất cả dữ liệu.


Cập nhật

Đối với những người giữ điểm: ALTER DATABASE/REBUILD LOG lệnh hoàn thành sau khoảng 36 giờ và được báo cáo:

Cảnh báo: Nhật ký cho cơ sở dữ liệu 'dbname' đã được xây dựng lại. Tính nhất quán giao dịch đã bị mất. Chuỗi RESTORE đã bị hỏng và máy chủ không còn ngữ cảnh trên các tệp nhật ký trước đó, vì vậy bạn sẽ cần biết chúng là gì.
Bạn nên chạy DBCC CHECKDB để xác thực tính nhất quán vật lý. Cơ sở dữ liệu đã được đặt ở chế độ chỉ dbo. Khi bạn sẵn sàng cung cấp cơ sở dữ liệu để sử dụng, bạn sẽ cần đặt lại các tùy chọn cơ sở dữ liệu và xóa mọi tệp nhật ký bổ sung.

Sau đó chúng tôi đã chạy một DBCC CHECKDB(mất khoảng 13 giờ) đã thành công. Chúng ta hãy nói rằng tất cả chúng ta đã học được tầm quan trọng của sao lưu cơ sở dữ liệu (và cấp cho người quản lý dự án quyền truy cập vào máy chủ ...).

Câu trả lời:


20

Không bao giờ tách cơ sở dữ liệu nghi ngờ. Dù sao, làm thế nào bạn đính kèm cơ sở dữ liệu sau khi tách nó? Bạn đã sử dụng CREATE DATABASEvớiFOR ATTACH_REBUILD_LOG tùy chọn?

Các lệnh này nên thực hiện thủ thuật:

ALTER DATABASE recovery_test_2 SET EMERGENCY;   
ALTER DATABASE recovery_test_2 SET SINGLE_USER;  

DBCC CHECKDB (recovery_test_2, REPAIR_ALLOW_DATA_LOSS) 
WITH NO_INFOMSGS, ALL_ERRORMSGS;

Tôi đã viết một bài cho tình huống này:

Quy trình phục hồi cơ sở dữ liệu SQL 2005/2008 - Đã xóa tệp nhật ký (Phần 3)

Bạn đã hỏi về sự khác biệt giữa:

  • DBCC CHECKDB ('<dbname>', REPAIR_ALLOW_DATA_LOSS)
  • ALTER DATABASE <dbname> REBUILD LOG ON (NAME=<dbname>,FILENAME='<logfilepath>')

Điều này là bạn có thể chạy cả hai để xây dựng lại tệp nhật ký, nhưng với CHECKDBbạn cũng xây dựng lại nhật ký và kiểm tra cơ sở dữ liệu về các lỗi toàn vẹn.

Ngoài ra, cơ sở dữ liệu thứ hai (sẽ thay đổi) sẽ không hoạt động nếu có các giao dịch hoạt động (không được ghi vào đĩa) khi tệp nhật ký bị mất. Khi khởi động hoặc đính kèm, SQL Server sẽ muốn thực hiện khôi phục (rollback và rollforward) từ tệp nhật ký không có ở đó. Nó xảy ra khi một sự cố đĩa hoặc sự cố tắt máy chủ bất ngờ xảy ra và cơ sở dữ liệu không được tắt sạch. Tôi đoán đó không phải là trường hợp của bạn và tất cả đều được sắp xếp tốt cho bạn.

  1. DBCC CHECKDB (DBNAME, REPAIR_ALLOW_DATA_LOSS)chạy trên cơ sở dữ liệu trong trạng thái khẩn cấp kiểm tra cơ sở dữ liệu về các lỗi không nhất quán, trước tiên hãy thử sử dụng tệp nhật ký để khôi phục từ mọi sự không nhất quán. Nếu điều này bị thiếu, nhật ký giao dịch được xây dựng lại.

  2. ALTER DATABASE REBUILD LOG ON...là một thủ tục không có giấy tờ và yêu cầu tiếp theo DBCC CHECKDBđể sửa bất kỳ lỗi nào.


12

Vâng, đó là hai tuyên bố khác nhau, mỗi người làm những việc rất khác nhau.

Tùy thuộc vào trạng thái của cơ sở dữ liệu khi tệp bị xóa, bạn thể có thể đứng dậy và chạy bằng cách đính kèm cơ sở dữ liệu và xây dựng lại nhật ký bằng cách sử dụng:

EXEC sp_attach_single_file_db 'dbname here', 'file path and name here'

Xem sp_attach_single_file_db (Transact-SQL) trong tài liệu sản phẩm.

Cũng xem bài đăng blog này của Paul S. Randal :

Sửa chữa chế độ KHẨN CẤP: biện pháp cuối cùng, rất cuối cùng

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.