Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Các bản sửa lỗi cho sự cố tạo lại chỉ mục trực tuyến SQL Server 2012 &2014

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à…

dễ bị tổn thương có thể không dễ bị tổn thương
… bạn nên…
SQL Server 2012 RTM 11.0.2100 -> 11.0.2999
  1. Nâng cấp lên Gói Dịch vụ 1 hoặc Gói Dịch vụ 2 (RTM không được hỗ trợ!) và áp dụng bản sửa lỗi liên quan từ KB # 2969896.
  2. Nếu bạn không thể triển khai 1., hãy sử dụng một hoặc nhiều cách giải quyết bên dưới.
SQL Server 2012 Gói Dịch vụ 1 11.0.3000 -> 11.0.3436
  1. Áp dụng Bản cập nhật tích lũy # 11 (11.0.3449) từ KB # 2975396. Nếu sau đó bạn cài đặt Gói dịch vụ 2, bạn nên theo dõi với SP2 CU # 1. *
  2. Không đạt 1., hãy sử dụng một hoặc nhiều cách giải quyết bên dưới.
11.0.3437 -> 11.0.5057 Không làm gì cả; bạn đã có bản sửa lỗi.
SQL Server 2012 Gói Dịch vụ 2 11.0.5058 -> 11.0.5521
  1. Áp dụng Bản cập nhật tích lũy # 1 (11.0.5532) từ KB # 2976982.
  2. Không đạt 1., hãy sử dụng một hoặc nhiều cách giải quyết bên dưới.
11.0.5522 trở lên Không làm gì cả; bạn đã có bản sửa lỗi.
SQL Server 2014 RTM 12.0.2000 -> 12.0.2369
  1. Áp dụng Bản cập nhật tích lũy # 2 (12.0.2370) từ KB # 2967546.
  2. Không đạt 1., hãy sử dụng một hoặc nhiều cách giải quyết bên dưới.
12.0.2370 trở lên 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ới MAXDOP = 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ới dbo.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ị cho MAXDOP , 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 , ObjectTypeSelectionTaskAllowesDatbaseSelection [sic!]:


    Tất cả các tùy chọn đó, nhưng vẫn không có cách chữa cho MAXDOP.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. TSQL Pivot không có chức năng tổng hợp

  2. Chức năng so với Thủ tục được lưu trữ

  3. Cách thay đổi tên cơ sở dữ liệu trong SQL Server bằng T-SQL

  4. UPSERT nguyên tử trong SQL Server 2005

  5. Mã VBA để thêm bảng được liên kết với khóa chính