【问题标题】:SQL Server error on update command - "A severe error occurred on the current command"更新命令上的 SQL Server 错误 - “当前命令发生严重错误”
【发布时间】:2009-07-24 00:34:13
【问题描述】:

在 SQL Server Management Studio 中运行以下查询会出现以下错误。

update table_name set is_active = 0 where id  = 3

当前命令发生严重错误。结果(如果有)应丢弃。

  • 日志已被截断
  • 有一个更新触发器,但这不是问题
  • 事务计数为零 (@@trancount)

我已经在数据库中的其他几个表上尝试了相同的更新语句,它们工作正常。

DBCC CHECKTABLE('table_name');

给予

DBCC results for 'table_name'.
There are 13 rows in 1 pages for object "table_name".
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

【问题讨论】:

  • 就我而言,发生这种情况是因为我的磁盘空间不足,并且数据库没有空间用于表中的更改以及添加到事务日志中-磁盘。

标签: sql-server sql-server-2005 tsql


【解决方案1】:

我刚刚遇到了同样的错误,它归结为一个损坏的索引。 重新索引表解决了这个问题。

【讨论】:

  • 我今天遇到了完全相同的错误。引发错误的列甚至与损坏的索引无关。
  • 您是如何发现这是一个损坏的索引?
【解决方案2】:

就我而言,我使用的是SubQuery 并且遇到了同样的问题。我意识到问题出在内存泄漏。

重新启动MSSQL 服务导致刷新tempDb 资源并释放大量内存。 所以这就是解决问题。

【讨论】:

    【解决方案3】:

    运行DBCC CHECKTABLE('table_name');

    检查安装了实例的 LOG 文件夹(通常为\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\LOG),查找任何名为“SQLDUMP*”的文件

    【讨论】:

    • checktable 没有提供任何信息,我会尝试访问日志文件 - 谢谢。
    • 还可以尝试 DBCC CHECKDB(yourdb) 将检查扩展到整个数据库。如果找到转储文件,请查看较新的 sqldump*.txt 文件。
    【解决方案4】:

    MS KB 上有 3 种可能性

    当我看到这样的东西时:我总是想到修补程序、引擎、服务器错误等。

    4 results: search for ""Msg 0, Level 11,State 0, Line 0" A severe error occurred on the current command"

    编辑:It's on MS Connect too

    【讨论】:

    • 除一个链接外的所有链接都是 404。请更新链接/将信息填写到此答案中
    【解决方案5】:

    一个不同的场景但同样的错误:当我尝试使用存储过程将记录插入到临时表中时,我收到了这个错误。原来是参数不匹配。我试图将 BIGINT 插入 INT。

    感谢 Vicky Harp:http://vickyharp.com/2012/03/troubleshooting-a-severe-error-occurred-on-the-current-command/

    【讨论】:

      【解决方案6】:

      这个错误正是它的意思:发生了不好的事情,通常不会发生。

      在我最近的案例中,真正的错误是:

      Msg 9002, Level 17, State 2, Procedure MyProcedure, Line 2 [Batch Start Line 3]
      The transaction log for database 'MyDb' is full due to 'LOG_BACKUP'.
      

      这是我要尝试的事情清单,也许按照这个确切的顺序:

      1. 检查磁盘空间是否不足(这是我的真正问题;我们的 NOC 没有发现)
      2. 检查内存是否不足
      3. 检查 Windows 事件日志是否显示任何严重的系统故障,例如硬盘驱动器故障
      4. 检查是否有任何通过扩展过程或 SQLCLR 不安全程序集加载的不安全代码可能会破坏 SQLServer.exe 进程的稳定性。
      5. 运行 CheckDB 以查看您的数据库是否存在任何损坏问题。在一个非常大的数据库上,如果这个存储过程只涉及表的子集,您可以通过查看存储过程涉及哪些分区(文件组)并只检查那些特定的文件组来节省时间。
        1. 我也会为您的数据库和主数据库执行此操作。

      【讨论】:

      • 您是如何发现您的案例中真正的错误是什么?
      • 对不起,我的意思是你是如何得到“数据库的事务日志已满”消息的?
      • 我们使用 Red Gate SQL 克隆服务器,并拥有 1TB 数据许可证。为了不超出限制,我将生产数据库恢复到开发环境,并截断了一堆数据。我的一个脚本中有一个错误,我首先将最后一个月的数据复制到临时表,截断原始表,然后将最后一个月的数据插入主表。插入错误是我有 =,所以我不小心用 100 GB 的数据填充了 tlog。最重要的是,事实证明我们的 IT 部门没有正确配置警报,所以没有人意识到我们空间不足。
      【解决方案7】:

      就我而言,我使用System.Threading.CancellationTokenSource 取消SqlCommand,但没有使用catch (SqlException) { } 处理异常

      【讨论】:

      • 你可能不想忽略所有SqlExceptions。如果sqlEx.Message.Contains ("Operation cancelled by user."),我只跳过我的,否则它会像往常一样抛出/记录。例如,您的 sql 可能有语法错误,您想知道这一点。
      【解决方案8】:

      当您的数据源存在无法处理的一般性问题时,似乎会发生这种情况。

      在我的情况下,我插入了一堆数据,表上的索引已损坏,需要重建。我找到了一个脚本来重建它们,似乎修复了它。为了找到错误,我在数据库上运行了相同的查询——之前已经运行了 100 多次。

      【讨论】:

        【解决方案9】:

        在我的情况下,方法:context.Database.CreateIfNotExists(); 在创建数据库之前多次调用并崩溃错误当前命​​令发生严重错误。结果(如果有)应丢弃。

        【讨论】:

          【解决方案10】:

          我在 Hangfire 中遇到错误,我无法访问库的内部工作,或者我无法追踪主要原因是什么。

          在@Remus Rusanu 答案的基础上,我可以使用以下脚本解决此问题。

              --first set the database to single user mode
              ALTER DATABASE TransXSmartClientJob
              SET SINGLE_USER
              WITH ROLLBACK IMMEDIATE;
              GO
          
              -- Then try to repair
              DBCC CHECKDB(TransXSmartClientJob, REPAIR_REBUILD)
          
              -- when done, set the database back to multiple user mode
              ALTER DATABASE TransXSmartClientJob
              SET MULTI_USER;
              GO
          

          【讨论】:

            【解决方案11】:

            我们刚刚在同一服务器上的多个数据库/表中遇到此问题后发现的另一个可能的解决方案。

            对 sql server 的最大连接数是否打开。我们有一个应用程序没有关闭它的 SQL 连接,而是让它们保持打开状态,所以我们运行了大约 28K-31K 连接(SQL Sever 的最大输出为 32K ish),我们注意到一旦我们杀死了几千个休眠连接它解决了这个问题上列出的错误。

            解决方法是更新应用以确保它们关闭连接而不是保持打开状态。

            【讨论】:

              【解决方案12】:

              在我的情况下,这是由 += 运营商造成的。我不得不用field = field + X 替换+= X 来克服这个问题。虽然我无法在 Microsoft 网站上找到任何相关的知识库,但我认为这是一个错误。

              我正在使用 SQL Server 2008 R2(10.50.1600)。

              【讨论】:

                猜你喜欢
                • 2014-05-12
                • 2016-01-02
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多