【发布时间】:2011-04-14 16:59:45
【问题描述】:
虽然我的查询是正确的,但我会间歇性地收到此错误。有没有办法避免写入事务日志?
当我检查指定的列时,每一列的文字都写着:“Nothing”
错误:
数据库的事务日志 “tempdb”已满。找出原因 日志中的空间不能重复使用,请参阅 log_reuse_wait_desc 列 sys.databases”。
谢谢,非常感谢,有点急。
【问题讨论】:
标签: sql sql-server-2008 ssis
虽然我的查询是正确的,但我会间歇性地收到此错误。有没有办法避免写入事务日志?
当我检查指定的列时,每一列的文字都写着:“Nothing”
错误:
数据库的事务日志 “tempdb”已满。找出原因 日志中的空间不能重复使用,请参阅 log_reuse_wait_desc 列 sys.databases”。
谢谢,非常感谢,有点急。
【问题讨论】:
标签: sql sql-server-2008 ssis
您需要使用事务日志。这是在发生错误或查询部分完成时 SQL 回滚的方式。
根本原因不是事务日志,而是查询。你要么:
1 - 查询优化不佳(大量排序或哈希连接可能导致此问题)
2 - 在您的查询中过度使用 #temp 表
3 - 存在驱动器空间问题
你能发布你正在运行的查询吗?
编辑:
澄清可能导致问题的原因...
如果您有多个 #temp 表,它们都会占用 tempdb 中的空间。查询引擎必须进行的任何排序
(ORDER BY 没有索引,复杂的JOIN 条件不使用索引,大量GROUP BY 或聚合函数等)
写入tempdb 的事务日志,因为所有排序都在那里完成。
查询本身可能功能正常,但可能需要对其进行优化以避免这些问题。
【讨论】:
不,每笔交易都会被记录下来。但是,这不是日志记录的问题。
它表明 tempdb 已满,而不是您的日志文件。您正在处理大量记录吗?使用临时表?
您需要管理增长,因为您可能需要批量处理并更频繁地提交。
【讨论】:
SQL Server 使用事务日志来跟踪它所做的事情,没有办法避免这种情况(出于很多原因,您也不想这样做)。问题是这样的:
temdb 是 sql server 中的一个系统 DB,sql server 使用它来写入临时数据,例如用于非常长的查询的缓存数据和临时表(以 #、## 作为前缀创建的任何表)。
当您第一次安装 sql server 时,它会在所有数据所在的驱动器上创建 tempdb。
当您运行执行临时表或长时间运行的查询时,缓存的数据会写入 tempdb - 当它这样做时,它还固有地使用 tempdb 的事务日志。
在您的情况下,数据库的日志文件被填满可能是因为有太多数据被缓存/写入 tempdb,并且 tempdb 日志文件的驱动器可能已满。你的 tempdb 应该有 'shrink automatic' 选项 'on',为了轻松解决这个问题,你可以重新启动 sql 服务,它会自动消除 tempdb 日志文件中的额外数据。
您可以尝试稍微调整一下您的查询,这样就不必向 tempdb 写入太多数据(消除长结果集。避免使用 #temptables 等)
【讨论】:
'shrink automatically' option 'on' 在包括tempdb在内的任何数据库上不是一个好习惯
只是为了验证 tempdb 问题,在您的 JOINS 中,强制 LOOP join ex: 从测试中选择 * 内环连接 测试2 在 x=y 上
并删除所有 ORDER BY 子句。
如果查询运行时没有填充您的 tempdb(但可能会慢很多),那么您就知道需要散列(或排序)并且使用了过多的 tempdb 空间。
可能需要良好的查询分析来解决这个问题,但请检查执行计划并尝试尽一切可能删除任何排序或哈希连接,如果可能通过创建索引或有时强制连接类型(但通常如果统计很好,您应该仅作为最后一种可能性这样做)。
祝你好运
【讨论】: