如果日志文件已满,为什么不备份数据库?

Jam*_*mes 2 sql-server backup sql-server-2008-r2 transaction-log

我在 SQL Server 2008 R2 上的完整恢复模型中有一个简单的数据库备份脚本:

backup database livendb to disk = '\\ehsjmaydb01\Data\livendb.bak' with init, format
backup log livendb to disk =  '\\ehsjmaydb01\Data\livendb_log.tran' with init, format  
Run Code Online (Sandbox Code Playgroud)

我们在周末打开了一个新的 ETL 脚本,这绝对让我糟糕的服务器崩溃了。事务日志已满,TempDB 已满。

查看我的备份作业的历史记录,它失败并显示以下消息:

数据库“liveendb”的事务日志已满。
要找出无法重用日志中的空间的原因,请参阅 sys.databases
[SQLSTATE 42000] (Error 9002) BACKUP DATABASE is termination异常中的 log_reuse_wait_desc 列。
[SQLSTATE 42000](错误 3013)。步骤失败。

当我来到这个早上,我能够备份日志第一,然后运行DB备份,而这工作得很好。

问题:为什么数据库备份过程需要日志文件中的空间?

sep*_*pic 5

BACKUP DATABASE 异常终止

问题:为什么数据库备份过程需要日志文件中的空间?

作为第一步的每个数据备份(完整/差异)都会执行checkpoint. 这样做是为了能够从磁盘中获取尽可能多的新数据。

每个checkpoint操作都会写入关于自身的日志(至少 2 条日志记录)

如果您的日志已满,即使无法将checkpoint操作写入日志也会使您的备份失败。

在备份结束时每次full backup重置differential base,这也被记录。

并且在这两者之间还有其他日志写入,您可以sys.fn_dblog在成功备份后看到它们的使用。

在这里你可以看到checkpointand的解释differential base

数据库检查点 (SQL Server)

检查点如何工作以及记录什么

差异备份的基础