2

这可能是一个非常基本的问题,但是如何事先确定大型操作最终会使用数据库日志还是 tempdb 空间?

例如,我所做的一个大型插入/更新操作使用了数据库日志,以至于我们需要使用 SSIS 和批量操作,这样空间就不会用完,因为脚本中的所有更改都必须部署在一个时间。

所以现在我正在处理一个大规模的删除操作,这将把日志填满 10 次。所以我创建了一个脚本来检查数据库日志文件使用的空间并以较小的批次删除行,其想法是一旦日志文件足够大,脚本将中止,然后第二天从该点继续(允许正常使用一直持续到下一次备份,没有日志空间不足的风险)。

现在,后一个查询开始填充 tempdb,而不是填充日志。具体来说是 Tempdb 数据文件,而不是日志文件。所以我认为我对这两者的理解应该存在一个巨大的漏洞。:)

感谢您的任何建议!

编辑:

澄清一下,这里的问题是为什么第一个示例使用数据库日志,而后者使用 tempdb 数据文件来存储更改?通常,DML 操作通过哪种逻辑存储到 tempdb 或 log 中?通常 log 应该存储所有 DB 更改,而 tempdb 仅用于在显式请求(即临时对象)或服务器耗尽 RAM 时存储操作期间处理的数据,对吗?

4

1 回答 1

2

从表中删除记录时,实际上有很多事情发生在幕后。这个MSDN 博客链接可能有助于阐明为什么当您尝试删除时 tempdb 会填满。无论哪种方式,删除都会填满事务日志,听起来好像 tempdb 在进入记录事务的步骤之前就已经填满了。

我不完全确定您的要求是什么,但以下链接可能对您的事务日志记录问题有所启发。这些都是为 SQL Server 2008 R2 设置的,但您可以切换到您正在运行的任何版本。

恢复模式概述

从简单恢复模型切换的注意事项

从完整或批量日志恢复模式切换的注意事项

您还可以选择截断表格,但这取决于几件事。如果您不需要记录该操作并且您要从表中删除所有记录,则可以截断。如果您正在执行某种条件删除,但您删除的内容多于您保留的内容,您可以随时将您想要保留的所有记录插入另一个“暂存”表,然后截断原始记录。然后您可以将记录重新插入到临时表中。但是,这仅在该表上没有外键关系时才有效。

于 2014-01-24T14:58:13.610 回答