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

Mic*_*ens 39 sql-server sql-server-2008-r2 recovery

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

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

Microsoft OLE DB Provider for SQL Server (0x80040E14) 数据库“DATABASE NAME”的事务日志已满。要找出无法重用日志中的空间的原因,请参阅 sys.databases 中的 log_reuse_wait_desc 列

特定的数据库实际上是我服务器上最小和最不活动的数据库之一,所以我不知道这个数据库上的日志如何被填满,而不是其他数据库。

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

alter database myDbName SET recovery simple
go
dbcc shrinkfile('LOG FILE LOGICAL NAME', 100)
go
Run Code Online (Sandbox Code Playgroud)

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

编辑:

每天晚上 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
Run Code Online (Sandbox Code Playgroud)

新的恢复模型和databaseshrink 是否会与此脚本发生冲突?

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

Tho*_*ger 62

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

当您需要数据库的时间点恢复时,您应该使用完整恢复模型。当您不需要数据库的时间点恢复,并且当最后一次完整或差异备份足以作为恢复点时,您应该使用简单恢复模型。(注意:还有另一种恢复模型,大容量日志。有关大容量日志恢复模型的更多信息,请参阅此参考资料

Microsoft OLE DB Provider for SQL Server (0x80040E14) 数据库“DATABASE NAME”的事务日志已满。要找出无法重用日志中的空间的原因,请参阅 sys.databases 中的 log_reuse_wait_desc 列

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

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

......

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

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

这个 MSDN 参考中摘录/引用

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

然后你做了一个物理数据库文件收缩,因为你的事务日志中有可用空间,现在它能够物理收缩 NTFS 文件。

值得花一些时间阅读的书​​籍:

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

编辑后编辑

新的恢复模型和databaseshrink 是否会与此脚本发生冲突?

BACKUP DATABASE命令适用于任一恢复模型。至于例行的数据库收缩......不要这样做!!!! 认真地,相应地调整数据库的大小,如果您使用完整恢复模型,那么请确保您正在执行例行和频繁的事务日志文件,不仅是为了保持事务日志的大小,而且还要满足恢复点对象的要求。

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

如果您的数据库使用完整恢复模型,那么是的,您应该进行事务日志备份。如果您的数据库处于简单恢复状态,那么您在物理上无法进行事务日志备份。

至于使用什么恢复模型(简单与完整),我们无法为您做出决定。只有您、您的业务团队和您的 SLA 可以做到。