Não consigo excluir um grupo de arquivos. Estou recebendo o erro padrão: "O grupo de arquivos '~~~~' não pode ser removido porque não está vazio." Eu tenho procurado na internet e ainda não consigo encontrar a resposta. A versão do servidor é Microsoft SQL Server 2019.
Eu passei por ambos muito bem:
- Encontrando Dados em Arquivo/Grupo de Arquivos
- Não é possível remover grupos de arquivos não utilizados
Coisas que verifiquei para ver se há alguma associação com o grupo de arquivos:
- arquivos: 0
- alocação_unidades: 0
- índices: 0
- esquemas de partição: 0
- funções de partição: 0
- partições: 0
Eu também executei DBCC CHECKFILEGROUP e não mostra nada também. Estou realmente muito confuso. Alguém pode me ajudar a descobrir o que mais poderia estar me impedindo de descartar este grupo de arquivos?
Divulgação completa, estou usando um módulo que escrevi:
https://github.com/tcartwright/tcdbtools/blob/main/docs/Invoke-DBSafeShrink.md
O módulo executa as seguintes etapas:
- cria um arquivo temporário e um grupo de arquivos
- move índices clusterizados, índices não clusterizados, LOBS e heaps para o novo grupo de arquivos
- reduz o grupo de arquivos original
- move todos os objetos originais de volta para o grupo de arquivos de origem
- remove o grupo de arquivos temporários
Como parte da movimentação dos LOBs, estou usando este truque da Kimberly Tripp para movê-los: https://www.sqlskills.com/blogs/kimberly/understanding-lob-data-20082008r2-2012/
EDIT: Acho que descobri o que está bloqueando a queda, mas não consigo descobrir como consertar. Esta consulta:
SELECT * FROM sys.[tables] AS [t] WHERE [t].[lob_data_space_id] IN (
SELECT [ds].[data_space_id] FROM sys.[data_spaces] AS [ds] WHERE [ds].[name] <> 'PRIMARY'
)
retorna uma tabela que não possui nenhum dado LOB associado nas unidades de alocação. Também não consigo descobrir como me livrar disso. Eu tenho:
- caiu e recriou o PK para esta tabela
- reconstruiu todos os índices na tabela e
Nada disso ajudou.
Eu acho que há objetos nesse grupo de arquivos com certeza, então, primeiro você pode querer saber o que é, este script pode ajudar
depois disso, mudar de local ou soltar esses objetos permitirá que você solte o FG
Ok, finalmente descobri. Antes de entrar na correção, deixe-me teorizar sobre o que acho que pode ter acontecido. Estou usando o truque de partição para mover dados LOB de um FG para outro. Combinado com o fato de que a parte do processo de movimentação usando CREATE INDEX (DROP_EXISTING = ON) faz com que o índice seja reconstruído.
Acho que quando o índice foi reconstruído no novo FG, possivelmente todos os dados LOB foram movidos para a linha, eliminando a unidade de alocação LOB_DATA. No entanto, o lob_dataspace_id permaneceu definido para o novo FG após a mudança. Fazendo com que eu não consiga apagá-lo.
Quando o código foi movê-lo de volta, ele não viu nenhum LOB_DATA alocado e não usou o truque da partição para mover o índice de volta.
Para corrigir isso, precisei mover o índice de volta para PRIMARY usando o mesmo truque de partição.
Modifiquei o código para também inspecionar as tabelas lob_dataspace_id para determinar se o FG para o qual estou mudando não é o mesmo. Em seguida, ele utilizará o truque da partição para mover o índice de volta e fará com que o lob_dataspace_id seja redefinido.
Depois de mover o índice para frente e para trás para PRIMARY usando o truque da partição, consegui excluir o grupo de arquivos com êxito.