Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 如何终止/解决SQL Server中实际长期运行的更新_Sql Server 2005_Rollback - Fatal编程技术网

Sql server 2005 如何终止/解决SQL Server中实际长期运行的更新

Sql server 2005 如何终止/解决SQL Server中实际长期运行的更新,sql-server-2005,rollback,Sql Server 2005,Rollback,我的一位同事(我保证是同事!)从上周四开始在我们的主SQL Server上运行了一个更新(没错,伙计们,我们现在快100小时了!)。所讨论的SQL(在一个事务中,我可以添加)是: (是的,我知道,令人发指……) 查询计划中的总成本为22186.7,估计要更新的行数约为1.51亿 我们显然需要以这样或那样的方式解决这个查询,我们意识到如果我们要终止这个查询,我们将生成一些残酷的回滚,但是我们无法知道它已经走了多远。我们只知道sys.dm_exec_请求中的这个条目: session_id sta

我的一位同事(我保证是同事!)从上周四开始在我们的主SQL Server上运行了一个更新(没错,伙计们,我们现在快100小时了!)。所讨论的SQL(在一个事务中,我可以添加)是:

(是的,我知道,令人发指……)

查询计划中的总成本为22186.7,估计要更新的行数约为1.51亿

我们显然需要以这样或那样的方式解决这个查询,我们意识到如果我们要终止这个查询,我们将生成一些残酷的回滚,但是我们无法知道它已经走了多远。我们只知道sys.dm_exec_请求中的这个条目:

session_id status query_text cpu_time total_elapsed_time reads writes logical_reads 52 suspended update daily_prices... 2328469 408947075 13831137 42458588 151809497 会话\u id状态查询\u文本cpu\u时间总计\u已用\u时间读取写入逻辑\u读取 52暂停更新每日价格。。。2328469 408947075 13831137 42458588 151809497 所以我的问题是,我们最好的行动方案是什么

  • 等等
  • 杀了它,滚回去,希望它在下一个冰河世纪之前滚回去
  • 还有别的吗

  • 我个人希望等待它结束,除非我认为它没有机会在本周完成,否则在这个阶段回滚可能需要比查询到目前为止更长的时间。如果它是一个生产服务器,我真的不会选择2并杀死它,除非我必须这样做

    在恢复某些控制/工作系统方面,如果您有合适的备份,请联机另一个数据库恢复备份/tlog备份,但您不希望恢复到事务启动后的状态(或者它仍然需要回滚)。这至少为您提供了一个可以继续开发工作的系统,但不太可能是prod系统的理想情况


    如果是生产服务器,在执行之前,就测试查询和查询计划的适用性与个人进行友好交流。我相信很多DBA都会建议一些不那么礼貌的指导方法:)

    因此,我们厌倦了等待交易完成,(在一周之后) 一段SQL,谁不会呢?),因为它干扰了我们的备份 在这个过程中,我们认为杀死它是一种必要的邪恶

    数据库开始回滚事务

    5天过去了

    我们注意到,在互联网上其他地方的一些帖子中,有时会出现一些魔力 在数据库重新启动且事务将“消失”时发生, 虽然这些都被揭穿了,而且毫无意义,但我们认为 没有什么可失去的了,所以我们试一试。我们知道数据库会进入 恢复模式,但数据库正变得越来越不正常,无法恢复 不管怎么说,除了当前的回滚工作之外,我们已经看到SQL Server在占用系统资源和不将它们转移到需要执行工作的地方方面表现不好

    (*我们还了解足够的数据库理论,知道数据库不会“忘记” 关于正在进行的事务,但我们也看到了 SQL Server错误日志告诉我们SQL Server正在 对不得不进行的回滚量越来越不满)

    所以我们重新启动了数据库

    果然,数据库进入了恢复模式。但是,SQL Server事件日志 现在每20秒左右给我们一次更新,以确定它将持续多长时间 总的来说,它从日志信息中估计了大约25个小时,但最终还是失败了 就一个半小时(!)

    我强烈怀疑这种恢复/回滚方法是否更快(正如我预期的那样) SQL Server必须执行与以前相同级别的工作来解除事务),但是它确实在一个半小时内完成了(无论是哪种方式,我都不想养成在回滚进行到一半时重新启动生产数据库的习惯)。事件日志中的更新消息绝对是天赐良机,任何编写过批处理程序的人都是如此 我会告诉你;不管结果多么不准确——至少是最糟糕的情况

    因为我们有幸成为唯一两个使用这个生产箱的人,选择 将数据库发送到对我们有效的恢复模式,并向我们提供我们需要的信息 只有我们以前的回滚状态(或者至少没有我们可以访问的内容)无法访问 鉴于我们缺乏DBA技能,请进行解释)。我会建议以后这样做吗? ……但绝对不是,希望有关各方已经吸取教训,并且
    我们可以向董事会索要一些钱来购买一台合适的开发服务器!(epic Joel测试失败!)

    谢谢……我想你确认了我的想法,我想等待它结束可能是我的首选……有问题的人有点渴望杀死它并使用更多事务逻辑重新启动,但是,如果我们被困在一个更长的回滚周期中,那么这将是更加痛苦的,因为一旦我们处于这种状态,我们将毫无办法!我希望有问题的开发者(顺便说一句,他恰好是CEO!)在使用f5之前会更加小心一点!=:-)感谢您的回复,我们最终终止了它,因为它中断了我们的备份和生产操作等(请参阅我的答案)是否在任何索引中使用了
    min\u date
    ?我想知道你是否可以做一个信封背面的计算,计算出你需要写多少页,然后与上面的
    writes
    列进行比较。@martin smith-它不用于任何索引,这是一些调查工作需要的一次性更新。我该怎么做你建议的计算呢?我知道可以这样做,但不确定
    写的是什么
    图,它是页面,如果是的话,它只是要列出的min_date列的页面/字节,还是整行?
    从sysindexes中选择*,其中NAME='clust
    session_id  status      query_text              cpu_time    total_elapsed_time  reads       writes      logical_reads
    52          suspended   update daily_prices...  2328469     408947075           13831137    42458588    151809497