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

Posted

技术标签:

【中文标题】如何在 SQL Server 2005 中获取事务日志的逻辑名称【英文标题】:How to get the logical name of the transaction log in SQL Server 2005 【发布时间】:2010-11-28 23:41:16 【问题描述】:

我正在尝试编写一个 T-SQL 例程,它根据数据库的逻辑名称使用 DBCC SHRINKFILE 来收缩事务日志文件。 DB_NAME() 函数为您提供数据库的逻辑名称。事务日志是否有等效的日志?如果没有,是否有其他方法可以获取此信息?事务日志的默认名称是<<Database Name>>_log,但我宁愿不依赖它。

【问题讨论】:

【参考方案1】:

你可以使用:

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

对于任何 database_id,日志文件的类型 = 1,所有数据库的所有文件都可以在 sys.master_files 中找到。

编辑:

我应该指出,您不应该定期缩减日志。您的事务日志的大小应该适当,以防止它不得不增长,然后保持该大小。事务日志不能被即时文件初始化,并且必须在向其添加空间时清零,这是一个缓慢的顺序操作,会降低性能。

【讨论】:

ps。请注意,同一实例上的不同数据库可能使用相同的日志名称。因此,除了输入 DBCC SHRINKFILE('logical log name', size) 之外,您还应该首先输入 use [MyDatabase] 以确保您在正确的数据库中工作。【参考方案2】:

假设一个标准数据库(例如只有一个日志文件),日志文件始终为 file_id = 2。即使您有多个数据文件(对于 NDF,id = 3+),这也适用。

DBCC 也采用文件 ID。因此,DBCC SHRINKFILE (2...) 将始终有效。您不能在 DBCC 内部进行参数化,这样可以避免动态 SQL。如果您想要名称,请使用FILE_NAME(2)。

【讨论】:

【参考方案3】:
select Name
from sys.database_files

生成,

SomeDb_Data  
SomeDb_Log

SqlServer 2012

【讨论】:

【参考方案4】:
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)' 

【讨论】:

欢迎来到 Stack Overflow!虽然这段代码可以解决问题,including an explanation 解决问题的方式和原因确实有助于提高帖子的质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。

以上是关于如何在 SQL Server 2005 中获取事务日志的逻辑名称的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2005 事务复制性能

SQL Server 2005 - 无法回滚嵌套事务

SQL Server 2005:读取提交事务隔离级别中的键范围锁?

SQL Server 2005 事务复制无法发布包含索引创建的存储过程

SQL Server 2005 事务日志条目:LOP_Format_Page

如何在 sql server 2005 中获取 x 和 y 之间的日期表