노드가 "기본"상태가 아니기 때문에 drop 명령이 실패합니다. 드롭 콜렉션 명령은 쓰기 연산입니다. 쓰기 조작은 1 차에서만 허용됩니다.
"system.profile"컬렉션을 제거하는 가장 쉬운 방법은 컬렉션을 기본 노드에 놓는 것입니다. drop 명령은 다른 노드로 복제됩니다. 드롭 명령에 대한 항목은 oplog에서 볼 수있다 : 드롭 명령이 실행 된 때 프로파일 링의 결과 일 수 발생 될 수 있습니다
$ db.oplog.rs.find()
....
{ "ts" : Timestamp(1477445036, 1), "h" : NumberLong("1583532073473005081"), "v" : 2, "op" : "c", "ns" : "stack.$cmd", "o" : { "drop" : "system.profile" } }
문제는 보조 노드에서 사용된다.
당신이 드롭 명령이 실패하고 오류가 표시됩니다 프로파일을 사용하여 "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
프로파일 링 할 수 드롭 명령을 수 주에서 비활성화 할 수 있습니다 실행. 그러나 프로파일 링이 여전히 Secondary에서 활성화되어 있으면 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
컬렉션이 차에 존재하지 것이나 보조에 존재하는 것처럼이, 이상한 상태가 될 것입니다. 2w 노드에서 프로파일 링을 사용 불가능하게하고 명령을 다시 h 제하려고하면 콜렉션이 제거되지 않습니다. 존재하지 않는 콜렉션의 drop 명령은 본질적으로 oopog 항목을 작성하지 않고 복제되지 않는 no-op입니다.
새로운 "system.profile"수집 한 후 삭제 될 수 있습니다 차에 생성하는 데 필요한 명령을 복제 할 수 있도록하고 다른 노드에서 떨어진 것 :
2016-10-25T18:18:18.093-0700 I COMMAND [repl writer worker 15] CMD: drop stack.system.profile
문제의 노드가 주 노드입니까? 페일 오버를 시작하고 노드를 기본 상태로 승격하는 것이 좋습니다. 이렇게하면이 컬렉션을 제거하는 프로세스가 단순 해집니다.
Marco 또한 정확합니다. 문제의 노드를 독립 실행 형 상태로 다시 시작하면 컬렉션을 제거 할 수도 있습니다. 그런 다음 노드를 다시 복제 세트에 다시 삽입 할 수 있습니다.
'db.getProfilingStatus()'를 입력하면 어떻게 될까요? – Marco
프로파일 링 상태를 쉽게 변경할 수 있습니다. 'db.setProfilingLevel (0)'은 프로파일 링 레벨을 0으로 설정합니다. – ignite