Я выполняю некоторые SHRINKFILE
операции, чтобы очистить кучу мелких ненужных файлов в файловой группе. Для одного из сокращений приведенная ниже команда приводит к ошибке:
DBCC SHRINKFILE (N'myfile' , EMPTYFILE)'
Идентификатор файла x базы данных с идентификатором x нельзя сжать, поскольку он либо сокращен другим процессом, либо пуст
Это не пусто и не сокращено. Он запускается в базе данных, которая в настоящее время не используется никем, кроме меня. Автоусадка не включена и никогда не была. Тем не менее, были ручные психиатры , выполненные в этой базе данных на регулярной основе до меня получать мои руки на нем, если это имеет значение вообще.
В SQLServerCentral поток, созданный десять лет назад, предлагает добавить в файл несколько МБ, так как он «сбрасывает внутренний счетчик или переключатель, который сообщает, что сейчас не происходит сокращения».
Это сработало - потрясающе. Но кто-нибудь может объяснить более подробно, как / почему это работает в отношении внутренних компонентов SQL Server?
источник
Ответы:
Я искал в заголовке файла, как это было предложено Мартином Смитом в комментариях. Я думаю, что это часть ответа, но в основном это спекуляция, основанная на наблюдении за изменениями значений флага страницы заголовка файла между выполнением сжатия и другими операциями.
Сначала я создал базу данных для тестирования, включая вторичную файловую группу:
Я посмотрел на «страницу 0» для вторичного файла, который является file_id 3:
Есть поле с именем,
m_flagBits
которое имеет значение0x208
.Если я опустошу этот файл:
Это
m_flagbits
поле остается неизменным (0x208
). Не очень интересно, но теперь я нахожусь в ситуации, о которой вы сообщили: если я попытаюсь очистить файл снова, я получу эту ошибку:Я попробую вырастить файл (решение, которое сработало для вас):
Сейчас
m_flagbits
есть0x8
!На этом этапе повторная очистка файла возвращает значение,
0x208
как вы могли ожидать.Что мне кажется интересным, так это то, что если я сделаю это после того, как вырасту файл обратно (значение флажка AKA равно
0x8
):Файл помечен как
is_read_only
вsys.databases
таблице иm_flagbits
установлен обратно0x208
. Таким образом, кажется, есть некоторый подобный флаг уровня файла, установленный при сжатии файла и при установке его только для чтения.Мое лучшее предположение состоит в том, что это значение используется вместе с некоторым другим (внутренним) флагом, чтобы указать, что файл может быть сжат. Увеличение файла, по-видимому, снимает этот флаг (по крайней мере, тот, который виден в
m_flagbits
).источник