Przeprowadzam kilka SHRINKFILE
operacji, aby oczyścić kilka małych, niepotrzebnych plików w grupie plików. W przypadku jednego z obkurczeń poniższe polecenie powoduje błąd:
DBCC SHRINKFILE (N'myfile' , EMPTYFILE)'
Identyfikator pliku x identyfikatora bazy danych x nie może zostać zmniejszony, ponieważ jest on zmniejszany przez inny proces lub jest pusty
Nie jest pusty ani się nie kurczy. Jest uruchamiany w bazie danych, która nie jest obecnie używana przez nikogo oprócz mnie. Automatyczne zmniejszanie nie jest włączone i nigdy nie było. Jednak w tej bazie danych regularnie dokonywano ręcznych obkurczeń, zanim dotarłem do niej, jeśli to w ogóle ma znaczenie.
W SQLServerCentral wątek sprzed dekady sugeruje dodanie do pliku kilku MB, ponieważ to „resetuje wewnętrzny licznik lub przełącznik, który mówi, że nie jest teraz w trakcie zmniejszania”.
To zadziałało - niesamowite. Ale czy ktoś może bardziej szczegółowo wyjaśnić, w jaki sposób / dlaczego to działa w odniesieniu do wewnętrznych elementów SQL Server?
źródło
Odpowiedzi:
Przeszukiwałem stronę nagłówka pliku, jak sugerował Martin Smith w komentarzach. Myślę, że jest to część odpowiedzi, ale jest to głównie spekulacja oparta na obserwowaniu zmian wartości flag strony nagłówka pliku między wykonywaniem skurczów a innymi operacjami.
Najpierw utworzyłem bazę danych do testowania, w tym dodatkową grupę plików:
Spojrzałem na „stronę 0” dla drugiego pliku, którym jest file_id 3:
Istnieje pole o nazwie,
m_flagBits
które ma wartość0x208
.Jeśli opróżnię ten plik:
To
m_flagbits
pole pozostaje takie samo (0x208
). Nie tak interesujące, ale teraz jestem w sytuacji, którą zgłosiłeś: jeśli spróbuję ponownie opróżnić plik, pojawia się ten błąd:Spróbuję rozbudować plik (rozwiązanie, które Ci się udało):
Teraz
m_flagbits
jest0x8
!W tym momencie ponowne opróżnienie pliku zakończy się powodzeniem i zwraca wartość,
0x208
zgodnie z oczekiwaniami.Interesujące jest dla mnie to, że jeśli zrobię to po wyodrębnieniu pliku (wartość flagówek AKA to
0x8
):Plik jest oznaczony jak
is_read_only
wsys.databases
tabeli im_flagbits
ustawiony jest z powrotem na0x208
. Wygląda więc na to, że podczas zmniejszania pliku i ustawiania go jako tylko do odczytu ustawiono podobną flagę na poziomie pliku.Domyślam się, że ta wartość jest używana wraz z jakąś inną (wewnętrzną) flagą wskazującą, że plik kwalifikuje się do zmniejszenia. Wydaje się, że powiększenie pliku powoduje wyłączenie tej flagi (przynajmniej tej widocznej w
m_flagbits
).źródło