KB3095958 – КОРЕКЦИЯ: Грешка поради несъответствие на метаданните, след като превключите дяловете на таблица и пуснете съответните файлове и групи

Отнася се за
SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use)

Симптоми

Имайте предвид сценария, описан по-долу:

  • Имате две разделени таблици в Microsoft SQL Server 2014 и дяловете на първата таблица са нанесени в различни файлове и файлови групи с помощта на същата схема на дялове и функция.
  • Превключвате един от тези дялове на втората таблица и след това орязвате втората таблица.
  • Пропускате файлове и файлови групи, които са нанесени в препоръчания дял.
  • Изпълнявате команда SELECT за втората таблица.

В този случай получавате следното съобщение за грешка:

Забележка

Msg 606, Level 21, State 1
Несъответствие на метаданните. ИД< на файлова група ИД нафайлова> група, указано за име на таблица>< на таблица, не съществува. Изпълнете DBCC, CHECKDB или CHECKCATALOG.

Когато стартирате DBCC CHECKDB/CHECKTABLE, получавате следното съобщение за грешка:

Забележка

Не може да се обработи индексът <IndexName> на таблицата <TableName> , тъй като файловата група (ИД <на файлова група FileGroupNumber>) е невалидна.

Решение

Проблемът е коригиран за първи път в следните кумулативни актуализации на SQL Server:

Препоръка: Инсталирайте най-новата кумулативна актуализация за SQL Server

Всяка нова кумулативна актуализация за SQL Server съдържа всички актуални поправки и корекции на защитата, които са били включени в предишната кумулативна актуализация. Препоръчваме ви да изтеглите и инсталирате най-новите сборни актуализации за SQL Server:

      

        
Забележка Тази корекция предотвратява само бъдещи повторения на този проблем. Ако вече имате този проблем, експортирайте данните си в нова база данни без съществуващи повреди на метаданните. За да направите това, изпълнете следните стъпки:

  1. За да определите дали даден дял има невалидна файлова група, изпълнете следната заявка, за да видите дали връща резултат:

    SELECT * FROM sys.allocation_units AS au WHERE au.data_space_id NOT IN (SELECT data_space_id FROM sys.filegroups)
    
  2. Направете таблицата с повредата на метаданните отново видима.

    Ако заявката от стъпка 1 върне резултат, дялът с повредени метаданни ви пречи да прегледате (изберете * от) който и да било ред в таблицата. За да заобиколите този проблем, премахнете този лош дял.

    Забележка: Лошият дял трябва да е празен. В противен случай файловете и файловата група, в която са се намирали, не биха могли да бъдат пропуснати или изтрити. 

    За целта преместете този дял в друга таблица, която използва същата схема на разделяне. Тази таблица може да бъде просто фиктивна таблица. Използвайте container_id от заявката в стъпка 1 и я съпоставете с partition_id от sys.partitions. (Не забравяйте да запомните partition_number.) Използвайте partition_number, за да извършите ALTER TABLE SWITCH PARTITION от таблицата, която не е била видима в фиктивната таблица. Фиктивната таблица трябва да има един и същ набор от колони и да използва една и съща схема на дялове. Вашата заявка за намиране на несъответстващия дял може да изглежда така:

    SELECT au.container_id, au.data_space_id, p.partition_number FROM sys.partitions AS p JOIN sys.allocation_units AS au ON p.partition_id = au.container_id LEFT JOIN sys.filegroups AS fgs ON fgs.data_space_id = au.data_space_id WHERE object_id = OBJECT_ID('MyTableName') AND fgs.data_space_id IS NULL;
    
  3. Копирайте данните от невидимата преди таблица в новата база данни.

Състояние

Microsoft потвърждава, че това е проблем в продуктите на Microsoft, които са изброени в раздела „Важи за“.