Chỉ mục cột trong tập tin read_only ngăn chặn CheckDB


15

Nó xuất hiện thiết lập một nhóm để read_onlyngăn chặn dbcc checkdbtoàn bộ cơ sở dữ liệu nếu nhóm đó chứa chỉ mục của cột. Khi cố gắng chạy checkdbhoặc checkfilegroup( đối với bất kỳ nhóm nào trong cơ sở dữ liệu, bao gồm cả phần phụ đọc-ghi và[PRIMARY] ), lỗi dưới đây được trả về ...

Msg 8921, Level 16, State 1, Line 24
Check terminated. A failure was detected while collecting facts. 
Possibly tempdb out of space or a system table is inconsistent. Check previous errors.

Có một phương pháp được hỗ trợ để có dữ liệu lưu trữ cột trong một filegroup chỉ đọc không? Hay tôi bị cấm kiểm tra tính toàn vẹn trong kịch bản này?

Repro

create database check_fg_ro
go
use check_fg_ro
go
exec sp_changedbowner 'sa';
go
alter database check_fg_ro add filegroup check_fg_ro_2;
alter database check_fg_ro
    add file (
         name='check_fg_ro_2'
        ,filename='C:\check_fg_ro_2.ndf'
    ) to filegroup check_fg_ro_2;
go
create table foo ( 
    i int not null primary key
) on check_fg_ro_2;
go
create columnstore index ccix_foo on foo(i);
go
use master
go
alter database check_fg_ro modify filegroup check_fg_ro_2 read_only;
go
dbcc checkdb( check_fg_ro ) with no_infomsgs, all_errormsgs, extended_logical_checks;
/*
Msg 8921, Level 16, State 1, Line 24
Check terminated. A failure was detected while collecting facts. 
Possibly tempdb out of space or a system table is inconsistent. Check previous errors.
*/
go

Disclaimer: đăng chéo lên các diễn đàn kỹ thuật

Câu trả lời:


12

Sự cố xảy ra khi DBCC cố gắng xác minh một bitmap đã xóa cho bảng cột chỉ đọc.

Các bitmap đã xóa được lưu trữ trên cùng một filegroup như bảng cột. Họ theo dõi các hàng bị xóa một cách hợp lý từ các nhóm hàng nén.

Theo như tôi có thể nói, mọi thứ đều được sắp xếp chính xác trong các bảng hệ thống nội bộ (trên SQL Server 2017 CU3) và hầu hết mã DBCC đều chiếm chính xác các hàng ẩn chứa các bitmap đã xóa của cột lưu trữ.

Vì một số lý do, việc kiểm tra các nhóm tệp ngoại tuyến hoặc chỉ đọc dẫn đến một ngoại lệ chưa được xử lý:

Cuộc gọi ngăn xếp

Msg 8921, Level 16, State 1, Line 69
Check terminated. A failure was detected while collecting facts.
Possibly tempdb out of space or a system table is inconsistent.
Check previous errors.

Kiểm tra ngoại tuyến / chỉ đọc tương tự được thực hiện vài lần trước đó trong xử lý DBCC (khi các sự kiện đang được thu thập) mà không có vấn đề.

Sự cố xảy ra khi DBCC CHECKDBhoặc DBCC FILEGROUPđược chạy (trên bất kỳ nhóm nào) hoặc DBCC CHECKTABLEđược yêu cầu kiểm tra bảng cột chỉ đọc cụ thể. Không ai trong số này tạo ra tình trạng lỗi nghiêm trọng ngăn chặn phần còn lại của kiểm tra DBCC đang chạy, vì vậy đây phải là một lỗi.


Hay tôi bị cấm kiểm tra tính toàn vẹn trong kịch bản này?

Như một giải pháp thay thế, hãy chạy DBCC CHECKFILEGROUPtrên filstoreroup ngay lập tức trước khi nó được đọc ở chế độ chỉ đọc (hoặc chạy DBCC CHECKDBtại thời điểm đó):

  1. DBCC CHECKALLOC trên cơ sở dữ liệu
  2. Chạy DBCC CHECKCATALOG
  3. Chạy DBCC CHECKTABLEcho mỗi bảng (không bao gồm các bảng cột trong nhóm tệp chỉ đọc)
  4. Bạn cũng có thể muốn chạy DBCC CHECKCONSTRAINTS.

Xem các tùy chọn kiểm tra tính nhất quán cho một VLDB của Paul Randal và DBCC CHECKDB phân chia Q & A trong nhiều ngày .


9

Trước tiên, cảm ơn bạn về thông tin và mã / tình huống sao chép.

Tôi đã lấy cái này và nộp một mục nội bộ, nó đã được chỉ định và sẽ được xem xét ngay.

Bạn có thể bỏ phiếu cho công việc tại filegroup để read_only ngăn dbcc checkdb chạy trên trang web phản hồi của SQL Server.

Tôi sẽ cập nhật câu trả lời này với nhiều thông tin hơn khi có sẵn.

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.