Sintomas
Considere o seguinte cenário:
-
Tem duas tabelas divididas no Microsoft SQL Server 2014, e as divisórias da primeira tabela são mapeadas para diferentes ficheiros e grupos de ficheiros utilizando o mesmo esquema e função de partição.
-
Muda-se uma dessas divisórias para a segunda mesa, e depois trunca-se na segunda mesa.
-
Deixa cair ficheiros e grupos de ficheiros que estão mapeados para a partição comutado.
-
Execute uma declaração SELECT na segunda tabela.
Neste cenário, recebe a seguinte mensagem de erro:
Msg 606, Nível 21, inconsistência do Estado 1Metadata. O id de id de <de ficheiros> especificado para a tabela <> de nome de tabela não existe. Executar DBCC CHECKDB ou CHECKCATALOG.
Quando executar o DBCC CHECKDB/CHECKTABLE, recebe a seguinte mensagem de erro:
Não é possível processar índice <ÍndiceName> da tabela <TableName> porque o grupo de ficheiros (FileGroup ID <FileGroupNumber>) é inválido.
Resolução
O problema foi corrigido pela primeira vez nas seguintes atualizações cumulativas do SQL Server:
Cada nova atualização cumulativa do 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 descarregue e instale as últimas atualizações cumulativas para o SQL Server:
Nota Esta correção apenas impede futuras ocorrências desta questão. Se já está a passar por este problema, exporte os seus dados para uma nova base de dados sem qualquer corrupção de metadados existente. Para tal, siga estes passos:
-
Para determinar se uma partição tem um grupo de ficheiros inválido, faça a seguinte consulta 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)
-
Tornar a mesa com a corrupção dos metadados novamente visível. Se a consulta do passo 1 retornar um resultado, a partição com metadados corrompidos está a impedir-te de visualizar (selecione * de) quaisquer linhas na tabela. Para resolver este problema, remova a divisão má.Nota A divisão má deve estar vazia. Caso contrário, os ficheiros e o grupo de ficheiros em que se encontrava não poderiam ter sido retirados ou apagados. Para isso, mova esta divisória para outra mesa que usa o mesmo esquema de partição. Esta mesa pode ser apenas uma mesa falsa. Use o container_id da consulta no passo 1 e combine-o com o partition_id de sys.partitions. (Certifique-se de que nota o partition_number.) Utilize o partition_number para efetuar uma partição altercinha da tabela que não foi possível para a mesa do boneco. A tabela falsa deve ter o mesmo conjunto de colunas e utilizar o mesmo esquema de partição. A sua consulta para encontrar a divisória inconsistente pode assemelhar-se 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;
-
Copie os dados da tabela anteriormente invisível para a nova base de dados.
Estado
A Microsoft confirmou que este problema ocorre nos produtos da Microsoft listados na secção "Aplica-se a".