【问题标题】:The transaction log for database 'tempdb' is full due to 'ACTIVE_TRANSACTION'由于“ACTIVE_TRANSACTION”,数据库“tempdb”的事务日志已满
【发布时间】:2017-07-24 21:04:50
【问题描述】:

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

    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 语句删除表时,我收到错误消息“由于 'ACTIVE_TRANSACTION','tempdb' 的事务日志已满。”

    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;

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

【问题讨论】:

  • @GiulioCaccin 谢谢你的建议,但是我对事务日志进行了查询,用于 tempdb 的日志空间只有 31%。您提到的另一个询问也无法帮助我理解为什么我创建的临时对象拒绝被删除或创建。除非我从你的建议中遗漏了什么。

标签: sql sql-server


【解决方案1】:

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

BEGIN TRANSACTION
    DROP TABLE #AllClasses
COMMIT TRANSACTION

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

【讨论】:

  • 如何识别僵尸会话?有空数据(空、零)?
  • 这是dba.stackexchange.com 的一个有趣问题!
【解决方案2】:

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

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

可能的解决方案是:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-11-20
          • 2014-07-12
          • 1970-01-01
          • 1970-01-01
          • 2023-03-10
          • 2013-07-14
          • 1970-01-01
          相关资源
          最近更新 更多