数据库的简单或完整恢复模型?


38

什么时候应该使用完整恢复模型,什么时候应该对数据库使用简单恢复模型?

我一直使用完整恢复模式,因为它是默认模式,但今天我遇到了此错误:

SQL Server的Microsoft OLE DB提供程序(0x80040E14)数据库'数据库名称'的事务日志已满。要找出为什么无法重用日志中的空间的原因,请参阅sys.databases中的log_reuse_wait_desc列

特定的数据库实际上是服务器上最小,最不活动的数据库之一,因此我不知道该数据库上的日志如何充满,而不是其他数据库。

为了缩小日志并使数据库可再次访问,我使用以下命令将恢复模型从FULL更改为SIMPLE并缩小了逻辑文件日志

alter database myDbName SET recovery simple
go
dbcc shrinkfile('LOG FILE LOGICAL NAME', 100)
go

它帮助,但现在我需要了解为什么它的帮助下,如何这种情况开始,如何防止这种情况在未来?

编辑:

每天晚上1点,我们都会对服务器上的每个数据库进行脚本化备份。这是由31行脚本完成的,其中最重要的部分是

set @Filename = 'D:\backup\' + convert(varchar, getDate(), 112) + ' - ' + @DBName + '.bak'
set @Description = 'Full backup of database ' + @Filename
BACKUP DATABASE @DBName TO DISK = @Filename WITH INIT , NOUNLOAD , NAME = @Description, NOSKIP , STATS = 10, NOFORMAT

新的恢复模型和数据库收缩是否会与此脚本冲突?

我们不对数据库进行任何其他类型的备份,因此不对事务日志进行备份吗?


现在值得注意的是,现在这不是Azure SQL的选择-它始终使用FULL恢复。azure.microsoft.com/zh-CN/blog/…–
jocull,

Answers:


60

什么时候应该使用完整恢复模型,什么时候应该对数据库使用简单恢复模型?

当需要数据库的时间点恢复时,应使用完整恢复模型。当您不需要数据库的时间点恢复,并且上一次完全备份或差异备份足以作为恢复点时,应使用简单恢复模型。(注意:还有另一种恢复模式,批量记录。有关批量记录的恢复模型的更多信息,请参见此参考资料

SQL Server的Microsoft OLE DB提供程序(0x80040E14)数据库'数据库名称'的事务日志已满。要找出为什么无法重用日志中的空间的原因,请参阅sys.databases中的log_reuse_wait_desc列

出现该错误的原因(最有可能的原因)是因为您尚未备份事务日志。如果不进行备份,则它将继续物理增长事务日志文件(如果启用了自动增长并且maxsize允许),因为它无法重用事务日志的任何“部分”(虚拟日志文件)。它只能将那些VLF标记为可重用,并且在执行事务日志备份时(以及其他一些要求,例如没有活动的事务,某些复制方面等),允许事务日志具有“可回绕”的性质。

为了缩小日志并使数据库可再次访问,我使用以下命令将恢复模型从FULL更改为SIMPLE并缩小了逻辑文件日志

......

它有所帮助,但是现在我需要了解为什么会有所帮助,这种情况如何开始以及将来如何防止这种情况发生?

这对您有所帮助,因为通过将数据库设置为简单的恢复模型,您告诉SQL Server您不再关心时间点恢复,并且不再需要确保不再保留虚拟日志文件并将其标记为活动状态,现在,检查点进程将这些VLF标记为非活动状态。

从此MSDN参考中摘录/ 引用

在简单恢复模型下,除非某些因素延迟了日志截断,否则自动检查点将截断事务日志的未使用部分。相反,在完整和批量记录的恢复模型下,一旦建立了日志备份链,自动检查点就不会导致日志截断。

然后,您进行了物理数据库文件压缩,并且由于事务日志中现在有可用空间,因此它可以物理上收缩NTFS文件。

阅读值得花一些时间在:

  1. 恢复模型
  2. 管理事务日志(Gail Shaw)
  3. 可能会延迟日志截断的因素

编辑后进行编辑

新的恢复模型和数据库收缩是否会与此脚本冲突?

BACKUP DATABASE命令将与两种恢复模型一起使用。至于常规数据库的缩减……请不要做!!!! 认真地,相应地调整数据库的大小,如果您使用完整的恢复模型,那么请确保您正在执行例行且频繁的事务日志文件,不仅要使事务日志大小保持正常,而且还要满足恢复点对象。

我们不对数据库进行任何其他类型的备份,因此不对事务日志进行备份吗?

如果您的数据库正在使用完整恢复模型,则可以,您应该进行事务日志备份。如果您的数据库处于简单恢复中,则您实际上将无法执行事务日志备份。

至于要使用哪种恢复模型(简单还是完整),我们无法为您做出决定。只有您,您的业务团队和您的SLA可以。


您可能还需要补充一点,如果您正在使用数据库镜像,则需要使用完全恢复模型,因为它使用日志文件来保持镜像更新。
Holger 2014年

那是一个很好的答案。我不了解的一部分是“还要满足恢复点对象”。您介意澄清一下这句话吗?我首先以为您打算写“目标”,但我不能确定这一假设。
安东尼G-莫妮卡的大法官
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.