DBCC CheckDB có thể bỏ qua loại tham nhũng nào?


16

Câu hỏi này đã được nhắc nhở bởi bài đăng trước đó và việc tôi có một cơ sở dữ liệu được gửi đi để điều tra trong tương lai đã được khôi phục như sau:

BACKUP 'BrokenDatabase' detected an error on page (1:123456) in file BrokenDatabase.mdf'.
Error: 3043, Severity: 16, State: 1.

Trong câu hỏi được liên kết và bản sao lưu mà tôi đã sẵn sàng cho các cuộc điều tra TRANG DBCC, DBCC CHECKDB đã vượt qua mà không có lỗi nhưng rõ ràng là có tham nhũng.

Những loại tham nhũng nào có thể xảy ra theo đó CHECKDB sẽ vượt qua nhưng BACKUP VỚI CHECKSUM sẽ thất bại?


1
Có lẽ, lệnh DBCC IND: cung cấp danh sách các trang được sử dụng bởi bảng hoặc chỉ mục? Bạn có thể nhìn vào bảng, chỉ mục nơi có vấn đề.
garik

1
Tôi đã phân tích nhanh các trang đã ném lỗi khi xảy ra sự cố. Nghiên cứu kéo dài 30 phút kết luận rằng tôi cần hơn 30 phút để tìm ra điều gì sai :) Khi tôi quay lại để xem xét chi tiết hơn, tôi sẽ đăng một câu hỏi riêng biệt với chi tiết cụ thể từ trường hợp đó.
Mark Storey-Smith

Câu trả lời:


10

Sau đây là tổng hợp các kết quả mà tôi đọc được. Bạn sẽ tìm thấy nhiều thông tin hơn trong các tài liệu và blog được liên kết.

Đầu tiên, điều đó có thể xảy ra là DBCC CHECKDBsẽ không phát hiện ra sự không nhất quán nếu bạn tắt xác minh tổng kiểm tra hoặc torn_page. Một trích dẫn của Paul Randal trong bài này :

Bạn đã đúng - nếu trang bị rách hoặc tổng kiểm tra không được bật thì sẽ không có gì có thể được phát hiện khi có liên quan đến các tùy chọn bảo vệ trang. CHECKDB vẫn có thể tiếp nhận các tham nhũng mà nó tìm thấy khi thực hiện tất cả các kiểm tra tính nhất quán mà nó thực hiện - nhưng chẳng hạn, nó sẽ không thấy các tham nhũng ở giữa các giá trị dữ liệu.

Ha - đó là người lập dị về việc bật tổng kiểm tra trang - không có gì xảy ra cho đến khi một trang được đọc, thay đổi và viết ra. Cách duy nhất để buộc các trang nhận được tổng kiểm tra là làm cho chúng thay đổi - ví dụ: thông qua việc xây dựng lại tất cả các chỉ mục của bạn, có thể không hấp dẫn - không có công cụ "chạm" nào cả.

Tình huống trên có thể ảnh hưởng đến bạn, nếu bạn đã nâng cấp cơ sở dữ liệu từ SQL Server 2000 trở về năm 2005 trở lên. Sau đó, bạn cần phải kích hoạt tổng kiểm tra trang bằng ALTER DATABASE để kích hoạt chúng. Nhưng sau đó đoạn 2 của đoạn trích dẫn trên có thể gây rắc rối cho bạn.

BACKUP WITH CHECKSUMsẽ phát hiện sự không nhất quán của tổng kiểm tra, nhưng chỉ khi trang đã có một tổng kiểm tra được viết cho nó, khi nó đang được sao lưu. Thông thường DBCC CHECKDBcũng phát hiện ra các lỗi này, vì vậy không nên sử dụng BACKUP VỚI CHECKSUM để thay thế DBCC CHECKDB .

Bây giờ có khả năng thứ hai là DBCC CHECKDBkhông thể hiện bất kỳ sự mâu thuẫn nào, ngay cả khi có một số. Vì điều này tôi chỉ trích dẫn lại Paul Randal trong những quan niệm sai lầm về tham nhũng: chúng có thể biến mất không? :

Vì vậy, những gì về tham nhũng biến mất? Điều này nhận được vào cách kiểm tra tính nhất quán làm việc. Kiểm tra tính nhất quán chỉ chạy trên các trang trong cơ sở dữ liệu được phân bổ. Nếu một trang không được phân bổ cho bất cứ điều gì, thì 8192 byte của nó là vô nghĩa và không thể hiểu được. Đừng nhầm lẫn giữa dành riêng và phân bổ - Tôi giải thích rằng trong các quan niệm sai lầm đầu tiên ở đây. Miễn là một trang được phân bổ, nó sẽ được DBCC CHECKDB kiểm tra tính nhất quán, bao gồm kiểm tra tổng kiểm tra trang, nếu nó tồn tại. Tham nhũng dường như có thể 'biến mất' nếu một trang bị hỏng được phân bổ tại thời điểm DBCC CHECKDB chạy, nhưng sau đó được xử lý vào thời điểm DBCC CHECKDB tiếp theo chạy. Lần đầu tiên nó sẽ được báo cáo là tham nhũng, nhưng lần thứ hai nó không được phân bổ, vì vậy nó không được kiểm tra tính nhất quán và sẽ không được báo cáo là tham nhũng. Tham nhũng trông giống như nó biến mất một cách bí ẩn. Nhưng nó đã không - chỉ là trang bị hỏng không còn được phân bổ. Không có gì ngăn SQL Server xử lý một trang bị hỏng - trên thực tế, đó là điều mà nhiều sửa chữa DBCC CHECKDB làm - giải quyết những gì bị hỏng và sửa chữa tất cả các liên kết.

Tôi không có câu trả lời cuối cùng cho câu hỏi của bạn, nhưng DBCC CHECKDBchỉ kiểm tra các trang được phân bổ, nó sẽ không hiển thị sự không nhất quán trong các trang bị phân bổ. Tình huống duy nhất tôi có thể tưởng tượng bây giờ là BACKUP cũng sao lưu những trang bị xử lý hiển thị các lỗi tổng kiểm tra tiềm năng đã bị bỏ qua DBCC CHECKDB.


Có hầu hết các bài viết của Paul đã được đánh dấu nhưng +1 để tóm tắt. Không ai trong số này áp dụng cho cơ sở dữ liệu mà tôi đã đặt sang một bên để hy vọng những người khác có thể thêm suy nghĩ.
Mark Storey-Smith
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.