J'essaie de réduire un fichier de base de données mais je rencontre des erreurs.
Utilisation du file_id de sys.database_files
fonctionne, mais l'utilisation du nom de fichier logique génère une erreur.
Le nom de fichier logique est le même dans les deux instructions, ce qui ne peut pas être le problème. De plus, la base de données à laquelle vous êtes connecté est la même. Les travaux suivants fonctionnent comme prévu:
declare @fileId as int = (select file_id from sys.database_files where name = 'XY')
DBCC SHRINKFILE (@fileId, 0, TRUNCATEONLY)
Cependant, ce qui suit ...
DBCC SHRINKFILE ('XY' , 0, TRUNCATEONLY)
... entraînera l'erreur 8985:
Msg 8985, niveau 16, état 1, ligne 1
Impossible de localiser le fichier 'XY' pour la base de données '<ma base de données>' dans sys.database_files. Le fichier n'existe pas ou a été supprimé.
Révisé ma réponse, les tests ne se sont pas révélés être une raison valable pour que cela ne fonctionne pas.
Quelques choses à vérifier
Essayez de basculer le modèle de récupération de plein à simple, puis à nouveau à plein. Il y a un bug apparent lors de la mise à jour vers SP3. La modification du modèle de récupération réinitialise le numéro de séquence du journal et, pour quelque raison que ce soit, qui résout le problème, au moins temporairement.
Après avoir regardé la réponse et le lien fourni par @ Cougar9000: Oui, nous avons récemment mis à niveau vers SP3! J'ai ensuite changé le modèle de récupération de simple à complet et de nouveau à simple. Et puis la déclaration
DBCC SHRINKFILE ('XY' , 0, TRUNCATEONLY)
travaux.
Quelqu'un sait-il ce qui se passe ici? Est-ce un bug?
Essayez de courir
select * from sys.database_files
en utilisant votre base de données, puis maîtrisez db. Vous verrez les fichiers journaux et de base de données de votre base de données uniquement lorsque vous utilisez votre base de données.
Donc -
declare @fileId as int = (select file_id from sys.database_files where name = 'XY')
DBCC SHRINKFILE (@fileId, 0, TRUNCATEONLY)
et
DBCC SHRINKFILE ('XY' , 0, TRUNCATEONLY)
les deux fonctionnent tant que vous utilisez la même base de données.
J'ai essayé tout ce qui précède et j'ai toujours eu le problème. La base de données s'appelait clientdatabase
et le fichier journal clientdatabase_log
.
J'ai réussi à le résoudre en renommant le nom logique du fichier journal:
USE [clientdatabase];
ALTER DATABASE clientdatabase MODIFY FILE
(NAME = clientdatabase_log, NEWNAME = clientdatabase_log_1);
La réexécution du script pour réduire le journal des transactions (avec le nouveau nom logique) a maintenant fonctionné.
J'ai blogué à ce sujet ici:
Vous devez vérifier si le nom du fichier logique est le même aux deux endroits sys.master_files et sys.database_files. Dans ce cas, ce sera différent. Ensuite, modifiez simplement la base de données en donnant au fichier un nouveau nom logique que vous souhaitez avoir. Les deux tables seront mises à jour et vous pourrez alors réduire l'interface graphique ou utiliser le nom de fichier logique. J'ai eu la même erreur dans SQL Server 2012, cela a résolu le problème.