如何在SQL Server 2005中获取事务日志的逻辑名称

31

我正试图编写一个T-SQL例程,根据数据库的逻辑名称使用DBCC SHRINKFILE来收缩事务日志文件。 DB_NAME()函数可以给出数据库的逻辑名称。那么是否有相应的函数可以查找事务日志的逻辑名称呢?如果没有,是否还有其他方法可以获取这些信息?默认情况下,事务日志的名称是<<Database Name>>_log,但我不想依赖于此。

4个回答

48

你可以使用:

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

所有数据库的日志文件类型均为type = 1,可以在sys.master_files中找到所有数据库的所有文件。

编辑:

我应该指出,你不应该定期缩小你的日志文件。你的事务日志应该适当地调整大小,以使其永远不必增长,并且保持该大小。事务日志无法进行即时文件初始化,并且在添加空间时必须将其清零,这是一项缓慢的顺序操作,会降低性能。


2
请注意,同一实例上的不同数据库可能使用相同的日志名称。因此,在执行DBCC SHRINKFILE('逻辑日志名称',大小)之前,您应该先输入use [MyDatabase]以确保您正在正确的数据库中操作。 - JohnLBevan

15
假设使用标准数据库(例如只有一个日志文件),则日志文件始终为 file_id = 2。即使您有多个数据文件(id = 3+ 用于 NDFs),也是如此。 DBCC 也需要文件 id。因此,DBCC SHRINKFILE (2...) 总是有效的。您不能在 DBCC 中参数化,因此这避免了动态 SQL。如果您想要名称,请使用 FILE_NAME(2)。

6
select Name
from sys.database_files

生成:
SomeDb_Data  
SomeDb_Log

SqlServer 2012


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)' 

2
欢迎来到Stack Overflow!虽然这段代码可能解决了问题,但是包括解释它如何以及为什么解决了问题将有助于提高您的帖子质量,并可能导致更多的赞。请记住,您正在回答未来读者的问题,而不仅仅是现在提问的人。请[编辑]您的答案以添加解释并指出适用的限制和假设。 - Yunnosch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接