正在从mongodb从站删除system.profile集合

正在从mongodb从站删除system.profile集合,mongodb,Mongodb,根据此:,每个副本集都有不同的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 ma

根据此:,每个副本集都有不同的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

我不确定这里出了什么问题。

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

  • 你需要停止第二个
  • 在其他端口上作为独立端口重新启动辅助端口
  • 执行您需要的操作
  • 作为副本集的成员重新启动mongodb

  • 这些是更改次节点()上的
    系统.profile
    集合大小所需的步骤,因此我假设删除同一集合应遵循相同的说明。

    由于节点未处于“主”状态,drop命令失败。drop集合命令是一种写入操作;只允许在主服务器上执行写操作

    删除“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”命令,则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命令本质上是一个no op,它不会创建oplog条目,也不会被复制

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


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



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

    如果键入
    db.getProfilingStatus()
    ,会怎么样?我可以轻松更改分析状态
    db.setProfilingLevel(0)
    将分析级别设置为0。有什么原因需要停止辅助分析吗?我可以轻松地将system.profile放到主节点上。此外,system.profile是一个有上限的集合,因此我甚至无法从中删除文档。这是我在文档中找到的,用于对副本集的辅助节点执行一些常规维护,因此我假设删除并重新创建
    system.profile
    集合应遵循相同的过程。我没有开发MongoDB,所以我的答案基于我从文档中看到的内容。也许,由于辅助节点上的系统集合与主节点之间存在某种关联,因此应该有某种“保护”来防止后院更改。我验证了db.getProfilingLevel()在所有节点上都返回0。然后在主服务器上创建了一个新的system.profile集合。之后,我从主节点删除了system.profile节点,但该更改没有传播到辅助节点。无论如何,我通过强制每个节点逐个成为主节点,然后分别删除system.profile集合来解决这个问题。您是否检查了删除未能复制的节点的日志?它可能会提供一些关于为什么没有放弃该系列的信息。是否可能在您检查的数据库中禁用了分析功能,但在存在system.profile集合的数据库中仍然启用了分析功能?是的,日志中没有任何内容。另外,我不认为在其他数据库上启用了评测。
    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
    
    2016-10-25T18:18:18.093-0700 I COMMAND  [repl writer worker 15] CMD: drop stack.system.profile