Estou tendo algumas mensagens de erro estranhas no SQL Server 2017 CU3. Estou migrando bancos de dados e reorganizando grupos de arquivos. Ao "reorganizar", quero dizer que utilizo um procedimento armazenado que cria uma função de partição e um esquema de partição no novo grupo de arquivos para um objeto, reconstrói os índices durante o particionamento e remove o particionamento.
No final, tenho alguns grupos de arquivos vazios. Seus arquivos são removidos . Além disso, o próprio grupo de arquivos é removido. Isso funciona bem na maioria dos casos. No entanto, para dois bancos de dados, removi os arquivos ... resta um grupo de arquivos sem nenhum arquivo associado, mas
ALTER DATABASE REMOVE FILEGROUP
gera um erro 5042:
O grupo de arquivos 'xyz' não pode ser removido porque não está vazio.
Questão
Como posso me livrar desse grupo de arquivos vazio ... qual poderia ser o problema?
Eu já li alguns problemas comuns, mas eles não estão presentes no meu sistema:
Verificado:
SELECT * FROM sys.partition_schemes; SELECT * FROM sys.partition_functions;
0 linhas ... nenhum objeto de particionamento restante no banco de dados
UPDATE STATISTICS
para todos os objetos no banco de dadossem efeito
Verifica se há índices no grupo de arquivos:
SELECT * FROM sys.data_spaces ds INNER JOIN sys.indexes i ON ds.data_space_id = i.data_space_id WHERE ds.name = 'xyz'
0 linhas
Verifica objetos no grupo de arquivos:
SELECT au.*, ds.name AS [data_space_name], ds.type AS [data_space_type], p.rows, o.name AS [object_name] FROM sys.allocation_units au INNER JOIN sys.data_spaces ds ON au.data_space_id = ds.data_space_id INNER JOIN sys.partitions p ON au.container_id = p.partition_id INNER JOIN sys.objects o ON p.object_id = o.object_id WHERE au.type_desc = 'LOB_DATA' AND ds.name ='xyz'
0 linhas
Também tentei DBCC SHRINKFILE
com o parâmetro EMPTYFILE
antes de remover o arquivo do grupo de arquivos. Realmente não faz sentido para mim, no entanto, leio soluções para descrever isso como uma correção. Não teve efeito de qualquer maneira.
Eu tenho alguma esperança de ler esta pergunta com falha no servidor e tentei o seguinte:
- Atualizar todas as estatísticas
- Descarte todas as estatísticas que não estão relacionadas a índices
No entanto, isso não teve efeito. Ainda tenho um grupo de arquivos sem nenhum arquivo associado e o grupo de arquivos não pode ser excluído. Estou totalmente intrigado, pois isso acontece em alguns bancos de dados e não em outros (com a mesma estrutura). Quando executo DBCC CHECK FILEGROUP
neste grupo de arquivos vazio, recebo várias mensagens de erro como as seguintes:
Não é possível processar a identificação do conjunto de linhas 72057594712162304 do objeto "STORY_TRANSLATIONSCCC" (ID 120387498), índice "Ref90159CCC" (ID 2), porque reside no grupo de arquivos "CCC_APPLICATION_new" (ID 8), que não foi verificado.
Resultados do DBCC para 'STORY_TRANSLATIONSCCC'. Existem 0 linhas em 0 páginas para o objeto "STORY_TRANSLATIONSCCC".
Isso é normal ou aponta para algo incomum?
Essa pergunta pode ser uma duplicata, no entanto, não consigo encontrar uma correção de trabalho para mim em outras perguntas no dba.stackexchange. Por favor, dê uma olhada na lista do que eu já tentei. Isso é idêntico às soluções descritas em Não é possível remover grupos de arquivos não utilizados .
Mais detalhes
Talvez ajude a entender o que faço antes que o erro ocorra. Estou planejando uma migração para um novo servidor. Atualmente, estou testando isso em uma instância de teste. Os bancos de dados são restaurados a partir do servidor prod e o modelo de recuperação é alterado para simples. Meu objetivo é reestruturar os grupos de arquivos e passar de um modelo com um arquivo por grupo de arquivos para um modelo com dois arquivos por grupo de arquivos. Para conseguir isso, crio novos grupos de arquivos vazios com dois arquivos cada e movo os dados. Infelizmente, a maioria dos objetos possui dados LOB (XML e binários) ... então eu aproveito o particionamento como um auxiliar para mover os dados lob também. No final, todos os dados residem nos novos grupos de arquivos e os grupos de arquivos antigos estão vazios. Depois, removo todos os arquivos e também o respectivo grupo de arquivos. O grupo de arquivos primário permanece e apenas adiciona outro arquivo.pergunta minha . Esse processo funciona bem, mas em dois bancos de dados os arquivos podem ser excluídos, mas o grupo de arquivos não. Surpreendentemente, a estrutura desses bancos de dados deveria ser a mesma de outros bancos de dados, pois não foram encontrados problemas no processo de mover os dados e remover os grupos de arquivos antigos.
Então, aqui está uma lista de grupos de arquivos e arquivos dos dois bancos de dados em que o problema ocorre:
- CCC_GENTE
antes
+-----------------+------------+
| Filegroup | Filename |
+-----------------+------------+
| CCC_APPLICATION | CCC_APP |
+-----------------+------------+
| CCC_ARCHIVE | CCC_ARCHIV |
+-----------------+------------+
| CCC_AXN | CCC_AXN |
+-----------------+------------+
| CCC_GDV | CCC_GDV |
+-----------------+------------+
| PRIMARY | CCC |
+-----------------+------------+
depois de
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| Filegroup name | Filegroup temporary name | Filename (logical) | Status |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_APPLICATION | - | CCC_APP | file removed, filegroup cannot be removed (error) |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_ARCHIVE | - | CCC_ARCHIV | file and filegroup removed |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_AXN | - | CCC_AXN | file and filegroup removed |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_GDV | - | CCC_GDV | file and filegroup removed |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| PRIMARY | - | CCC | file renamed to PRIMARY_1 |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| PRIMARY | - | PRIMARY_2 | new file added |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_APPLICATION | CCC_APPLICATION_new | CCC_APPLICATION_1 | new filegroup renamed at the end |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_APPLICATION | CCC_APPLICATION_new | CCC_APPLICATION_2 | new filegroup renamed at the end |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_ARCHIVE | CCC_ARCHIVE_new | CCC_ARCHIVE_1 | new filegroup renamed at the end |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_ARCHIVE | CCC_ARCHIVE_new | CCC_ARCHIVE_2 | new filegroup renamed at the end |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_AXN | CCC_AXN_new | CCC_AXN_1 | new filegroup renamed at the end |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_AXN | CCC_AXN_new | CCC_AXN_2 | new filegroup renamed at the end |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_GDV | CCC_GDV_new | CCC_GDV_1 | new filegroup renamed at the end |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_GDV | CCC_GDV_new | CCC_GDV_2 | new filegroup renamed at the end |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
Espero que isto ajude um pouco. Há também um segundo banco de dados onde os nomes dos grupos de arquivos são diferentes, mas deixo isso de fora por uma questão de brevidade.
fonte
Respostas:
Grupos de arquivos de verificação dupla no banco de dados
Verifique se o grupo de arquivos não tem nenhum arquivo anexado emitindo o seguinte comando:
Isso produzirá uma lista de grupos de arquivos:
... e, em seguida, para cada grupo de arquivos listado, execute
A saída pode ser assim:
.... e a segunda saída pode ser:
Excluindo o grupo de arquivos
Se você ainda tiver um arquivo associado a um de seus grupos de arquivos, o comando completo para excluir o arquivo lógico e o próprio grupo de arquivos será:
O grupo de arquivos 'xyz' é padrão
Se você receber uma mensagem de erro ao tentar remover o arquivo lógico do grupo de arquivos parecido com este:
... então você terá que definir o grupo de
PRIMARY
arquivos como o grupo deDEFAULT
arquivos:O grupo de arquivos 'xyz' é somente leitura
No entanto, se a mensagem de erro for a seguinte:
... você precisará remover a propriedade READ_ONLY no grupo de
xyz
arquivos:Agora você deve poder descartar o arquivo lógico do grupo de arquivos e o próprio grupo de arquivos.
Transações em aberto
Se você realmente não possui um arquivo (nome_lógico / nome_do_arquivo_pilífico) associado ao grupo de arquivos
xyz
que está tentando excluir, a execução de um backup do log de transações pode liberar qualquer transação que impeça a exclusão adicional do grupo de arquivos.Dial 911
Se tudo mais falhar, considere abrir uma chamada com a Microsoft.
Incompatibilidade de Metadados
Adicionado após pesquisas adicionais
Aparentemente, existem casos em que os metadados no banco de dados não refletem a localização real dos objetos.
Referência:
- CORRECÇÃO: Erro de inconsistência de metadados após alternar partições de tabela e soltar arquivos e grupos de arquivos correspondentes (Suporte da Microsoft)
- CORREÇÃO: Erro ocorre quando você tenta soltar ou excluir grupos de arquivos ou esquemas e funções de partição no SQL Server (Suporte da Microsoft)
Esses dois casos parecem ter sido resolvidos com a Atualização Cumulativa 3 para o SQL Server 2014 SP1 e a Atualização Cumulativa 1 para o SQL Server 2016, respectivamente. Eles não se aplicam à sua situação, mas mostram que às vezes os metadados podem estar errados.
O item que parece estar bloqueando a exclusão do grupo de arquivos é o índice, que pode ser armazenado com metadados incorretos.
Solução possível
Considere a possibilidade de reconstruir o índice
Ref90159CCC
mencionado na mensagem de erro.O artigo a seguir descreve uma situação semelhante e mostra como o autor detectou o culpado e resolveu a situação.
Referência: SQL Server: problema de inconsistência na partição e nos metadados do comutador (Blog dbi-services.com)
Localizar objetos relacionados ao grupo de arquivos obsoleto
Eu montei esse script para verificar o máximo possível de esconderijos para tabelas / índices / partições / etc. que ainda possam estar relacionados ao arquivo do grupo de arquivos descartado:
Substitua
DEFAULTRO
pelo nome do seu grupo de arquivos obsoleto (por exemploCCC_APPLICATION
)Referência: Meu script pessoal
Execute-o e veja se algum objeto é exibido contendo seu grupo de arquivos obsoleto. Vá com o
data_space_id
e não com o nome. As junções são intencionalmenteFULL
para capturar quaisquer referências "órfãs".Como alternativa, use esse script menor para verificar rapidamente itens no grupo de arquivos obsoleto:
Referência: SQL SERVER - Listar todos os objetos criados em todos os grupos de arquivos no banco de dados (SQLAuthority.com)
fonte
...CCC_APPLICATION_new...
; esse é o grupo de arquivos temporário?) Mais algumas idéias e tentarei reproduzir no meu ambiente.Após quatro meses, o Suporte da Microsoft encontrou uma solução. Havia de fato uma tabela referente a esse grupo de arquivos presumivelmente vazio.
A tabela foi identificada pela seguinte declaração:
Após mover os dados para uma nova tabela e soltar a tabela problemática, o grupo de arquivos foi removido com êxito. O processo de mover os dados foi: criar uma nova tabela com a mesma estrutura e índices, copiar dados via SELECT INTO, soltar tabela antiga, renomear nova tabela (e, claro, cuidar de chaves estrangeiras, se houver alguma em todo o processo) )
fonte