SQL Server - Tempdb与数据库日志的使用情况

时间:2014-01-23 10:50:57

标签: sql-server logging transactions tempdb

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

例如,我做过一次大的插入/更新操作,使用了数据库日志,我们需要使用SSIS&批量操作只是因为空间不会耗尽,因为脚本中的所有更改都必须一次部署。

所以现在我正在进行大规模的删除操作,这会将日志填满10次。所以我创建了一个脚本来检查数据库日志文件使用的空间并删除较小批量的行,并认为一旦日志文件足够大,脚本就会中止,然后在第二天从该点继续(允许正常使用以继续下一次备份,没有日志耗尽空间的风险。)

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

感谢您的任何建议!

修改

为了澄清,这里的问题是为什么第一个例子使用数据库日志,而后者使用tempdb数据文件来存储更改?一般来说,逻辑是将DML操作存储到tempdb还是log?通常,log应该存储所有数据库更改,而tempdb仅用于在显式请求的操作期间(即临时对象)存储已处理的数据,或者当服务器用完RAM时,对吧?

1 个答案:

答案 0 :(得分:2)

当从表中删除记录时,幕后会发生很多事情。这个MSDN Blog link可能有助于阐明当你尝试删除时tempdb填满的原因。无论哪种方式,删除都会填满事务日志,听起来就像tempdb在进入记录事务的步骤之前就已经填满了。

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

Recovery Model Overiew

Considerations for Switching from the Simple Recovery Model

Considerations for Switching from the Full or Bulk-Logged Recovery Model

您还可以选择截断表格,但这取决于一些事情。如果您不需要记录操作,并且您要删除表中的所有记录,则可以截断。如果您正在进行某种条件删除,但是删除的内容超出了保留的范围,则可以将所有要保留的记录插入到另一个“临时”表中,然后截断原始文件。然后,您可以将记录重新插入到临时表中。但是,这实际上只有在该表上没有外键关系时才有效。