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