drop 命令失败,因为节点未处于“主要”状态。一个drop collection命令是一个写操作;只允许在主节点上进行写操作。
删除“system.profile”集合的最简单方法是将集合放在主节点上。 drop 命令将被复制到其他节点;可以在 oplog 中看到 drop 命令的条目:
$ 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”命令,则删除命令将失败并显示错误:
$ 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
有问题的节点是否符合 Primary 条件?您可能需要考虑启动故障转移并将节点提升到主状态。这将简化删除此集合的过程。
Marco 也是正确的:以独立状态重新启动有问题的节点也将允许删除集合。然后可以将节点重新插入到副本集中。