DBCC SHRINKFILE arbeitet mit file_id, jedoch nicht mit logischem Namen

9

Ich versuche, eine Datenbankdatei zu verkleinern, aber es treten Fehler auf.

Die Verwendung der Datei-ID von sys.database_filesfunktioniert, aber die Verwendung des logischen Dateinamens führt zu einem Fehler.

Der logische Dateiname ist in beiden Anweisungen gleich, sodass dies nicht das Problem sein kann. Auch die Datenbank, mit der eine Verbindung hergestellt wird, ist dieselbe. Folgendes funktioniert wie erwartet:

declare @fileId as int = (select file_id from sys.database_files where name = 'XY')
DBCC SHRINKFILE (@fileId, 0, TRUNCATEONLY)

Jedoch die folgenden ...

DBCC SHRINKFILE ('XY' , 0, TRUNCATEONLY)

... führt zu Fehler 8985:

Nachricht 8985, Ebene 16,
Status 1, Zeile 1 Die Datei 'XY' für die Datenbank '<meine Datenbank>' in sys.database_files konnte nicht gefunden werden. Die Datei existiert entweder nicht oder wurde gelöscht.

DotNetDeveloper
quelle
1
Haben Sie es ohne einfache Anführungszeichen versucht? DBCC SHRINKFILE (XY, 0, TRUNCATEONLY)
Thomas Stringer
@ ThomasStringer Ja, es gibt mir den gleichen Fehler.
DotNetDeveloper
1
Was ist der tatsächliche logische Dateiname? Hat es irgendwelche ungeraden Zeichen oder Leerzeichen? Kannst du das posten?
Thomas Stringer
@ThomasStringer Es sind nur normale Zeichen, keine Sonderzeichen oder Leerzeichen oder Zahlen und keine Umlaute usw. Nur Groß- und Kleinbuchstaben. Es ist ähnlich wie "DotNetDev".
DotNetDeveloper
1
Was passiert, wenn Sie sagen DECLARE @filename SYSNAME; SELECT @filename = name FROM sys.database_files ...);und dann @filenameim Argument verwenden DBCC?
Aaron Bertrand

Antworten:

6

Ich habe meine Antwort überarbeitet und Tests nicht als gültigen Grund dafür angezeigt, dass sie nicht funktionieren.

Ein paar Dinge zu überprüfen

  1. Gibt es führende oder nachfolgende Leerzeichen im Dateinamen?
  2. Haben Sie kürzlich zufällig auf SP3 aktualisiert?

Versuchen Sie, das Wiederherstellungsmodell wieder von vollständig auf einfach und wieder auf voll umzustellen. Beim Aktualisieren auf SP3 ist ein Fehler aufgetreten. Durch Ändern des Wiederherstellungsmodells wird die Protokollsequenznummer und aus irgendeinem Grund, der das Problem behebt, zumindest vorübergehend zurückgesetzt.

social.msdn Gespräch darüber

Cougar9000
quelle
Dies wurde bereits von @thomasStringer vorgeschlagen. Das OP erhält einen Fehler. Bitte beachten Sie die Kommentare.
Kin Shah
Einverstanden. Lassen Sie OP zurückkehren und sehen Sie, dass möglicherweise auch ein Kollatierungsproblem vorliegt. Prost !
Kin Shah
@ Cougar9000 Keine führenden oder nachfolgenden Leerzeichen. Und die Auswahl des logischen Namens aus sys.database_files funktioniert gemäß meinem OP einwandfrei. Und ja, wir haben vor ein paar Wochen ein Upgrade auf SP3 durchgeführt. Aber wo liegt der Zusammenhang zwischen diesem Problem und SP3?
DotNetDeveloper
@ Cougar9000 Upvoted, weil du mich in die richtige Richtung zeigst. Im Moment bin ich mir nicht sicher, warum das Setzen des Wiederherstellungsmodells auf "Voll" und "Zurück auf" Einfach "mein Problem gelöst hat. Wenn jemand etwas Licht ins Dunkel bringen kann, wäre das großartig. Oder ist das einfach ein Fehler?
DotNetDeveloper
@DotNetDeveloper Soweit ich weiß, handelt es sich um einen Fehler, den sie noch nicht identifiziert haben. Durch Ändern des Wiederherstellungsmodells wird die Protokollsequenznummer zurückgesetzt. Aus welchem ​​Grund auch immer, das klärt das Problem. Ich
bin
3

Nachdem wir uns die Antwort und den Link von @ Cougar9000 angesehen haben: Ja, wir haben kürzlich ein Upgrade auf SP3 durchgeführt! Ich habe dann das Wiederherstellungsmodell von einfach auf vollständig und zurück auf einfach umgestellt. Und dann die Aussage

DBCC SHRINKFILE ('XY' , 0, TRUNCATEONLY)

funktioniert.

Weiß jemand, was hier los ist? Ist das ein Fehler?

DotNetDeveloper
quelle
1

Versuche zu rennen

   

select * from sys.database_files

indem Sie Ihre Datenbank verwenden und dann db master. Sie sehen die Protokoll- und Datenbankdateien Ihrer Datenbank nur, wenn Sie Ihre Datenbank verwenden.

Damit - 

     

declare @fileId as int = (select file_id from sys.database_files where name = 'XY')

      DBCC SHRINKFILE (@fileId, 0, TRUNCATEONLY)

und

   

DBCC SHRINKFILE ('XY' , 0, TRUNCATEONLY)

Beide funktionieren, solange Sie dieselbe Datenbank verwenden.

Mukus
quelle
0

Sie müssen überprüfen, ob der logische Dateiname an beiden Stellen sys.master_files und sys.database_files identisch ist. In diesem Fall wird es anders sein. Ändern Sie dann einfach die Datenbank und geben Sie der Datei einen neuen logischen Namen, den Sie haben möchten. Beide Tabellen werden aktualisiert, und dann können Sie in der GUI oder unter Verwendung des logischen Dateinamens verkleinern. Ich hatte den gleichen Fehler in SQL Server 2012, dies hat das Problem behoben.

Joanna Piasecka
quelle
0

Ich habe alles versucht und hatte immer noch das Problem. Datenbank wurde aufgerufen clientdatabaseund die Protokolldatei clientdatabase_log.

Ich konnte es beheben, indem ich den logischen Namen der Protokolldatei umbenannte:

USE [clientdatabase];
ALTER DATABASE clientdatabase MODIFY FILE 
(NAME = clientdatabase_log, NEWNAME = clientdatabase_log_1);

Das erneute Ausführen des Skripts zum Verkleinern des Transaktionsprotokolls (mit dem neuen logischen Namen) hat jetzt funktioniert.

Ich habe hier darüber gebloggt:

Antwort auf "Datei 'xxx_Log' für Datenbank 'xxx' in sys.database_files konnte nicht gefunden werden"

Der Hamish
quelle