缩小日志文件不会减小大小

Nav*_*eet 28 sql-server shrink dbcc database-size transaction-log

我有一个数据库,它有一个350 MB 的数据文件(.mdf) 和一个4.9 GB 的日志文件(.ldf)。恢复模式设置为FULL.

当我尝试缩小日志文件时,它并没有缩小。

我知道缩小数据库不好,也不应该这样做。但我仍然试图缩小日志文件。

当我跑

DBCC SQLPerf(logspace) 
Run Code Online (Sandbox Code Playgroud)

我发现日志大小为4932 MB,使用的日志空间为98.76%

然后我尝试了这个命令

USE <databasename>;
DBCC loginfo;
Run Code Online (Sandbox Code Playgroud)

现在几乎所有的 VLF 都是“状态 2”,这意味着都在使用中。

我尝试进行日志备份,然后缩小日志文件。收缩并没有减小尺寸。

我将恢复模型更改为SIMPLE并再次尝试缩小,但这也无济于事。

我检查了未结交易

DBCC opentran (database);
Run Code Online (Sandbox Code Playgroud)

并发现现在没有交易打开。

是什么阻止我缩小日志文件?我该如何解决这个问题?

Nav*_*eet 16

这是我自己的问题的答案。

运行以下查询以获取有关日志文件重用等待的信息:

SELECT log_reuse_wait_desc
FROM sys.databases
WHERE name = 'DBName'
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

SELECT log_reuse_wait_desc
FROM sys.databases
WHERE name = 'DBName'
Run Code Online (Sandbox Code Playgroud)

即使删除复制后,数据库中仍有一些与复制相关的对象。

要从数据库中删除复制,sp_removedbreplication可以使用。但它对我们不起作用,因为当时复制并不活跃,实际上复制很久以前就被删除了。

解决方案是使用 SQL Server 的导入选项将数据库内容导入另一个数据库。


Rem*_*anu 11

阅读如何收缩 SQL Server 日志以了解日志的循环性质如何防止截断后收缩。您可能将最后一个LSN点记录到 LDF 尾部的 VLF 中。直觉上,您必须通过生成日志写入来推进日志,以允许它缩小。


Cou*_*000 11

缩小日志的步骤将是:

通过 SSMS 或 T-SQL 备份事务日志,然后执行收缩。

如果您右键单击数据库名称,则 SSMS 的命令位于任务下。

BACKUP LOG <Databasename> TO DISK = N'<path\database_log.ldf';
GO

DBCC SHRINKFILE (<FileName>, <TargetSize>) WITH NO_INFOMSGS
Run Code Online (Sandbox Code Playgroud)

您可能必须多次执行此操作。

如果存在阻止操作的事务或作业,请使用活动监视器识别进程并将其终止,或使用 SQL 代理作业活动监视器结束作业。

来源:http : //support.microsoft.com/kb/907511