J'exécute certaines SHRINKFILE
opérations pour nettoyer un tas de petits fichiers inutiles dans un groupe de fichiers. Pour l'un des rétrécissements, la commande ci-dessous entraîne une erreur:
DBCC SHRINKFILE (N'myfile' , EMPTYFILE)'
L'ID de fichier x de l'ID de base de données x ne peut pas être réduit car il est en cours de réduction par un autre processus ou est vide
Elle n'est ni vide ni rétrécie. Il est exécuté sur une base de données qui n'est actuellement utilisée par personne sauf moi. La réduction automatique n'est pas activée et ne l'a jamais été. Cependant, des rétrécissements manuels ont été effectués régulièrement sur cette base de données avant que je ne mette la main dessus, le cas échéant.
Sur SQLServerCentral , un fil d'il y a dix ans suggère d'ajouter quelques Mo au fichier car cela "réinitialise un compteur ou un commutateur interne qui lui indique qu'il n'est pas en train de se réduire maintenant".
Cela a fonctionné - génial. Mais quelqu'un peut-il expliquer plus en détail comment / pourquoi cela fonctionne en ce qui concerne les composants internes de SQL Server?
la source
Réponses:
J'ai fouillé dans la page d'en-tête du fichier, comme suggéré par Martin Smith dans les commentaires. Je pense que cela fait partie de la réponse, mais il s'agit principalement de spéculations basées sur l'observation des modifications des valeurs d'indicateur de page d'en-tête de fichier entre l'exécution de rétrécissements et d'autres opérations.
J'ai d'abord créé une base de données pour tester, y compris un groupe de fichiers secondaire:
J'ai regardé la "page 0" pour le fichier secondaire, qui est file_id 3:
Il y a un champ appelé
m_flagBits
qui a une valeur de0x208
.Si je vide ce fichier:
Ce
m_flagbits
champ reste le même (0x208
). Pas si intéressant, mais maintenant je suis dans la situation que vous avez signalée: si j'essaie de vider à nouveau le fichier, j'obtiens cette erreur:Je vais essayer d'agrandir le fichier (la solution qui a fonctionné pour vous):
Maintenant
m_flagbits
est0x8
!À ce stade, la vidange du fichier réussit à nouveau renvoie la valeur
0x208
comme vous pouvez vous y attendre.La chose que je trouve intéressante est que si je fais cela après avoir repoussé le fichier (la valeur des bits de drapeau AKA est
0x8
):Le fichier est marqué comme
is_read_only
dans lesys.databases
tableau etm_flagbits
est remis à0x208
. Il semble donc qu'un indicateur de niveau de fichier similaire soit défini lors de la réduction d'un fichier et lors de sa définition en lecture seule.Ma meilleure supposition est que cette valeur est utilisée avec un autre indicateur (interne) pour indiquer qu'un fichier peut être réduit. Agrandir le fichier semble désactiver ce drapeau (au moins celui visible dans
m_flagbits
).la source