从mongodb slave删除system.profile集合

时间:2016-10-12 06:44:14

标签: mongodb

根据这个:https://docs.mongodb.com/manual/administration/analyzing-mongodb-performance/#database-profiling,每个副本集都有一个不同的system.profile集合。我正在尝试使用以下方法从其中一个副本中删除system.profile集合:

> rs.slaveOk()
> db.setProfilingLevel(0)
> db.system.profile.drop()
2016-10-12T06:42:29.187+0000 E QUERY    [thread1] Error: drop failed: { "ok" : 0, "errmsg" : "not master", "code" : 10107 } :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DBCollection.prototype.drop@src/mongo/shell/collection.js:739:1
@(shell):1:1

我不确定这里有什么问题。

2 个答案:

答案 0 :(得分:2)

drop命令失败,因为节点未处于“Primary”状态。 drop collection命令是写操作;只允许在主节点上执行写操作。

删除“system.profile”集合的最简单方法是将集合放在主节点上。 drop命令将被复制到其他节点; drop命令的条目可以在oplog中看到:

$ db.oplog.rs.find()
....
{ "ts" : Timestamp(1477445036, 1), "h" : NumberLong("1583532073473005081"), "v" : 2, "op" : "c", "ns" : "stack.$cmd", "o" : { "drop" : "system.profile" } }

您可能遇到的问题可能是执行drop命令时在辅助节点上启用了性能分析的结果。

如果您尝试删除启用了性能分析的“system.profile”命令,则drop命令将失败并显示错误:

$ db.system.profile.drop()
2016-10-25T18:28:43.030-0700 E QUERY    Error: drop failed: {
    "ns" : "stack.system.profile",
    "nIndexesWas" : 0,
    "ok" : 0,
    "errmsg" : "turn off profiling before dropping system.profile collection",
    "code" : 20
}
    at Error (<anonymous>)
    at DBCollection.drop (src/mongo/shell/collection.js:620:15)
    at (shell):1:19 at src/mongo/shell/collection.js:620

可以在主节点上禁用分析,允许执行drop命令。但是,如果仍在辅助节点上启用了分析,则drop命令的复制将失败,并且该集合仍将存在。来自mongodb.log文件:

2016-10-25T17:46:02.123-0700 W REPL     [repl writer worker 15] repl Failed command { drop: "system.profile" } on stack with status IllegalOperation turn off profiling before dropping system.profile collection during oplog application

这将导致一种奇怪的状态,因为该集合不会存在于主节点上,但会存在于辅助节点上。禁用辅助节点上的分析并尝试再次删除该命令不会删除该集合;不存在的集合上的drop命令本质上是一个no-op,它不会创建一个oplog条目而不能被复制。

需要在主节点上创建一个新的“system.profile”集合,然后可以将其删除,从而允许在其他节点上复制和删除该命令:

2016-10-25T18:18:18.093-0700 I COMMAND  [repl writer worker 15] CMD: drop stack.system.profile

有问题的节点是否符合主要条件?您可能需要考虑启动故障转移并将节点提升为主状态。这将简化删除此集合的过程。

Marco也是正确的:在独立状态下重新启动相关节点也可以删除集合。然后可以将节点重新插入到副本集中。

答案 1 :(得分:0)

我不确定,但是如果您需要在副本集中的辅助节点上执行一些通用维护操作,请查看文档:

  1. 您需要停止辅助
  2. 在另一个端口上以独立方式重新启动辅助节点
  3. 执行您需要的操作
  4. 将mongodb重新启动为副本集的成员
  5. 这些是更改辅助(link to documentation)上system.profile集合大小所需的步骤,因此我假设删除相同的集合应遵循相同的说明。