截断SQL Server日志文件的命令是什么?


Answers:


131

如果我还记得...在查询分析器或等效工具中:

BACKUP LOG  databasename  WITH TRUNCATE_ONLY

DBCC SHRINKFILE (  databasename_Log, 1)

2
这绝对比将数据库恢复模型设置为SIMPLE更好(如Blorgbeard的回答),因为如果恢复模型为FULL,则出于某种原因将其设置为这种方式。
Scott Whitlock,2010年

52
在SQL Server 2008中不推荐使用truncate_only,因此您必须将数据库切换到简单恢复msdn.microsoft.com/zh-cn/library/ms143729(SQL.90).aspx
Justin Moore 2010年

10
对于SQL Server 2012,此方法有效,但不能使用WITH TRUNCATE_ONLY
net_prog 2013年

4
除了net_prog所说的以外,对于SQL Server 2012,我将第一行替换为BACKUP LOG DatabaseNameHere TO DISK='NUL:'
亚伦·牛顿

'TRUNCATE_ONLY'不是公认的BACKUP选项。(SQL服务器2019 RC1)
托马斯Gandor

304

在管理工作室中:

  • 不要在实时环境中执行此操作,但要确保尽可能缩小收缩开发数据库:
    • 右键单击数据库,选择Properties,然后选择Options
    • 确保将“恢复模型”设置为“简单”,而不是“完整”
    • 点击确定
  • 再次右键单击数据库,选择Tasks-> Shrink->Files
  • 将文件类型更改为“日志”
  • 单击确定。

另外,SQL也可以这样做:

 ALTER DATABASE mydatabase SET RECOVERY SIMPLE
 DBCC SHRINKFILE (mydatabase_Log, 1)

参考:http : //msdn.microsoft.com/en-us/library/ms189493.aspx


1
您的回答挽救了我的一切!我不知道“右键单击-任务->缩小”选项。谢谢!
勒内·

7
您在现场环境中会做什么?首先备份日志?
John Bubriski

1
我不是DBA,但没错,我相信,备份日志将截断它:technet.microsoft.com/en-us/library/ms179478.aspx
Blorgbeard超出

2
@JohnBubriski如果您使用的不是简单的恢复模型,则日志是恢复数据或回滚事务的基础。因此,在生产环境中,您需要先备份这些日志,然后才能缩小日志文件。否则,将没有实际的恢复可能性。不幸的是,如果您处于恢复状态,则必须重新加载所有事务日志备份,以完全恢复数据库。一定要玩得开心!:)
定义

1
在SQL Server 2012中,我必须use mydatabase在执行之前dbcc shrinkfile
knb

62

对于SQL Server 2008,命令为:

ALTER DATABASE ExampleDB SET RECOVERY SIMPLE
DBCC SHRINKFILE('ExampleDB_log', 0, TRUNCATEONLY)
ALTER DATABASE ExampleDB SET RECOVERY FULL

这将我的14GB日志文件减少到1MB。


5
由于该问题对于哪个版本和可接受的答案不适用于SQL Server 2008尚不明确,因此该答案仍然有效,无论年龄如何。
詹姆斯·罗

谢谢,它帮助我减少了对DBCC SHRINKFILE没有反应的大型日志文件
Christian Navelot

6
完成后,别忘了将恢复模式更改为FULL!
Dan Bechard

在执行此操作(或其他任何截断选项)之前,您应该备份。如果执行完整备份并在SSMS中选中“仅复制备份”,则不再需要该日志。(这只是时间点备份)。
Simon_Weaver

37

对于SQL 2008,您可以将日志备份到nul设备:

BACKUP LOG [databaseName]
TO DISK = 'nul:' WITH STATS = 10

然后使用DBCC SHRINKFILE截断日志文件。


2
这是唯一一种在我的情况下可以正常工作的...在尝试将备份与TRUNCATE_ONLY一起使用时出现错误
TomXP411 2014年

注意:即使在SSD上,这也可能要花费相当长的时间(必须读取日志才能丢弃它)。对于中等驱动的Azure VM上的30GB日志文件,需要10分钟才能完成40%。确保切换到SSMS中的“邮件”记录以查看已处理的百分比。
Simon_Weaver

3

带有truncate_only的备份日志日志名,后跟dbccrinkfile命令


0

由于对我的答案被埋在评论中。对于SQL Server 2012及更高版本,可以使用以下命令:

BACKUP LOG Database TO DISK='NUL:'
DBCC SHRINKFILE (Database_Log, 1)

-5

另一个选择是通过Management Studio分离数据库。然后,只需删除日志文件,或重命名该日志文件,然后再删除。

回到Management Studio,再次附加数据库。在附加窗口中,从文件列表中删除日志文件。

数据库将附加并创建一个新的空日志文件。检查一切正常后,您可以删除重命名的日志文件。

您可能不应该将此用于生产数据库。


4
永远不要这样做!日志中可能有尚未提交到数据文件的数据。您将丢失此类数据。
保罗

如果您在回答中警告不要在生产环境中试用,则完全不值得发布。
斯坦·肖

9
我不同意下降投票者-这是一个选择。管理员只需要了解他们的情况。例如-如果没有未结交易,将没有“未提交”数据。
Gerard ONeill,2015年

3
这是唯一对我有用的解决方案。我的驱动器已装满,我无法备份或收缩,似乎没有其他工作。谢谢!
布赖恩

3
我同意; 这不是最佳实践,但是如果您没有其他选择(例如Brian的方案),则它是有价值的工具。
ScottFoster1000
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.