Estou executando algumas SHRINKFILE
operações para limpar um monte de pequenos arquivos desnecessários em um grupo de arquivos. Para um dos encolhimentos, o comando abaixo resulta em um erro:
DBCC SHRINKFILE (N'myfile' , EMPTYFILE)'
O ID do arquivo x do ID do banco de dados x não pode ser reduzido, pois está sendo reduzido por outro processo ou está vazio
Não está vazio nem está sendo encolhido. Ele está sendo executado em um banco de dados que não está sendo usado atualmente por ninguém, exceto eu. A redução automática não está ativada e nunca foi. No entanto, não eram psiquiatras manuais realizadas nesse banco de dados em uma base regular antes de me colocar minhas mãos nele, se o que importa em tudo.
No SQLServerCentral , um encadeamento de uma década atrás sugere adicionar alguns MB ao arquivo porque "redefine um contador interno ou um comutador que indica que ele não está no meio de uma retração agora".
Isso funcionou - incrível. Mas alguém pode explicar com mais detalhes como / por que isso funciona em relação aos internos do SQL Server?
fonte
Respostas:
Eu dei uma olhada na página do cabeçalho do arquivo, conforme sugerido por Martin Smith nos comentários. Acho que isso faz parte da resposta, mas é principalmente especulação baseada na observação de alterações nos valores de sinalização da página de cabeçalho do arquivo entre a realização de encolhimentos e outras operações.
Primeiro, criei um banco de dados para testar, incluindo um grupo de arquivos secundário:
O que eu olhei na "página 0" para o arquivo secundário, que é file_id 3:
Há um campo chamado
m_flagBits
que tem um valor de0x208
.Se eu esvaziar este arquivo:
Esse
m_flagbits
campo permanece o mesmo (0x208
). Não é tão interessante, mas agora estou na situação que você relatou: se eu tentar esvaziar o arquivo novamente, recebo este erro:Vou tentar aumentar o arquivo (a solução que funcionou para você):
Agora
m_flagbits
é0x8
!Neste ponto, esvaziar o arquivo novamente com êxito retorna o valor
0x208
conforme o esperado.O que eu acho interessante é que, se eu fizer isso depois de aumentar o arquivo novamente (o valor do AKA flagbits é
0x8
):O arquivo está marcado como
is_read_only
nasys.databases
tabela em_flagbits
volta para0x208
. Portanto, parece que há um sinalizador de nível de arquivo semelhante definido ao reduzir um arquivo e ao defini-lo como somente leitura.Meu melhor palpite é que esse valor seja usado junto com algum outro sinalizador (interno) para indicar que um arquivo é elegível para ser reduzido. O aumento do arquivo parece desabilitar esse sinalizador (pelo menos o sinal visível
m_flagbits
).fonte