KB3095958 - CORREÇÃO: Erro de inconsistência de metadados depois de trocar partições de tabela e soltar arquivos e grupos de arquivos correspondentes

Aplica-se A
SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use)

Sintomas

Tenha em conta o seguinte cenário:

  • Você tem duas tabelas particionadas no Microsoft SQL Server 2014, e as partições da primeira tabela são mapeadas para arquivos e grupos de arquivos diferentes usando o mesmo esquema de partição e função.
  • Uma dessas partições é trocada para a segunda tabela e, em seguida, truncar a segunda tabela.
  • Você solta arquivos e grupos de arquivos mapeados para a partição comutada.
  • Executa uma instrução SELECT na segunda tabela.

Nesse cenário, você recebe a seguinte mensagem de erro:

Nota

Msg 606, Nível 21, Estado 1
Inconsistência de metadados. ID< do grupo de ficheiros,o ID> do grupo de ficheiros especificado para o nome> da < tabela não existe. Execute DBCC, CHECKDB ou CHECKCATALOG.

Quando executa DBCC CHECKDB/CHECKTABLE, recebe a seguinte mensagem de erro:

Nota

Não é possível processar o índice <IndexName> da tabela <TableName> porque o grupo de ficheiros (ID <do Grupo de Ficheiros, FileGroupNumber>) é inválido.

Resolução

O problema foi corrigido primeiro nas seguintes atualizações cumulativas do SQL Server:

Recomendação: Instale a atualização cumulativa mais recente para o SQL Server

Cada nova atualização cumulativa para SQL Server contém todos os hotfixes e todas as correções de segurança que foram incluídas com a atualização cumulativa anterior. Recomendamos que transfira e instale as atualizações cumulativas mais recentes para SQL Server:

      

        
Nota Esta correção apenas impede ocorrências futuras deste problema. Se já estiver a ter este problema, exporte os seus dados para uma base de dados nova sem danos nos metadados existentes. Para fazê-lo, siga estes passos:

  1. Para determinar se uma partição tem um grupo de ficheiros inválido, execute a consulta seguinte para ver se devolve um resultado:

    SELECT * FROM sys.allocation_units AS au WHERE au.data_space_id NOT IN (SELECT data_space_id FROM sys.filegroups)
    
  2. Torne a tabela com os metadados danificados visualizável novamente.

    Se a consulta do passo 1 devolver um resultado, a partição com metadados danificados está a impedi-lo de ver (selecionar * de) quaisquer linhas na tabela. Para contornar esse problema, remova essa partição incorreta.

    Observação A partição incorreta deve estar vazia. Caso contrário, os arquivos e o grupo de arquivos em que ele estava não poderiam ter sido descartados ou excluídos. 

    Para fazer isso, mova essa partição para outra tabela que use o mesmo esquema de particionamento. Esta tabela pode ser apenas uma tabela fictícia. Utilize o container_id da consulta no passo 1 e corresponda-o com o partition_id de sys.partitions. (Certifique-se de que toma nota da partition_number.) Use o partition_number para executar uma PARTIÇÃO ALTER TABLE SWITCH da tabela que não era visível para a tabela fictícia. A tabela fictícia deve ter o mesmo conjunto de colunas e usar o mesmo esquema de partição. A sua consulta para localizar a partição inconsistente poderá ter um aspeto semelhante ao seguinte:

    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. Copie os dados da tabela anteriormente não visível para a nova base de dados.

Estado

A Microsoft confirmou que se trata de um problema nos produtos Microsoft listados na secção "Aplica-se a".