30

データベースの論理名に基づいてDBCCSHRINKFILEを使用して、トランザクションログファイルを縮小するT-SQLルーチンを作成しようとしています。このDB_NAME()関数は、データベースの論理名を提供します。トランザクションログに相当するものはありますか?そうでない場合、この情報を取得する他の方法はありますか?トランザクションログのデフォルト名はですが<<Database Name>>_log、私はこれに依存したくありません。

4

4 に答える 4

47

次を使用できます。

SELECT name
FROM sys.master_files
WHERE database_id = db_id()
  AND type = 1

ログファイルのタイプはすべてのdatabase_idに対して1であり、すべてのデータベースのすべてのファイルはsys.master_filesにあります。

編集:

定期的にログを縮小するべきではないことを指摘しておく必要があります。トランザクションログは、拡大する必要がないように適切なサイズにしてから、そのサイズのままにしておく必要があります。トランザクションログをインスタントファイルで初期化することはできず、スペースが追加されたときにゼロにする必要があります。これは、パフォーマンスを低下させる低速のシーケンシャル操作です。

于 2009-09-16T23:09:09.787 に答える
15

標準データベース(たとえば、1つのログファイルのみ)を想定すると、ログファイルは常にfile_id = 2です。これは、複数のデータファイル(NDFの場合はid = 3+)がある場合でも適用されます。

DBCCもファイルIDを取得します。だから、DBCC SHRINKFILE (2...)常に動作します。DBCC内でパラメーター化することはできないため、動的SQLを回避できます。名前が必要な場合は、FILE_NAME(2)を使用します。

于 2009-09-17T05:56:04.287 に答える
6
select Name
from sys.database_files

生成し、

SomeDb_Data  
SomeDb_Log

SqlServer 2012

于 2014-10-18T14:29:30.980 に答える
2
DECLARE @command varchar(1000) 
SELECT @command = 'USE [?] DBCC SHRINKFILE (2 , 0, TRUNCATEONLY)' 
EXEC sp_MSforeachdb @command 

-または単に

EXEC sp_MSforeachdb 'USE [?] DBCC SHRINKFILE (2 , 0, TRUNCATEONLY)' 
于 2021-05-11T05:55:57.023 に答える