Ich SHRINKFILE
führe einige Vorgänge aus, um ein paar winzige, unnötige Dateien in einer Dateigruppe zu bereinigen. Bei einem der Shrinks führt der folgende Befehl zu einem Fehler:
DBCC SHRINKFILE (N'myfile' , EMPTYFILE)'
Die Datei-ID x der Datenbank-ID x kann nicht verkleinert werden, da sie entweder von einem anderen Prozess verkleinert wird oder leer ist
Es ist weder leer noch geschrumpft. Es wird in einer Datenbank ausgeführt, die derzeit nur von mir selbst verwendet wird. Das automatische Verkleinern ist nicht aktiviert und war es nie. Es wurden jedoch regelmäßig manuelle Verkleinerungen an dieser Datenbank durchgeführt, bevor ich sie in die Hände bekam, wenn das überhaupt wichtig ist.
In SQLServerCentral schlägt ein Thread aus einem Jahrzehnt vor, der Datei einige MB hinzuzufügen, da dies "einen internen Zähler oder Schalter zurücksetzt, der angibt , dass er sich gerade nicht in der Mitte eines Schrumpfens befindet".
Das hat funktioniert - super. Aber kann jemand genauer erklären, wie / warum dies in Bezug auf SQL Server-Interna funktioniert?
quelle
Antworten:
Ich stöberte in der Datei-Header-Seite herum, wie von Martin Smith in den Kommentaren vorgeschlagen. Ich denke, dies ist Teil der Antwort, aber es handelt sich hauptsächlich um Spekulationen, die auf der Beobachtung von Änderungen an den Flag-Werten der Dateikopfzeilen-Seite zwischen dem Ausführen von Verkleinerungen und anderen Vorgängen beruhen.
Zuerst habe ich eine Datenbank zum Testen erstellt, einschließlich einer sekundären Dateigruppe:
Ich habe auf "Seite 0" nach der sekundären Datei gesucht, die file_id 3 ist:
Es gibt ein Feld mit
m_flagBits
dem Wert0x208
.Wenn ich diese Datei leere:
Dieses
m_flagbits
Feld bleibt gleich (0x208
). Nicht so interessant, aber jetzt bin ich in der Situation, die Sie gemeldet haben: Wenn ich versuche, die Datei erneut zu leeren, wird folgende Fehlermeldung angezeigt:Ich werde versuchen, die Datei zu erweitern (die Lösung, die für Sie funktioniert hat):
Jetzt
m_flagbits
ist0x8
!Zu diesem Zeitpunkt ist das erneute Leeren der Datei erfolgreich, und der Wert wird
0x208
wie erwartet zurückgegeben.Das, was ich interessant finde, ist, dass wenn ich dies nach dem Zurückwachsen der Datei mache (AKA Flagbits-Wert ist
0x8
):Die Datei ist wie
is_read_only
in dersys.databases
Tabelle markiert undm_flagbits
wird auf zurückgesetzt0x208
. Es scheint also, dass ein ähnliches Flag auf Dateiebene gesetzt ist, wenn eine Datei verkleinert und auf schreibgeschützt gesetzt wird.Ich vermute, dass dieser Wert zusammen mit einem anderen (internen) Flag verwendet wird, um anzuzeigen, dass eine Datei verkleinert werden kann. Wenn Sie die Datei vergrößern, wird dieses Flag anscheinend deaktiviert (zumindest das in
m_flagbits
).quelle