2012-08-04 2 views
3

mysql에서 수행 한 레코드 변경 방법을 디버그합니다.mongoDB Binlogs 읽기

mysqlbinlog bin-88.log | grep "record-id"--before = 2 --after = 2

mongo와 비슷한 기능을 수행하려면 어떻게해야합니까?

감사합니다.

답변

0

mongodb에 oplog가 있지만 복제본 세트가있을 때만 채워집니다. capped collection입니다.

당신과 같이 쉘에서이를 조회 할 수 있습니다

use local; 
db.oplog.rs.find(); // specify "ns" and "_id" here, if desired 
4

당신은 MongoDB를 비슷한 방법을 사용할 수 있습니다. binlog에 해당하는 것은 oplog이며 (MySQL binlog와 같이) 일반적으로 복제에 사용됩니다. MongoDB에서 oploglocal 데이터베이스에있는 oplog.rs이라는 capped collection입니다. 제한된 컬렉션이므로 oplog는 고정 된 양의 기록을 유지합니다. 당신은 change the size of the oplog 일 수 있습니다.

MongoDB가 oplog를 만들려면 복제를 사용하도록 mongod을 구성해야합니다. 만 oplog를 원할 경우 노드가 하나만있는 더미 복제본 세트를 만들 수 있습니다.

참고 : 권장 생산 구성은 장애 조치 및 데이터 중복을 위해 최소 3 개의 노드로 복제를 사용하는 것입니다.

oplog 형식을 설명하는 유용한 블로그 게시물 시리즈는 다음으로 시작합니다. Replication Internals. 이것을 일반적인 MongoDB 콜렉션과 같이 조회 할 수 있으므로, 일부 갱신을 시도하고 결과 명령이 무엇인지 볼 수 있습니다. 주어진 이름 공간에 지정된 객체 ID (o2._id)에 대한 모든 업데이트를 찾는

예 (mydb 데이터베이스, mycollection) :

내가 찾은 위의 예에서
> use local 
> db.oplog.rs.find({'ns':'mydb.mycollection', 'o2._id' : ObjectId("501c87fa9d2b5b2b54437125")}) 
{ 
    "ts" : Timestamp(1344047454000, 1), 
    "h" : NumberLong("226994175309144171"), 
    "op" : "u", 
    "ns" : "mydb.mycollection", 
    "o2" : { 
     "_id" : ObjectId("501c87fa9d2b5b2b54437125") 
    }, 
    "o" : { 
     "name" : "Bobby Tables", 
     "iq" : 180 
    } 
} 

업데이트 항목 (op : u) ObjectID가 501c87fa9d2b5b2b54437125 인 문서의 경우 이름, iq라는 두 개의 컬럼 업데이트가 적용되었습니다.

MySQL binlog에서 유의해야 할 점은 MongoDB oplog는 적용 할 변경 사항이 idempotent 인 것입니다. MySQL binlog는 데이터를 수정하는 명령문 목록입니다. oplog 형식을 사용하면 MongoDB는 원하지 않는 부작용없이 여러 번 안전하게 항목을 적용 할 수 있습니다. 또한 binlog에 나타나는 것과 같은 단일 "UPDATE .."문보다는 여러 문서에 영향을주는 업데이트 명령의 결과가 oplog의 각 문서에 대한 별도 항목으로 있음을 알 수 있습니다.

+0

+1, 광산보다 조금 더 철저합니다! "쿼리 로그가 아님"이라고 말하면, binlog는 쿼리 로그와 같지만 실제로는 삽입/업데이트/삭제 명령문 로그입니다 (binlog에는 수정하지 않는 쿼리가 없습니다). –

+0

@WesFreeman : 의견을 주셔서 감사합니다. 마지막 단락을'query'보다는'statement'로 명확히하기 위해 업데이트했습니다. – Stennie