如何清除SQL Server事务日志?


577

我不是SQL专家,每次我需要做一些超出基础知识的事情时,都会想起这个事实。我有一个规模不大的测试数据库,但是事务日志肯定是这样。如何清除交易日志?



3
Managment Studio中应该有一个命令:“单击以收缩日志”,您已完成。
Frenchie 2015年

Answers:


748

对于遇到意外增长(您不希望再次发生这种情况)的情况,应该真正减小日志文件的大小。如果日志文件将再次增长到相同的大小,则暂时缩小将不会有太多效果。现在,根据数据库的恢复目标,这些是您应该执行的操作。

首先,进行完整备份

如果发生问题,请务必对数据库进行任何更改,否则请确保无法还原数据库。

如果您关心时间点恢复

(通过时间点恢复,我的意思是您关心的是能够还原到除完整备份或差异备份以外的任何内容。)

大概您的数据库处于FULL恢复模式。如果没有,请确保它是:

ALTER DATABASE testdb SET RECOVERY FULL;

即使您进行常规的完整备份,日志文件也会不断增长,直到执行日志备份为止-这是为了保护您,而不是不必要地吞噬了磁盘空间。根据恢复目标,您应该经常执行这些日志备份。例如,如果您有一条业务规则规定在发生灾难时可以承受不超过15分钟的数据丢失损失,则应该有一项每15分钟备份一次日志的作业。这是一个脚本,它将根据当前时间生成带有时间戳的文件名(但是您也可以使用维护计划等来执行此操作,只是不要在维护计划中选择任何收缩选项,它们太糟糕了)。

DECLARE @path NVARCHAR(255) = N'\\backup_share\log\testdb_' 
  + CONVERT(CHAR(8), GETDATE(), 112) + '_'
  + REPLACE(CONVERT(CHAR(8), GETDATE(), 108),':','')
  + '.trn';

BACKUP LOG foo TO DISK = @path WITH INIT, COMPRESSION;

请注意,它\\backup_share\应该在代表不同基础存储设备的另一台计算机上。将这些数据备份到同一台计算机(或使用同一基础磁盘的另一台计算机,或同一物理主机上的另一台VM)并不能真正帮助您,因为如果计算机崩溃,您将丢失数据库它的备份。根据您的网络基础架构,在本地备份然后将其转移到幕后的其他位置可能更有意义。无论哪种情况,您都希望尽快将它们从主数据库计算机中删除。

现在,一旦运行了常规的日志备份,就应该将日志文件压缩到比现在炸毁的文件更合理的大小。但这并不意味着运行SHRINKFILE了一遍又一遍,直到日志文件为1 MB -即使你经常备份日志,它仍然需要适应可能出现的任何并发事务的总和。日志文件自动增长事件非常昂贵,因为SQL Server必须将文件归零(与启用即时文件初始化后的数据文件不同),并且用户事务必须等待这种情况发生。您希望尽可能少地执行此增长-收缩-增长-收缩例程,并且您当然不想让您的用户为此付费。

请注意,您可能需要先备份两次日志,然后才能进行收缩(感谢Robert)。

因此,您需要为日志文件提出一个实际的大小。没有人可以在不了解系统的情况下告诉您那是什么,但是如果您经常收缩日志文件并且又在增长,那么一个好的水印可能比最大的水印高10-50%。 。假设这是200 MB,并且您希望任何后续的自动增长事件为50 MB,那么您可以通过以下方式调整日志文件的大小:

USE [master];
GO
ALTER DATABASE Test1 
  MODIFY FILE
  (NAME = yourdb_log, SIZE = 200MB, FILEGROWTH = 50MB);
GO

请注意,如果日志文件当前> 200 MB,则可能需要先运行此文件:

USE yourdb;
GO
DBCC SHRINKFILE(yourdb_log, 200);
GO

如果您不关心时间点恢复

如果这是一个测试数据库,并且您不关心时间点恢复,则应确保数据库处于SIMPLE恢复模式。

ALTER DATABASE testdb SET RECOVERY SIMPLE;

将数据库置于SIMPLE恢复模式将确保SQL Server重用日志文件的某些部分(实质上逐步淘汰不活动的事务),而不是增加以保留所有事务的记录(就像FULL恢复一样,直到备份日志为止)。CHECKPOINT事件将有助于控制日志,并确保它不需要增长,除非您在CHECKPOINTs 之间生成了很多t-log活动。

接下来,您应绝对确保此日志增长确实是由于异常事件(例如,每年一次的春季大扫除或重建您的最大指标),而不是由于正常的日常使用。如果将日志文件缩小到一个可笑的小尺寸,而SQL Server只需要再次增大它以适应您的正常活动,那么您获得了什么?您是否能够利用仅暂时释放的磁盘空间?如果需要立即修复,则可以运行以下命令:

USE yourdb;
GO
CHECKPOINT;
GO
CHECKPOINT; -- run twice to ensure file wrap-around
GO
DBCC SHRINKFILE(yourdb_log, 200); -- unit is set in MBs
GO

否则,请设置适当的大小和增长率。按照时间点恢复案例中的示例,您可以使用相同的代码和逻辑来确定合适的文件大小并设置合理的自动增长参数。

有些你不想做的事

  • 使用TRUNCATE_ONLYoption 备份日志,然后选择SHRINKFILE。其中一个TRUNCATE_ONLY选项已被弃用,并且在当前版本的SQL Server中不再可用。其次,如果您处于FULL恢复模式,这将破坏您的日志链,并需要新的完整备份。

  • 分离数据库,删除日志文件,然后重新附加。我不能强调这有多危险。您的数据库可能不会备份,它可能会被怀疑备份,您可能必须还原到备份(如果有),等等。

  • 使用“缩小数据库”选项DBCC SHRINKDATABASE使用维护计划选项执行相同操作是个坏主意,尤其是在您只需要解决日志问题的情况下。定位您要调整的文件,并使用DBCC SHRINKFILEALTER DATABASE ... MODIFY FILE(上述示例)分别进行调整。

  • 将日志文件缩小到1 MB。这看起来很诱人,因为,在某些情况下,SQL Server将允许我执行此操作,并查看它释放的所有空间!除非您的数据库是只读的(并且应该使用标记ALTER DATABASE),否则这绝对会导致许多不必要的增长事件,因为无论恢复模式如何,日志都必须容纳当前事务。暂时释放该空间,以便SQL Server可以缓慢而痛苦地收回它,这有什么意义?

  • 创建第二个日志文件。这将暂时缓解已满磁盘的驱动器,但这就像试图用创可贴修复被刺破的肺部一样。您应该直接处理有问题的日志文件,而不是仅添加另一个潜在的问题。除了将某些事务日志活动重定向到其他驱动器之外,第二个日志文件确实对您没有任何作用(与第二个数据文件不同),因为一次只能使用其中一个文件。保罗·兰德尔(Paul Randal)也解释了为什么以后会有多个日志文件咬你

主动

与其将您的日志文件缩小到少量并让它自己不断以很小的速度自动增长,不如将它设置为一个相当大的大小(一个可以容纳您最大并发事务集的总和)并设置一个合理的自动增长设置为后备,这样它就不必多次增长就可以满足单个事务,因此在正常业务运营期间必须增长的情况相对很少。

这里最糟糕的设置是1 MB增长或10%增长。有趣的是,这些是SQL Server的默认值(我抱怨过,要求更改无用)-数据文件1 MB,日志文件10%。前者在当今时代太小了,后者每次导致的事件越来越长(例如,您的日志文件为500 MB,第一个增长为50 MB,下一个增长为55 MB,下一个增长为60.5 MB等等。-在慢I / O上,相信我,您会真正注意到此曲线)。

进一步阅读

请不要在这里停下来;尽管您看到的有关缩小日志文件的许多建议本质上都是不好的,甚至可能造成灾难性的影响,但有些人更关心数据的完整性而不是释放磁盘空间。

我在2009年撰写的博客文章中,出现了几篇“缩小日志文件的方法”的文章

博客文章布伦特奥扎尔写了四年前,指向多方资源,响应应该在SQL Server杂志的文章没有被公布

保罗·兰德尔(Paul Randal)的博客文章解释了为什么维护日志很重要以及为什么不应该收缩数据文件

迈克·沃尔什(Mike Walsh)也提供了涵盖这些方面的好答案,包括为什么您可能无法立即缩小日志文件的原因


5
时间点恢复不是使用完整恢复模型的唯一原因。主要原因是为了防止数据丢失。数据丢失的可能性就是备份之间的时间间隔。如果您仅进行每日备份,则数据丢失的可能性为24小时。如果然后每半小时添加一次日志备份,则丢失数据的可能性为30分钟。此外,需要日志备份来执行任何形式的零碎还原(例如从损坏中恢复)。
罗伯特·戴维斯

9
除此之外,这是此页面上给出的最完整和正确的答案。
罗伯特·L·戴维斯

11
我还想补充一点,清除日志是通过备份日志(在完整或批量记录的恢复中)或检查点(在简单的恢复中)完成的。但是,如果您必须缩小日志文件,那还不够。您需要使当前活动的VLF循环回到日志文件的开头。您可以在SQL 2008及更高版本中通过背对背发行两个日志备份或检查点来强制执行此操作。第一个清除它,第二个将其循环回到文件的开头。
罗伯特·L·戴维斯

2
@Doug_Ivison,因为在任何时候都可以清除日志记录。允许您备份不完整的日志有什么意义?在简单恢复中,日志仅真正用于允许事务回滚。一旦事务被提交或回滚,下一秒钟它可能会从日志中消失。
亚伦·伯特兰

3
@zinczinc好,谢谢您的反馈。我看到的将答案放在第一位,然后再进行解释的问题是,他们永远不会阅读重要的部分。我淹没给读者的讲座实际上比结尾的答案重要得多,恕我直言,我提供的背景对于做出这些选择非常重要。但是,如果您因为认为对OP更好而希望提交单行答案,请随时使用我的答案中的那一部分来做出更好的答案,我们可以从中学习。
亚伦·伯特兰

201
-- DON'T FORGET TO BACKUP THE DB :D (Check [here][1]) 


USE AdventureWorks2008R2;
GO
-- Truncate the log by changing the database recovery model to SIMPLE.
ALTER DATABASE AdventureWorks2008R2
SET RECOVERY SIMPLE;
GO
-- Shrink the truncated log file to 1 MB.
DBCC SHRINKFILE (AdventureWorks2008R2_Log, 1);
GO
-- Reset the database recovery model.
ALTER DATABASE AdventureWorks2008R2
SET RECOVERY FULL;
GO

来自:DBCC SHRINKFILE(Transact-SQL)

您可能要先备份。


感谢Maimonides,它来自文档,所以我想说这是最好的:P特别是因为它不是我发明的:)
Rui Lima

1
完成之后,我的日志大小没有改变。我做错什么了吗?
chester89

1
即使恢复类型是之前的其他方式,此方法也会将恢复类型设置为“ FULL”
Vil

1
像魔术一样工作!请注意,日志文件的名称实际上是其逻辑名称(可以在db-> properties-> files中找到)
Bizhan

2
我将在此脚本中包含BACKUP DATABASE子句,因此没有人会忘记这部分。我这么说是因为几年前,我将数据库缩小到磁盘上的可用空间太少的地方。在缩小过程中,文件越来越大,并引发了空间不足错误。结果:我丢失了数据库。幸运的是,日志数据库失去了耐性。
Cesar

185

免责声明:请仔细阅读下面的评论,我认为您已经阅读了接受的答案。正如我近5年前所说:

如果有人对这种方法不是足够或最佳的解决方案有任何意见要补充,请在下面发表评论


  • 右键单击数据库名称。

  • 选择任务→收缩→数据库

  • 然后点击OK

我通常打开包含数据库文件的Windows资源管理器目录,因此可以立即看到效果。

实际上,我对此感到很惊讶!通常,我以前使用过DBCC,但是我只是尝试了一下,并且它没有缩小任何内容,所以我尝试了GUI(2005),它的效果很好-在10秒内释放了17 GB

在完全恢复模式下,这可能无法正常工作,因此您必须先备份日志,或者更改为简单恢复,然后收缩文件。[为此感谢@onupdatecascade]

-

PS:我很高兴有人对这种做法的危害发表了评论,但是在我的环境中,我自己这样做没有任何问题,尤其是因为我总是首先进行完整备份。因此,在继续之前,请考虑您的环境是什么,以及这如何影响您的备份策略和作业安全性。我所做的只是向人们指出Microsoft提供的功能!


50
在完全恢复模式下,这可能无法正常工作,因此您必须先备份日志,或者更改为“简单恢复”,然后收缩文件。
onupdatecascade

7
@onupdatecascade-呼吁充分恢复技巧。另一个数据库的日志很大:切换为简单数据库,然后收缩数据库,然后又切换回完整数据库。日志文件最大500kb!
Simon_Weaver

26
抱歉。但是这个答案根本不可能是错误的。通过收缩数据库,您将增长事务日志文件。任何时候在SQL Server数据库中移动数据时,都需要进行日志记录-膨胀日志文件。要减小日志大小,可以将数据库设置为简单恢复,或者(如果您关心/需要记录的数据,并且几乎总是在生产中进行)备份日志。这些简单,免费的视频中的更多详细信息:sqlservervideos.com/video/logging-essentials sqlservervideos.com/video/sql2528-log-files
Michael K. Campbell

30
哇,这个答案获得1300+声望的荣誉,但这确实是一个糟糕的建议。
亚伦·伯特兰

8
这里是夸张的事实,它说明了发生的事情以及定期收缩的重要性,为什么如此:记录A在完成备份之前被更改了100万次。日志中有什么?无关的999,999条数据。如果日志从未缩减,那么您将永远不会知道数据库的实际运营成本是多少。另外,您很有可能正在SAN上浪费宝贵的资源。收缩是良好的维护,可以使您与环境保持联系。给我看一个认为你不应该缩水的人,我给你一个忽略他们周围环境的人。
Newclique 2015年

54

以下是用于缩小事务日志的脚本,但是我绝对建议您在缩小日志之前备份事务日志。

如果仅压缩文件,则将丢失大量数据,这些数据可能在发生灾难时起到救生作用。事务日志包含许多有用的数据,这些数据可以使用第三方事务日志读取器读取(可以手动读取,但需要付出很大的努力)。

对于时间点恢复,事务日志也是必须的,因此不要只是丢掉它,而要确保事先备份它。

这是人们使用事务日志中存储的数据来完成恢复的一些帖子:

 

USE DATABASE_NAME;
GO

ALTER DATABASE DATABASE_NAME
SET RECOVERY SIMPLE;
GO
--First parameter is log file name and second is size in MB
DBCC SHRINKFILE (DATABASE_NAME_Log, 1);

ALTER DATABASE DATABASE_NAME
SET RECOVERY FULL;
GO

执行上面的命令时,您可能会收到类似以下的错误

“由于正在使用位于文件末尾的逻辑日志文件,因此无法收缩日志文件(日志文件名)”

这意味着正在使用TLOG。在这种情况下,请尝试连续执行几次,或者找到减少数据库活动的方法。


30

这是一种简单且非常微妙潜在危险的 方式。

  1. 备份数据库
  2. 分离数据库
  3. 重命名日志文件
  4. 附加数据库
  5. 新的日志文件将被重新创建
  6. 删除重命名的日志文件。

我猜您没有在做日志备份。(截断日志)。我的建议是将恢复模式从完全更改为简单。这将防止日志膨胀。


15
分别删除/重命名/重新创建/替换日志是一个非常糟糕的主意。收缩的风险一定要小一些,而且操作起来也很简单。
onupdatecascade

12
+1-不管是否优雅,此方法使我几次都无法使用填满整个磁盘的数据库日志,因此即使执行缩小命令也无法执行。
Shaul Behr

3
日志中是否存在未检查点交易的风险?
保罗

对于较小的数据库,这也许也不错,但是如果您拥有3 TB或4 TB的数据库,则可能不是最佳解决方案。
Jaques 2014年

如果您已经开发了很长时间并且在开发期间加载/删除了数千条记录,这似乎可以。然后,当您要使用该数据库进行实时部署时,已记录的测试/开发数据是多余的,因此丢失数据也没关系,不是吗?
JsonStatham '16

28

如果您不使用事务日志进行还原(即,您只做过完整备份),则可以将恢复模式设置为“简单”,事务日志将很快收缩并且永远不会再次填充。

如果使用的是SQL 7或2000,则可以在数据库选项选项卡中启用“在检查点上截断日志”。这具有相同的效果。

显然,在生产环境中不建议这样做,因为您将无法还原到某个时间点。


1
将恢复模式设置为简单不会单独神奇地缩小事务日志。
亚伦·伯特兰

@Aaron不是一个人,不是。我以为OP将使用他们的测试数据库,因此“事务日志将很快收缩”,但是您是正确的,因为它更多的是副作用:简单的恢复模式可能会使您最终陷入困境交易记录即将发布
乔纳森(Jonathan)

Simple……再也不会填满”-不是真的。我已经看到(过去48小时内)在恢复模型设置为“ SIMPLE”的数据库上发生的情况。日志文件的文件增长设置为“受限”,并且我们一直在对其进行大量操作……我知道这是一种不寻常的情况。(在我们这种情况下,我们有足够的磁盘空间,我们增加了日志文件的大小,并将日志文件的文件增长设置为“不受限制”……顺便说一句,接口错误在更改后显示为“受限制” “,最大大小为2,097,152 MB。)
Doug_Ivison

2
@Doug_Ivison是的,事务日志中将有未完成的事务,但是一旦发生检查点,它们将以简单模式删除。这个答案仅是为了快速地“我的开发/测试箱中有一个很大的事务日志,我希望它消失了,所以我不必太担心它”,而不是打算进入生产环境。环境。要重申:不要在生产中执行此操作
乔纳森(Jonathan)

1
没错,我知道这是仅用于开发的快速方法。为什么要发表评论:直到我想到这件事之前,我实际上一直认为简单的恢复模型永远无法满足……而且我认为花了更长的时间才弄清/解决了这个问题,而后来我了解到异常大的交易可以做到这一点。
Doug_Ivison 2014年

9

不推荐John推荐的这项技术,因为不能保证没有日志文件就可以附加数据库。将数据库从完全更改为简单,强制执行检查点并等待几分钟。SQL Server将清除日志,然后可以使用DBCC SHRINKFILE缩小日志。


...但是我已经完成了数十次,没有问题。也许您可以解释为什么数据库可能无法重新附加。
约翰诺·诺兰

我有时(不是很经常)看到删除日志文件后,SQL Server无法将数据库附加回数据库。这给您留下了无用的MDF文件。有几种可能导致此问题的可能性。回想待处理的事务。
mrdenny

4
我同意这种策略,但是对于某些意外事件和/或非常规事件导致日志耗尽的情况,应保留该策略。如果您每周都要安排一份工作,那么您做的事情将非常非常错误。
亚伦·

2
非常非常真实的亚伦。
mrdenny13年

是的,这只是发生在我们身上。我们希望放弃20G的日志文件,因为我们只是在移动数据库之前备份了数据。如果没有庞大的日志文件,MSSQL将无法允许我们重新连接新数据库。
乔治·M·莫妮卡(Monica)

9

到目前为止,这里的大多数答案都是假设您实际上不需要事务日志文件,但是,如果您的数据库正在使用FULL恢复模型,并且您想要保留备份以防万一需要还原数据库,则不需要截断或删除该文件。日志文件的答案很多。

删除日志文件(通过截断,丢弃,擦除等)将破坏您的备份链,并阻止您将其恢复到上次完整,差异或事务日志备份以来的任何时间点,直到下一次完整备份为止或进行差异备份。

摘自Microsoft文章BACKUP

我们建议您不要使用NO_LOG或TRUNCATE_ONLY手动截断事务日志,因为这会破坏日志链。在下一次完整或差异数据库备份之前,不会保护数据库免于发生介质故障。仅在非常特殊的情况下才使用手动日志截断,并立即创建数据备份。

为避免这种情况,请在缩小日志文件之前将其备份到磁盘。语法如下所示:

BACKUP LOG MyDatabaseName 
TO DISK='C:\DatabaseBackups\MyDatabaseName_backup_2013_01_31_095212_8797154.trn'

DBCC SHRINKFILE (N'MyDatabaseName_Log', 200)

3
除了这, 1)部分,我同意你的回答。问题是,如果将其缩小到1 MB,导致正常日志大小的增长事件将耗资巨大,并且如果将增长率保持默认值10%,将会发生很多事件
亚伦·伯特兰

9

SQL Server事务日志需要适当维护,以防止其意外增长。这意味着经常运行事务日志备份。否则,您就有交易日志变满并开始增长的风险。

除了这个问题的答案之外,我还建议您阅读并理解事务日志的常见神话。这些读数可能有助于理解事务日志并决定使用哪些技术“清除”它:

10个最重要的SQL Server事务日志神话中可以得出

误解:我的SQL Server太忙了。我不想进行SQL Server事务日志备份

SQL Server中最大的性能密集型操作之一是联机事务日志文件的自动增长事件。由于没有足够频繁地进行事务日志备份,因此联机事务日志将变满并且必须增长。默认增长大小为10%。数据库越忙,如果未创建事务日志备份,则联机事务日志将越快增长。创建SQL Server事务日志备份不会阻止联机事务日志,但是会自动阻止事件。它可以阻止在线交易日志中的所有活动

交易日志神话

误解:定期收缩日志是一种良好的维护做法

假。日志增长非常昂贵,因为必须将新块清零。所有写入活动将在该数据库上停止,直到完成归零为止,并且如果您的磁盘写入速度慢或自动增长的大小很大,则暂停可能会很大,用户会注意到。这就是为什么要避免增长的原因之一。如果缩小日志,它将再次增长,并且您只是在不必要的缩小和增长游戏上浪费了磁盘操作


5

首先检查数据库恢复模型。默认情况下,SQL Server Express Edition为简单恢复模型创建一个数据库(如果我没有记错的话)。

带有Truncate_Only的备份日志DatabaseName:

DBCC ShrinkFile(yourLogical_LogFileName, 50)

SP_helpfile将为您提供逻辑日志文件名。

参考:

从SQL Server数据库中的完整事务日志中恢复

如果您的数据库处于完全恢复模型中,并且没有进行TL备份,则将其更改为SIMPLE。


这是清除我的开发箱上的日志文件的方式。具有所有相关备份策略等的产品环境,我将留给DBA :-)
Joon

TRUNCATE_ONLY在当前版本的SQL Server中,不再是该选项,并且不建议在支持该版本的版本上使用它(请参阅Rachel的答案)。
亚伦·

5

使用 DBCC ShrinkFile ({logicalLogName}, TRUNCATEONLY)命令。如果这是一个测试数据库,而您正在尝试节省/回收空间,则将有所帮助。

请记住,尽管TX日志确实具有一定的最小/稳定状态大小,它们会逐渐增长。根据您的恢复模式,您可能无法缩小日志-如果为FULL,并且您不发行TX日志备份,则无法缩小日志-它将永远增长。如果不需要TX日志备份,请将恢复模式切换为“ 简单”

请记住,在任何情况下都绝对不要删除日志(LDF)文件!您几乎会立即遇到数据库损坏。煮熟了!做完了!数据丢失!如果“未修复”,则主MDF文件可能会永久损坏。

永远不要删除事务日志-您将丢失数据!您的部分数据在TX日志中(与恢复模型无关)...如果您分离并“重命名”了有效删除的TX日志文件部分数据库。

对于那些删除了TX日志的用户,您可能需要运行一些checkdb命令并修复损坏,然后再丢失更多数据。

查看Paul Randal关于此主题的博客文章,不好的建议

同样,通常不要在MDF文件上使用rinkfile,因为它会严重碎片化数据。查看他的不良建议部分以获取更多信息(“为什么不应该收缩数据文件”)

查看Paul的网站-他涵盖了这些问题。上个月,他在“ 神话一天”系列中探讨了许多这些问题。


+1对于第一个提到这可能不是一个好主意的答案!OP指定了一个测试数据库,但是对于更一般的情况,这是很值得的一点。
马丁·史密斯

我应该添加-如果您删除发送日志-更新简历!
ripvlan

4

截断日志文件:

  • 备份数据库
  • 通过使用企业管理器或通过执行以下操作来分离数据库:Sp_DetachDB [DBName]
  • 删除事务日志文件。(或重命名文件,以防万一)
  • 使用以下方法重新附加数据库: Sp_AttachDB [DBName]
  • 附加数据库后,将创建一个新的事务日志文件。

缩小日志文件:

  • 带有No_Log的备份日志[DBName]
  • 通过以下任一方式收缩数据库:

    使用企业管理器:-右键单击数据库,所有任务,收缩数据库,文件,选择日志文件,确定。

    使用T-SQL: -Dbcc Shrinkfile([Log_Logical_Name])

您可以通过运行sp_helpdb或在企业管理器中查找数据库的属性来找到日志文件的逻辑名。


永远不要删除事务日志。您的部分数据在日志中。删除它,数据库将损坏。我没有拒绝投票的代表。
ripvlan

4

根据我在大多数SQL Server上的经验,没有事务日志的备份。完全备份或差异备份是常见的做法,但是事务日志备份确实很少。因此,事务日志文件将永远增长(直到磁盘已满)。在这种情况下,恢复模型应设置为“ 简单 ”。不要忘记修改系统数据库“ model”和“ tempdb”。

数据库“ tempdb”的备份没有意义,因此此数据库的恢复模型应始终为“简单”。


只需将数据库设置为简单状态,就不会缩小日志文件,无论它处于当前处于何种状态。这都可能有助于阻止它进一步增长(但仍然可以)。
亚伦·伯特兰

4
  1. 备份MDB文件。
  2. 停止SQL服务
  3. 重命名日志文件
  4. 启动服务

(系统将创建一个新的日志文件。)

删除或移动重命名的日志文件。


3

我发生的情况是数据库日志文件为28 GB。

您可以采取什么措施来减少这种情况?实际上,日志文件是发生事务后SQL Server保留的那些文件数据。为了处理事务,SQL Server为其分配页面。但是,在交易完成后,并不会突然释放这些交易,希望可能会有一笔交易与同一笔交易相同。这占用了空间。

步骤1:首先在数据库查询的检查点中运行此命令

步骤2:右键单击数据库任务>备份选择备份类型作为事务日志添加目标地址和文件名以保留备份数据(.bak)

再次重复此步骤,这时再指定一个文件名

在此处输入图片说明

步骤3:现在转到数据库右键单击数据库

任务>收缩>文件选择文件类型作为日志收缩动作以释放未使用的空间

在此处输入图片说明

第四步:

在SQL 2014中正常检查您的日志文件,可以在以下位置找到

C:\ Program Files \ Microsoft SQL Server \ MSSQL12.MSSQL2014EXPRESS \ MSSQL \ DATA

就我而言,它从28 GB减少到1 MB


2

尝试这个:

USE DatabaseName

GO

DBCC SHRINKFILE( TransactionLogName, 1)

BACKUP LOG DatabaseName WITH TRUNCATE_ONLY

DBCC SHRINKFILE( TransactionLogName, 1)

GO 

TRUNCATE_ONLY在当前版本的SQL Server中,不再是该选项,并且不建议在支持该版本的版本上使用它(请参阅Rachel的答案)。
亚伦·

它适用于我使用MSSQL Server 2005 Standard Edition
bksi 2014年

2

数据库→右键单击属性 →文件→添加另一个名称不同的日志文件,并将路径设置为与文件名称不同的旧日志文件相同。

数据库自动选择新创建的日志文件。


1
  1. 备份数据库
  2. 分离数据库
  3. 重命名日志文件
  4. 附加数据库(附加附加删除重命名的.ldf(日志文件)。选择它并按“删除”按钮删除)
  5. 新的日志文件将被重新创建
  6. 删除重命名的日志文件。

这将起作用,但是建议您首先备份数据库。


1

其他一些答案对我不起作用:数据库联机时无法创建检查点,因为事务日志已满(具有讽刺意味)。但是,将数据库设置为紧急模式后,我可以缩小日志文件:

alter database <database_name> set emergency;
use <database_name>;
checkpoint;
checkpoint;
alter database <database_name> set online;
dbcc shrinkfile(<database_name>_log, 200);

0

例:

DBCC SQLPERF(LOGSPACE)

BACKUP LOG Comapny WITH TRUNCATE_ONLY

DBCC SHRINKFILE (Company_log, 500)

DBCC SQLPERF(LOGSPACE)

TRUNCATE_ONLY在当前版本的SQL Server中,不再是该选项,并且不建议在支持该版本的版本上使用它(请参阅Rachel的答案)。
亚伦·

该问题并非帮助中心中定义的堆栈溢出问题。请不要回答这些问题;相反,您应该标记它们以引起注意,它们将被关闭或适当迁移。
Toby Speight

0

针对MSSQL 2017并使用SQL Server Management Studio的答案略有更新。我主要是从这些指示出发受益:https://www.sqlshack.com/sql-server-transaction-log-backup-truncate-and-shrink-operations/

我最近有一个数据库备份,因此我备份了事务日志。然后,我再次对其进行了很好的备份。最后,我压缩了日志文件,将文件大小从20G减小到7MB,这与我的数据大小相符。我不认为自从2年前安装以来就没有备份过交易日志。


-1

数据库事务日志缩小到最小大小

  1. 备份:事务日志
  2. 缩小文件:事务日志
  3. 备份:事务日志
  4. 缩小文件:事务日志

我在多个DB上进行了测试:此序列有效

通常缩小到2MB

或通过脚本:

DECLARE @DB_Name nvarchar(255);
DECLARE @DB_LogFileName nvarchar(255);
SET @DB_Name = '<Database Name>';               --Input Variable
SET @DB_LogFileName = '<LogFileEntryName>';         --Input Variable
EXEC 
(
'USE ['+@DB_Name+']; '+
'BACKUP LOG ['+@DB_Name+'] WITH TRUNCATE_ONLY ' +
'DBCC SHRINKFILE( '''+@DB_LogFileName+''', 2) ' +
'BACKUP LOG ['+@DB_Name+'] WITH TRUNCATE_ONLY ' +
'DBCC SHRINKFILE( '''+@DB_LogFileName+''', 2)'
)
GO

1
TRUNCATE_ONLY在当前版本的SQL Server中,不再是该选项,并且不建议在支持该版本的版本上使用它(请参阅Rachel的答案)。
亚伦·伯特兰
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.