数据库' tempdb'的事务日志已完成,因为“ACTIVE_TRANSACTION'

时间:2017-07-24 21:04:51

标签: sql sql-server

我使用的是Microsoft SQL Server 2014,并且在尝试创建临时表时遇到了一些问题。我之前运行过这段代码没有任何问题,但是当我今天尝试运行查询时,我收到了两个错误之一"已经有一个名为' #AllClasses'在数据库"或"数据库' tempdb'的事务日志由于' ACTIVE_TRANSACTION'而已满。"。我已粘贴以下代码的一部分:

    CREATE TABLE #AllClasses(studentId uniqueidentifier, ClassName nvarchar(100), SchoolName nvarchar(100), AcademicYearId uniqueidentifier, UserGroupId uniqueidentifier, SchoolId uniqueidentifier, ClassId uniqueidentifier,  UserGroupOrganizationStatusId tinyint);

    CREATE UNIQUE INDEX #I_AllClasses ON #AllClasses (StudentId, UserGroupId);

    INSERT #AllClasses(studentId, ClassName, SchoolName, AcademicYearId, UserGroupId, SchoolId, sc.ClassId, u.UserGroupOrganizationStatusId)

    SELECT sc.studentId, c.ClassName, u.UserGroupOrganizationName, c.AcademicYearId, c.UserGroupId, c.SchoolId, sc.ClassId, u.UserGroupOrganizationStatusId
    FROM StudentClassCrossReference sc
    INNER JOIN class c ON sc.ClassId = c.classId
    INNER JOIN School s ON s.SchoolId = c.SchoolId
    INNER JOIN dbo.UserGroupOrganization u ON u.UserGroupOrganizationId = s.UserGroupOrganizationId
    GROUP BY sc.studentId, c.classname, u.UserGroupOrganizationName, u.UserGroupOrganizationId, c.AcademicYearId, c.UserGroupId, c.SchoolId, sc.ClassId, u.UserGroupOrganizationStatusId
    HAVING u.UserGroupOrganizationStatusId = 0

当我试图放弃桌子时,我收到一个新错误,上面写着,"不能放弃桌子' #All Classes'因为它不存在或您没有权限。"

        DROP Table #LS25Student, #AllClasses, #LS25PageSession, #LS25PsByClass

当我尝试使用IF语句删除表时,我收到错误"' tempdb'的事务日志由于' ACTIVE_TRANSACTION'而已满。"。

    IF OBJECT_ID('tempdb.dbo.#AllClasses', 'U') IS NOT NULL 
      DROP TABLE #AllClasses; 

    IF OBJECT_ID('tempdb.dbo.#LS25Student', 'U') IS NOT NULL 
      DROP TABLE #LS25Student;

    IF OBJECT_ID('tempdb.dbo.#LS25PageSession', 'U') IS NOT NULL 
      DROP TABLE #LS25PageSession;

    IF OBJECT_ID('tempdb.dbo.#LS25PsByClass', 'U') IS NOT NULL 
      DROP TABLE #LS25PsByClass;

我可以毫无问题地运行其他查询。任何修复此特定查询的建议都将不胜感激。

5 个答案:

答案 0 :(得分:3)

您可以使用简单的SELECT * FROM tempdb..sysobjects WHERE name LIKE '%AllClasses%'来搜索所有临时对象 修复它只需运行一次:

BEGIN TRANSACTION
    DROP TABLE #AllClasses
COMMIT TRANSACTION

如果您仍然无法删除它,只需检查SELECT * FROM sys.dm_exec_sessions的僵尸会话并使用KILL session_id将其删除。

答案 1 :(得分:3)

在提交之前在数据库上执行繁重的查询时,会发生此错误。

例如,如果您尝试对具有数百万条记录的表进行一些分析计算的子查询,然后对其进行更新,则tempdb的维数会增加(由于必要的计算),直到达到最大值为止。尺寸,并给出该错误。

可能的解决方案是:

  • 尽可能减少段中的操作,例如对减少的行集(基于某些键)进行更新
  • 增加tempdb的尺寸(显然,如果有足够的磁盘空间)

答案 2 :(得分:0)

关于表丢弃问题,当嵌套过程调用的临时表与调用过程中的临时表同名时,我似乎会发生这种情况。
我也偶尔会看到一些孤立的spid,其中临时表是一种僵尸状态,当你检查objectid时它并不匹配。如果它是前一个问题,只需重命名临时表 我还会检查活动spid,看看是否有任何挂起的事务也可能是事务日志问题的原因,然后杀死它们。视图为sys.dm_exec_sessions,以查看正在运行的内容。

答案 3 :(得分:0)

对我来说,与数据库断开连接(在对象资源管理器中右键单击它-断开连接),然后重新连接再次解决了该问题。

答案 4 :(得分:0)

我遇到了同样的问题,当我增加了'tempdb'数据库的日志大小(初始大小)时,它消失了。 (您可以使用SSMS并选择“ tempdb”数据库的属性)

enter image description here