J'ai trop de fichiers de données secondaires (.ndf) créés pour tempdb
. Pour supprimer les fichiers excédentaires, je dois vider le fichier (le contenu sera déplacé vers d'autres fichiers):
DBCC SHRINKFILE('tempdbfile8', EMPTYFILE);
puis supprimez le fichier:
ALTER DATABASE tempdb REMOVE FILE tempdbfile8;
Mais la EMPTYFILE
commande renvoie l'erreur:
DBCC SHRINKFILE: Page 8:41920 could not be moved because it is a work table page.
Msg 2555, Level 16, State 1, Line 2
Cannot move all contents of file "tempdbfile8" to other places to complete the emptyfile operation.
Ne vous inquiétez pas, il me suffit de localiser l'objet qui utilise cette page pour y remédier:
DBCC TRACEON (3604)
DBCC PAGE(2,8,41920) --dbid=2, fileid=8, pageid=41920
La commande renvoie de nombreuses informations, parmi lesquelles object_id. Mais:
Metadata: ObjectId = 0
Je ne sais pas quoi faire à ce sujet. Quel chat empêche cette page d'être déplacée? Comment localiser cet objet, ce processus, cette session ou quoi que ce soit? Toute aide sera appréciée, mais veuillez noter que tout laisser tel quel ou supprimer un autre fichier à la place n'est pas une solution valide à ce problème;).
ÉDITER:
Je supprime les fichiers, car nous avions l'habitude de suivre la "meilleure pratique" de création d'un fichier par cœur de processeur (même taille initiale, même taux de croissance). Mais pour autant que je sache, tant que vous ne rencontrez pas de problèmes de contention, il est inutile de créer des fichiers tempdb supplémentaires sur le même appareil. Dans notre cas, cela a du sens, car nous avons MPIO activé et le périphérique de stockage peut gérer 4 chemins. Mais il y a eu une erreur et nous nous sommes retrouvés avec un total de 5 fichiers avec un processeur à 6 cœurs. C'est plus que des chemins MPIO, moins que des cœurs de CPU, et ce n'est pas un nombre pair. Cela peut ne causer aucun problème, mais ne semble pas correct :).
J'ai finalement pu vider et supprimer le fichier sans redémarrer le serveur en définissant l'une des bases de données (que je soupçonnais de provoquer le problème) en mode mono-utilisateur (restauration immédiate). Cela a fonctionné, mais j'ai eu de la chance. Ce que je veux vraiment, c'est être toujours en mesure de retrouver la page :).
dbcc page ( {'dbname' | dbid}, filenum, pagenum [, printopt={0|1|2|3} ])
propos de votre solution: cela fonctionnerait, mais j'aimerais vraiment le faire sans arrêter l'instance.