Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Поправки за проблем с възстановяването на онлайн индекса на SQL Server 2012 и 2014

Има грешка при регресия в SQL Server 2012 и SQL Server 2014, при която, ако възстановите индекс онлайн паралелно и също така изпитате фатална грешка като изчакване на заключване, може да изпитате загуба или повреда на данни . Това би трябвало да е сравнително рядък сценарий (Фил Брамър има просто повторение в Connect #795134), но загубата на данни е загуба на данни и аз не съм готов да залагам. Поправката е описана в KB #2969896 :КОРЕКЦИЯ:Загуба на данни в клъстериран индекс възниква, когато стартирате онлайн индекс за изграждане в SQL Server 2012.

Не всеки трябва да се тревожи за този проблем. Ако не използвате Enterprise (или еквивалентно) издание, не можете да извършвате паралелно или онлайн преизграждане на първо място (и вероятно има някои хора в Enterprise, които не възстановяват или не възстановяват онлайн). Ако имате MAXDOP за целия екземпляр зададен на 1, те не могат да вървят паралелно, освен ако не го замените на ниво оператор. Но ако сте на 2012 или 2014, работите с подходящо издание и вашите онлайн преизграждания могат да вървят паралелно, вие сте уязвими към този проблем.

Както споменах по-горе, този проблем може да се прояви в SQL Server 2012 RTM, Service Pack 1 и дори Service Pack 2, който беше пуснат на 10 юни. не включва тази корекция или която и да е от корекциите от SP1 CU #10 или #11. Блогвах за това тук. Клонът на RTM официално е извън поддръжка, така че няма да видите решение там. Проблемът може да възникне и в SQL Server 2014.

Вече има налични кумулативни актуализации за SQL Server 2012 Service Pack 1 и 2, както и SQL Server 2014. Кратко обобщение на опциите, които препоръчвам:

Ако вашият клон / @@VERSION е...

уязвим може би не е уязвим
…трябва…
SQL Server 2012 RTM 11.0.2100 -> 11.0.2999
  1. Надстройте до Service Pack 1 или Service Pack 2 (RTM не се поддържа!) и приложете съответната корекция от KB #2969896.
  2. Ако не можете да приложите 1., използвайте едно или повече от заобикалящите решения по-долу.
SQL Server 2012 Service Pack 1 11.0.3000 -> 11.0.3436
  1. Прилагане на сборна актуализация #11 (11.0.3449) от KB #2975396. Ако след това инсталирате Service Pack 2, трябва да продължите със SP2 CU #1.*
  2. При неуспех 1. използвайте едно или повече от заобикалящите решения по-долу.
11.0.3437 -> 11.0.5057 Не правете нищо; вече имате поправката.
SQL Server 2012 Service Pack 2 11.0.5058 –> 11.0.5521
  1. Прилагане на сборна актуализация #1 (11.0.5532) от KB #2976982.
  2. При неуспех 1. използвайте едно или повече от заобикалящите решения по-долу.
11.0.5522 или по-нова версия Не правете нищо; вече имате поправката.
SQL Server 2014 RTM 12.0.2000 –> 12.0.2369
  1. Приложете сборна актуализация #2 (12.0.2370) от KB #2967546.
  2. При неуспех 1. използвайте едно или повече от заобикалящите решения по-долу.
12.0.2370 или по-нова версия Не правете нищо; вече имате поправката.
* Ако инсталирате актуалната корекция на SP1 или сборната актуализация #11 и след това инсталирате SP2, ще отмените тези промени, включително тази корекция.

Решения за актуалната корекция/отклонение на CU

Тъй като всички засегнати клонове (е, с изключение на 2012 RTM) имат актуална корекция при поискване и/или кумулативна актуализация, която решава проблема, лесният отговор е просто да инсталирате съответната актуализация. Въпреки това, може да сте в сценарий, при който политиката на вашата компания или циклите на тестване ви пречат да внедрите тези актуализации бързо или може би някога. И така, какви други опции имате?

  • Можете да спрете да извършвате повторно изграждане, докато не е наличен нов сервизен пакет за вашия клон (може би можете просто да се придържате към REORGANIZE за сега). За съжаление, ако сте в компания "само сервизен пакет", вашите възможности са много ограничени:можете да се борите по-усилено за промяна на тази политика или можете да изчакате SQL Server 2012 Service Pack 3 (което може да отнеме дълго време или може просто никога не идвайте – вижте ЧЗВ #21 тук) или SQL Server 2014 Service Pack 1 (който вероятно няма да видим преди 2015 г.).
  • Можете да зададете max degree of parallelism за целия екземпляр до 1, но това може да има отрицателен ефект върху останалата част от вашето работно натоварване – помислете за неща като многонишков DBCC, паралелни заявки срещу или между разделени таблици и други операции, при които може да искате да намалите паралелизма, но не и да го премахнете напълно. Също така, тази настройка няма да повлияе на онлайн възстановяване с, да речем, изрично MAXDOP = 8 твърдо кодиран в командата, тъй като това ще отмени sp_configure настройка.
  • Можете да добавите WITH (MAXDOP = 1) опция ръчно за всички ваши команди за възстановяване. (Забележка:не е нужно да правите това за XML индекси, тъй като те по своята същност се изпълняват еднонишкови, но аз просто бих го приложил към всички преизграждания за последователност и за избягване на всяка ненужна условна логика.)
  • Можете да настроите задачите си за поддръжка на индекса да се изпълняват като конкретно влизане и след това да използвате Resource Governor, за да създадете група за работно натоварване, която ограничава MAX_DOP на това влизане до 1, независимо какво правят. Имам пример за това в бялата книга от 2008 г., която написах с Борис Баришников, Използване на управителя на ресурсите, в раздела, озаглавен „Ограничаване на паралелизма за интензивни фонови работни места“.
  • Ако използвате решението за поддръжка на индекси на Ola Hallengren, можете да добавите @MaxDop параметър за вашите извиквания към dbo.IndexOptimize :
    EXEC dbo.IndexOptimize
        /* other parameters */
        @MaxDop = 1;
  • Ако използвате SQL Sentry Fragmentation Manager, можете да диктувате нивото на MAXDOP да използвате под Настройки – и можете да направите това за цялото предприятие, за екземпляр, за база данни или дори за отделен индекс (в този случай вероятно бихте искали да зададете това за екземпляр, за всички екземпляри без налична корекция):


    Настройки на Fragmentation Manager за екземпляра (вляво) и индивидуален индекс (вдясно).

  • Ако използвате планове за поддръжка за възстановяването на вашия индекс, ще трябва да ги промените, за да използвате задачи за изпълнение на T-SQL оператори и да напишете своя ALTER INDEX ... WITH (ONLINE = ON, MAXDOP = 1); команди ръчно (така че може и да преминете към автоматизирано решение). Вижте, задачата за възстановяване на индекса няма изложено свойство за MAXDOP , въпреки че е искано многократно (последно през 2012 г., от Алберто Морило и още през 2006 г. от Линчи Ший). И просто погледнете всички тези други полезни свойства, които те излагат, като AdvSortInTempdb , ObjectTypeSelection и TaskAllowesDatbaseSelection [sic!]:


    Всички тези опции, но все още няма лек за 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. SQL – Преобразуването на тип данни varchar в тип данни за дата и час води до стойност извън диапазона

  2. Преобразуване между типове данни за дата и час в SQL Server (примери за T-SQL)

  3. Кой е най-добрият начин за контрол на версиите на моите съхранени процедури на SQL сървър?

  4. Как мога да създам потребител в базата данни на SQL Server Express, която добавих към моя проект?

  5. Как да направя търсене, чувствително към малки и големи букви в клауза WHERE (използвам SQL Server)?