这个问题在专家交流中被尝试了两次,没有真正的答案。
我知道我不应该缩小日志文件——这不是问题。
如果您想回答一个人不应该这样做 - 这已经被多次证实是的,这不是这个问题的目标。
设置为简单备份也不是一种选择。
多年来它一直困扰着我——事实上我现在知道为什么它应该备份两次。
我最近看到第一个日志文件在第一次尝试时每次都能够缩小——这令人难以置信。我问了那个人,我所能做的就是“在发布前重组”——我不知道他指的是什么。我无法再次联系到他。
我从 EE 上的现有帖子中知道这一点:“收缩删除了日志的非活动部分。为了不活动,必须截断日志,这作为日志备份的一部分发生。
但是,事务日志由许多以循环方式使用的虚拟日志文件组成。只能修剪文件末尾的虚拟日志,因此如果 SQL Server 当前正在使用最后一个虚拟日志,则无法删除任何内容。sql 7 中的旧修复是运行一个脚本,该脚本运行足够多的虚拟事务来填充日志并将指针环绕到第一个虚拟日志(如果您愿意,您仍然可以使用此方法)。
http://support.microsoft.com/kb/256650/EN-US
DBCC 现在为您执行此操作,但仍需要再次截断日志的额外步骤,以便可以删除非活动空间”
来自另一位用户:“我所要做的就是停止上一个管理员在数据库维护计划中留下的自动优化和完整性检查。”
SQL Server 的事务日志文件由虚拟日志文件 (VLF) 组成。收缩日志文件时,它只会在文件末尾释放未使用的 VLF。总会有至少一个 VLF 用于当前活动。
考虑这个简化的例子。您有一个由 6 个大小相同的 VLF 组成的日志文件。为简单起见,假设 1 VLF = 1MB,因此总日志文件为 6MB。你想把它缩小到 3MB。您执行事务日志备份,这使一些 VLF(我们将随机选择 4 个)处于活动状态,其余的可供重用:
现在,您执行收缩,目标大小为 3MB。Shrink 只能在最后删除未使用的 VLF,但不能一直降低到 3MB 的目标大小:
你不能再缩小了,因为 VLF 4 正在使用中,事情就是这样工作的。您需要 VLF 4 可供重用,然后才能被截断。因此,您进行第二次事务日志备份——VLF 4 被备份,VLF 1 成为活动 VLF:
现在,您可以执行第二次收缩,并将事务日志缩小到 3MB 的目标大小: