Có một lỗi hồi quy trong SQL Server 2012 và SQL Server 2014, trong đó, nếu bạn xây dựng lại chỉ mục trực tuyến song song và bạn cũng gặp phải lỗi nghiêm trọng chẳng hạn như thời gian chờ khóa, bạn có thể gặp phải mất hoặc hỏng dữ liệu . Đây hẳn là một tình huống tương đối hiếm xảy ra (Phil Brammer có một đoạn repro đơn giản trong Connect # 795134), nhưng mất dữ liệu là mất dữ liệu và tôi không chuẩn bị để đánh bạc. Bản sửa lỗi được mô tả trong KB # 2969896:Khắc phục:Mất dữ liệu trong chỉ mục nhóm xảy ra khi bạn chạy chỉ mục xây dựng trực tuyến trong SQL Server 2012.
Không phải ai cũng cần quan tâm đến vấn đề này. Nếu bạn không chạy Phiên bản Enterprise (hoặc phiên bản tương đương), bạn không thể thực hiện xây dựng lại song song hoặc trực tuyến ngay từ đầu (và có thể một số người trên Enterprise không xây dựng lại hoặc không xây dựng lại trực tuyến). Nếu bạn có MAXDOP
toàn phiên bản được đặt thành 1, chúng không thể song song trừ khi bạn ghi đè nó ở cấp câu lệnh. Tuy nhiên, nếu bạn đang sử dụng phiên bản 2012 hoặc 2014, đang chạy một phiên bản phù hợp và các bản xây dựng lại trực tuyến của bạn có thể diễn ra song song, bạn rất dễ gặp sự cố này.
Như tôi đã ám chỉ ở trên, sự cố này có thể biểu hiện trong SQL Server 2012 RTM, Gói Dịch vụ 1 và thậm chí Gói Dịch vụ 2, được phát hành vào ngày 10 tháng 6. Lỗi không được sửa cho đến khi mã SP2 bị đóng băng, vì vậy SP2 không không bao gồm bản sửa lỗi này hoặc bất kỳ bản sửa lỗi nào từ SP1 CU # 10 hoặc # 11. Tôi đã viết blog về điều này ở đây. Chi nhánh RTM chính thức không được hỗ trợ, vì vậy bạn sẽ không thấy bản sửa lỗi ở đó. Sự cố cũng có thể xảy ra trong SQL Server 2014.
Hiện có sẵn các bản cập nhật tích lũy cho SQL Server 2012 Gói Dịch vụ 1 &2 cũng như SQL Server 2014. Bản tóm tắt nhanh về các tùy chọn mà tôi đề xuất:
Nếu chi nhánh / @@ VERSION của bạn là…
| … bạn nên… | ||||
---|---|---|---|---|---|
| |
| |||
| |
| |||
| Không làm gì cả; bạn đã có bản sửa lỗi. | ||||
| |
| |||
| Không làm gì cả; bạn đã có bản sửa lỗi. | ||||
SQL Server 2014 RTM | |
| |||
| Không làm gì cả; bạn đã có bản sửa lỗi. | ||||
* Nếu bạn cài đặt bản vá nóng SP1 hoặc Bản cập nhật tích lũy # 11 rồi cài đặt SP2, bạn sẽ hoàn tác những thay đổi đó, bao gồm bản sửa lỗi này. |
Các giải pháp cho hotfix / CU averse
Vì tất cả các nhánh bị ảnh hưởng (ngoại trừ 2012 RTM) đều có bản sửa lỗi theo yêu cầu và / hoặc bản cập nhật tích lũy giải quyết vấn đề, câu trả lời dễ dàng là chỉ cần cài đặt bản cập nhật liên quan. Tuy nhiên, bạn có thể gặp phải trường hợp mà chính sách công ty hoặc các chu kỳ thử nghiệm ngăn cản bạn triển khai các bản cập nhật này một cách nhanh chóng hoặc có thể là bất cứ lúc nào. Vậy bạn có những lựa chọn nào khác?
- Bạn có thể ngừng thực hiện xây dựng lại cho đến khi có gói dịch vụ mới cho chi nhánh của mình (có thể bạn chỉ cần gắn bó với
REORGANIZE
bây giờ). Thật không may, nếu bạn đang ở trong một công ty "chỉ gói dịch vụ", các tùy chọn của bạn rất hạn chế:bạn có thể đấu tranh nhiều hơn để thay đổi chính sách đó hoặc bạn có thể đợi SQL Server 2012 Gói Dịch vụ 3 (có thể mất nhiều thời gian hoặc có thể đơn giản là không bao giờ đến - hãy xem Câu hỏi thường gặp # 21 tại đây) hoặc SQL Server 2014 Gói Dịch vụ 1 (mà chúng ta có thể sẽ không thấy trước khi năm 2015 ra mắt). - Bạn có thể đặt
max degree of parallelism
thành 1, tuy nhiên, điều này có thể có ảnh hưởng tiêu cực đến phần còn lại của khối lượng công việc của bạn - hãy nghĩ về những thứ như DBCC đa luồng, truy vấn song song chống lại hoặc giữa các bảng được phân vùng và các thao tác khác mà bạn có thể muốn giảm tính song song nhưng không loại bỏ nó hoàn toàn. Ngoài ra, cài đặt này sẽ không ảnh hưởng đến việc xây dựng lại trực tuyến, chẳng hạn, vớiMAXDOP = 8
rõ ràng được mã hóa cứng vào lệnh, vì điều này sẽ ghi đèsp_configure
thiết lập.
- Bạn có thể thêm
WITH (MAXDOP = 1)
tùy chọn thủ công cho tất cả các lệnh xây dựng lại của bạn. (Lưu ý:bạn không phải làm điều này đối với các chỉ mục XML, vì chúng vốn dĩ chạy đơn luồng, nhưng tôi sẽ chỉ áp dụng nó cho tất cả các bản xây dựng lại để có tính nhất quán và để tránh bất kỳ logic điều kiện không cần thiết nào.)
- Bạn có thể đặt các công việc duy trì chỉ mục của mình để chạy dưới dạng đăng nhập cụ thể, sau đó sử dụng Trình quản lý tài nguyên để tạo Nhóm khối lượng công việc giới hạn
MAX_DOP
của thông tin đăng nhập đó thành 1, bất kể họ đang làm gì. Tôi có một ví dụ về điều này trong sách trắng năm 2008 mà tôi đã viết với Boris Baryshnikov, Sử dụng Thống đốc Nguồn lực, trong phần có tựa đề, "Giới hạn song song cho các công việc nền chuyên sâu."
- Nếu bạn đang sử dụng giải pháp duy trì chỉ mục của Ola Hallengren, bạn có thể thêm
@MaxDop
tham số cho các lệnh gọi của bạn tớidbo.IndexOptimize
:
EXEC dbo.IndexOptimize /* other parameters */ @MaxDop = 1;
- Nếu bạn đang sử dụng SQL Sentry Fragmentation Manager, bạn có thể chỉ định cấp của
MAXDOP
để sử dụng trong Cài đặt - và bạn có thể thực hiện việc này trên toàn doanh nghiệp, theo từng trường hợp, trên mỗi cơ sở dữ liệu hoặc thậm chí trên từng chỉ mục riêng lẻ (trong trường hợp này, bạn có thể muốn đặt điều này cho mỗi trường hợp, cho tất cả các trường hợp mà không có sẵn bản sửa lỗi):
Cài đặt Trình quản lý phân mảnh cho phiên bản (bên trái) và một chỉ mục riêng lẻ (phải). - Nếu bạn đang sử dụng Kế hoạch Bảo trì cho các bản xây dựng lại chỉ mục của mình, bạn sẽ phải thay đổi chúng để sử dụng Thực thi Nhiệm vụ Câu lệnh T-SQL và viết
ALTER INDEX ... WITH (ONLINE = ON, MAXDOP = 1);
các lệnh theo cách thủ công (cũng có thể chuyển sang giải pháp tự động). Hãy xem, Tác vụ tạo lại chỉ mục không có thuộc tính được hiển thị choMAXDOP
, mặc dù nó đã được yêu cầu nhiều lần (gần đây nhất là vào năm 2012, bởi Alberto Morillo và từ năm 2006, bởi Linchi Shea). Và chỉ cần xem xét tất cả các thuộc tính hữu ích khác mà chúng hiển thị, nhưAdvSortInTempdb
,ObjectTypeSelection
vàTaskAllowesDatbaseSelection
[sic!]:
Tất cả các tùy chọn đó, nhưng vẫn không có cách chữa cho MAXDOP.