我不是SQL专家,每当我需要做一些基本之外的事情时,我就会想起这个事实。我有一个测试数据库,它的大小不是很大,但是事务日志确实很大。如何清除事务日志?


当前回答

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

记住,TX日志确实有一个最小/稳定状态大小,它们将逐渐增长。根据您的恢复模型,您可能无法收缩日志-如果是FULL且您没有发布TX日志备份,则日志不能收缩-它将永远增长。如果不需要TX日志备份,请将恢复模式切换为Simple。

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

永远不要删除事务日志-你会丢失数据!你的部分数据在TX日志中(不管哪种恢复模式)…如果分离并“重命名”TX日志文件,将有效地删除数据库的一部分。

对于那些已经删除了TX日志的用户,您可能希望在丢失更多数据之前运行一些checkdb命令并修复损坏。

看看保罗·兰德尔关于这个话题的博客文章,糟糕的建议。

此外,一般不要在MDF文件上使用收缩文件,因为它会严重破坏你的数据。查看他的坏建议部分以获得更多信息(“为什么你不应该缩小你的数据文件”)

看看保罗的网站,他讨论了这些问题。上个月,他在他的“一天的神话”系列文章中探讨了许多这样的问题。

其他回答

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

数据库“tempdb”的备份没有任何意义,因此这个数据库的恢复模型应该总是“简单”的。

试试这个:

USE DatabaseName

GO

DBCC SHRINKFILE( TransactionLogName, 1)

BACKUP LOG DatabaseName WITH TRUNCATE_ONLY

DBCC SHRINKFILE( TransactionLogName, 1)

GO 

SQL Server事务日志需要适当地维护,以防止其不必要的增长。这意味着要经常运行事务日志备份。如果不这样做,您就有可能使事务日志变得满并开始增长。

除了这个问题的答案,我建议阅读和理解事务日志的常见错误。这些阅读可能有助于理解事务日志,并决定使用什么技术来“清除”它:

从10个最重要的SQL Server事务日志神话:

Myth: My SQL Server is too busy. I don’t want to make SQL Server transaction log backups One of the biggest performance intensive operations in SQL Server is an auto-grow event of the online transaction log file. By not making transaction log backups often enough, the online transaction log will become full and will have to grow. The default growth size is 10%. The busier the database is, the quicker the online transaction log will grow if transaction log backups are not created Creating a SQL Server transaction log backup doesn’t block the online transaction log, but an auto-growth event does. It can block all activity in the online transaction log

来自事务日志神话:

神话:定期收缩日志是一种很好的维护实践 假的。对数增长非常昂贵,因为新块必须归零。该数据库上的所有写活动都停止,直到归零完成,如果磁盘写很慢或自动增长的大小很大,那么暂停可能很长,用户会注意到。这就是为什么你要避免增长的原因之一。如果您缩小日志,它将再次增长,您只是浪费磁盘操作在不必要的收缩和增长游戏

其他一些答案对我来说不适用:当db在线时不可能创建检查点,因为事务日志已满(多么讽刺)。但是,在将数据库设置为紧急模式后,我能够收缩日志文件:

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

如果不使用事务日志进行恢复(即只进行完全备份),可以将恢复模式设置为“简单”,那么事务日志很快就会缩小,再也不会被填满。

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

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