数据库'tempdb'的事务日志已满:但是仍然创建了表?

时间:2015-06-03 17:48:06

标签: sql sql-server sql-server-2008-r2

我有一个创建临时表的查询,并在查询的后续部分使用此表。我运行了查询的第一部分,它只是创建表来查看结果。我得到了以下结果:

查询已完成但有错误:

(166166381 row(s) affected)

Msg 9002, Level 17, State 4, Line 3
The transaction log for database 'tempdb' is full. To find out why space in the log cannot be reused, see the log_reuse_wait_desc column in sys.databases

Msg 9002, Level 17, State 4, Line 2
The transaction log for database 'tempdb' is full. To find out why space in the log cannot be reused, see the log_reuse_wait_desc column in sys.databases

所以它创建了(大量)表,但是给了我一个错误,表明tempdb的事务日志已满。

此错误是否导致显示的表出现问题(因为可能没有回放所有行)或者我可以使用此表吗?我查看了删除此错误的提示,但是当我查看tempdb属性时,它说我没有权限,所以我不确定采取哪些步骤来处理错误。

这是代码。由于某种原因,我似乎无法将其格式化为适合代码框

SELECT Cast(Datamart_Timestamp AS DATETIME) AS Datamart_Timestamp
   ,Contract_ID
   ,Admin_System
   ,Contract_Status_Code
   ,Cast(Contract_Status_Effective_Date AS DATETIME) AS Contract_Status_Effective_Date
INTO  ##Contract_Status
FROM   AV_TLA_Contract_Status AS CS
WHERE  (Datamart_Timestamp < '4/1/2011');

GO
--    //////////////////////////////////////////////////////////////////////////////////

INSERT INTO ##Contract_Status
SELECT CAST(CS.Datamart_Timestamp AS DATETIME) AS Datamart_Timestamp
   ,CS.Contract_ID
   ,CS.Admin_System
   ,CS.Contract_Status_Code
   ,CAST(CS.Contract_Status_Effective_Date AS DATETIME) AS Contract_Status_Effective_Date
FROM   AV_TLA_Contract_Status AS CS
   LEFT OUTER JOIN AT_AHEV_2011_04_Contract_Status AS A
    ON CS.Contract_ID = A.Contract_ID
WHERE  (CS.Contract_ID IS NOT NULL)
   AND (A.Contract_ID IS NULL)
   AND (CS.Datamart_Timestamp > '3/31/2011'); --Update so only most recent months are used.

2 个答案:

答案 0 :(得分:1)

不要看到使用您创建的临时表的任何问题。我相信,在用166166381 rows创建临时表之后,事务日志空间被填满,因此抛出了消息,这意味着将来创建临时表。

答案 1 :(得分:0)

您肯定可以使用该表,但是当您收到日志完整消息时,它表示需要记录未能记录的任何活动,因此要么已回滚,要么已取消。所以,你的桌子就在那里,但你很可能会错过一堆必要的更改和/或数据。

关于如何处理错误,您有两种选择:

  1. 联系您的dba并要求他们增加/扩展日志大小
  2. 重新考虑你在做什么 - 你刚刚在临时表中插入了1.66亿行。这有必要吗?您可以插入一个数据子集,其中只包含您需要的数据吗?如果这是一个共享数据库,那么你很好地阻止其他人/应用程序写入tempdb。
  3. 由于您没有权限修改tempdb,我猜是它是一个共享数据库,并且DBA 为您增长日志,dba会说做#2。< / p>