30

我正在尝试编写一个 T-SQL 例程,该例程根据数据库的逻辑名称使用DBCC SHRINKFILE收缩事务日志文件。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

假设一个标准数据库(例如只有一个日志文件),日志文件始终为 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 

--OR simply

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