web-dev-qa-db-ja.com

DBCC SHRINKFILEはfile_idで機能しますが、論理名では機能しません

データベースファイルを縮小しようとしていますが、エラーが発生しています。

sys.database_filesのfile_idを使用しても機能しますが、論理ファイル名を使用するとエラーが発生します。

論理ファイル名は両方のステートメントで同じであるため、問題にはなりません。また、接続しているデータベースも同じです。以下は期待どおりに機能します。

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

しかし、次の...

DBCC SHRINKFILE ('XY' , 0, TRUNCATEONLY)

...エラー8985が発生します。

メッセージ8985、レベル16、状態1、行1
sys.database_filesでデータベース '<my database>'のファイル 'XY'を見つけることができませんでした。ファイルが存在しないか、削除されました。

9
DotNetDeveloper

私の回答を修正しましたが、テストが機能しない正当な理由としてテストは示されませんでした。

チェックすることのカップル

  1. ファイル名の先頭または末尾にスペースがありますか?
  2. 最近偶然にSP3にアップグレードしましたか?

復旧モデルを完全から単純に切り替え、もう一度完全に切り替えてみてください。 SP3に更新するときに明らかなバグがあります。復旧モデルを変更すると、ログシーケンス番号がリセットされ、少なくとも一時的には問題を解決する理由が何であれ.

これに関するsocial.msdn会話

6
Cougar9000

@ Cougar9000によって提供された回答とリンクを確認した後:はい、最近SP3にアップグレードしました!次に、復旧モデルをシンプルからフルに切り替え、シンプルに戻しました。そしてステートメント

DBCC SHRINKFILE ('XY' , 0, TRUNCATEONLY)

動作します。

ここで何が起こっているのか誰か知っていますか?それはバグですか?

3
DotNetDeveloper

実行してみてください

select * from sys.database_files

データベースを使用してから、dbをマスターします。 dbを使用している場合にのみ、dbのログファイルとデータベースファイルが表示されます。

そう -

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

      DBCC SHRINKFILE (@fileId, 0, TRUNCATEONLY)

そして

DBCC SHRINKFILE ('XY' , 0, TRUNCATEONLY)

同じデータベースを使用している限り、どちらも機能します。

1
Mukus

上記のすべてを試しましたが、まだ問題がありました。データベースはclientdatabaseと呼ばれ、ログファイルclientdatabase_log

ログファイルの論理名を変更することで解決できました。

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

(新しい論理名で)トランザクションログを圧縮するためのスクリプトを再実行すると、機能するようになりました。

私はそれについてここでブログに書いた:

「sys.database_filesでデータベース ‘xxx’のファイル ‘xxx_Log’が見つかりませんでした」への回答

0
The Hamish

Sys.master_filesとsys.database_filesの両方で論理ファイル名が同じかどうかを確認する必要があります。この場合は異なります。次に、データベースを変更して、ファイルに新しい論理名を付けます。両方のテーブルが更新され、GUIまたは論理ファイル名を使用して縮小できます。 SQL Server 2012でも同じエラーが発生しました。これで問題が解決しました。

0
Joanna Piasecka