【问题标题】:How do I abort a running query in the MongoDB shell?如何在 MongoDB shell 中中止正在运行的查询?
【发布时间】:2015-01-12 11:19:09
【问题描述】:

我不敢相信我不得不问这个问题,但是我如何停止我刚刚运行的查询,它现在正在运行,并且显然需要很长时间才能在 Mongo shell 中完成? Control+C 似乎使 shell 崩溃,并吐出大量错误。 this post 中建议的愚蠢解决方案当然不会做任何事情。我知道我可以打开另一个终端选项卡并 运行db.currentOp(),找到操作ID,然后运行db.killOp(),但我不敢相信这是唯一的解决方案。我一定遗漏了一些明显的东西。

【问题讨论】:

  • hmm ctrl+c 打破控制台听起来很糟糕,这是我通常使用的
  • 另外,Ctrl+C 确实 not 一定会杀死操作。底线:除了 killOp,停止操作的唯一可靠方法是停止集群。
  • 使用db.currentOp(),然后使用db.killOp()。 Ctrl-c 和其他问题与取消已经在数据库上运行的操作无关。
  • @wdberkeley 所以 MongoDB 在检测到 SIGTERM 时不会杀死操作?对我来说听起来违反直觉
  • 这不仅违反直觉,而且是 Mongo 团队的一个极其糟糕的 UI 决定。显然我一定是“错误”地使用了 Mongo,因为通常当我运行查询时,并在几秒钟内意识到查询将花费比它应该的时间更长的时间(也许索引被遗忘了;也许我正在测试一个复杂的复合索引,也许我打错了,它现在正在搜索一些不存在的未索引字段)我想终止查询并返回我的 Mongo shell。令我感到奇怪的是,Mongo 不像其他主流数据库软件和 shell 那样在 Control-C 上执行此操作。

标签: mongodb mongodb-query


【解决方案1】:

根据 Mongo documentation,您应该:

  1. 通过db.currentOp()获取当前操作ID
  2. 通过db.killOp()杀死opp

可以在here找到好的示例脚本。

【讨论】:

    【解决方案2】:

    根据 Alex 的回答。

    1. 查询当前正在运行的操作:

      db.currentOp()
      

    1. 杀死基于opid的操作

      db.killOp(30318806)
      

    【讨论】:

    • 在 mongodb 3.4 上效果很好
    • 不适用于分片集群。我收到此错误:“op 类型错误。预期的字符串,发现是双精度”
    • 为什么会这样?我必须打开一个新的终端窗口或使用屏幕来创建一个新会话.. 仅对管理员用户进行身份验证.. 运行 db.corruentOp(),然后复制并粘贴 opid.. 然后运行 ​​db.killOp 并粘贴 opid .大约一分钟,而不是像在其他数据库 CLI 中那样在不到几分之一秒的时间内按下 CTRL+C。
    【解决方案3】:

    对于分片集群:

    1. db.currentOp()
    2. db.killOp("shard_id:opid")

    例如:

    db.killOp("shard0000:3134616")
    

    【讨论】:

      猜你喜欢
      • 2017-10-12
      • 2010-12-14
      • 2021-10-01
      • 2011-04-16
      • 2011-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多