我已经创建了新的数据库并且日志文件在过去很长,并且由于“备份”而导致日志已满的错误消息。
我查看了该数据库与 SERVER 中其他数据库之间的差异,我发现在所有数据库中 log_reuse_wait 为 0,log_reuse_wait_desc 为 NOTHING,而在我的数据库中,log_reuse_wait 为 0,log_reuse_wait_desc 为 LOG_BACKUP。
我想将我的数据库中的这个属性更改为 0 而不是什么。我怎样才能做到这一点?
我已经创建了新的数据库并且日志文件在过去很长,并且由于“备份”而导致日志已满的错误消息。
我查看了该数据库与 SERVER 中其他数据库之间的差异,我发现在所有数据库中 log_reuse_wait 为 0,log_reuse_wait_desc 为 NOTHING,而在我的数据库中,log_reuse_wait 为 0,log_reuse_wait_desc 为 LOG_BACKUP。
我想将我的数据库中的这个属性更改为 0 而不是什么。我怎样才能做到这一点?
这是一个只读状态变量。它告诉您为什么此时不能截断日志。
您必须消除导致该情况的原因,而不仅仅是更改值(这甚至是不可能的)。
备份数据库日志或切换到SIMPLE
恢复模式。您可能应该对两者都进行一些阅读以了解其含义。
David W. 的剧本对我不太适用。(SQL Server 2008 r2)
我需要稍微修改一下。按原样使用脚本,我收到消息说数据库 [master] 没有这样的文件。按照 David W. 的建议更改 DATABASE,然后切换到目标数据库并运行DBCC SHRINKFILE()
命令。
同样,第一个参数DBCC SHRINKFILE()
必须是数据库日志文件的逻辑名称,在以下脚本中表示为logical_file_name_for_LOG
USE [master]
GO
ALTER DATABASE <db name> SET RECOVERY full
GO
ALTER DATABASE <db name> SET RECOVERY SIMPLE WITH NO_WAIT;
GO
USE [db name]
GO
DBCC SHRINKFILE('<logical_file_name_for_LOG>', 0, TRUNCATEONLY)
我找到了解决方案。即使数据库处于SIMPLE
等待模式BACKUP_LOG
,所以您需要将恢复模式更改为FULL
然后再返回到SIMPLE
withno wait
USE [master]
GO
ALTER DATABASE <db name> SET RECOVERY full
GO
ALTER DATABASE <db name> SET RECOVERY SIMPLE WITH NO_WAIT;
GO
USE [db name]
GO
DBCC SHRINKFILE('<log file name>', 0, TRUNCATEONLY)
我知道这是旧的,但答案是错误的。
如果数据库具有恢复模式FULL
并且这是预期的,则不要将其更改为simple
.
log_reuse_wait_desc
表示在日志可以重用或收缩之前的状态。在这种情况下是LOG_BACKUP
,也就是说,要收缩事务日志,需要先备份事务日志并收缩它,或者备份日志,让 SQLServer 重用日志空间。
log_reuse_wait_desc
可以在此处找到状态描述