web-dev-qa-db-fra.com

DBCC SHRINKFILE fonctionne avec file_id mais pas avec le nom logique

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é.

9
DotNetDeveloper

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

  1. Y a-t-il des espaces de début ou de fin dans le nom de fichier?
  2. Avez-vous récemment mis à niveau vers SP3 par hasard?

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.

conversation social.msdn à ce sujet

6
Cougar9000

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?

3
DotNetDeveloper

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.

1
Mukus

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:

Réponse à "Impossible de localiser le fichier" xxx_Log "pour la base de données" xxx "dans sys.database_files"

0
The Hamish

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.

0
Joanna Piasecka