2012-08-04 69 views
3

在mysql中,我調試了一個記錄如何改變閱讀mongoDB Binlogs

mysqlbinlog bin-88.log | grep的 「記錄ID」 --before = 2 --AFTER = 2

我怎麼做蒙戈類似的東西?

謝謝!

回答

0

有在MongoDB中的OPLOG,但只有當你有一個副本集被填充。這是一個capped collection

您可以從外殼像這樣進行查詢:

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

可以使用MongoDB中類似的方法。 binlog的等價物是oplog,它通常用於複製(如MySQL二進制日誌)。在MongoDB中的oplogcapped collection稱爲oplog.rs其住在local數據庫。作爲一個封閉的集合,oplog保持了一個固定的歷史數量。你可以change the size of the oplog

爲了MongoDB的創建OPLOG,你就需要配置mongod使用複製。如果您只需要需要oplog,則可以創建僅具有一個節點的虛擬副本集。

注:推薦的生產配置是使用複製以最小的三個節點的,因爲這提供了用於故障轉移和數據冗餘。

一個有用的一系列博客文章解釋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 
    } 
} 

在上述例子中,我發現的更新條目(opu)對於ObjectID爲501c87fa9d2b5b2b54437125的文檔。應用了兩個列更新:名稱,iq。

一個區別從MySQL binlogs要注意的是MongoDB的OPLOG是idempotent更改應用列表; MySQL二進制日誌是修改數據的語句列表。格式oplog允許MongoDB多次安全地應用條目而沒有不必要的副作用。這也意味着您會發現影響多個文檔的更新命令的結果作爲oplog中每個文檔的單獨條目,而不是像在binlog中出現的單個「UPDATE ..」語句。

+0

+1,比我的更徹底!當你說「不是查詢日誌」時,它聽起來像binlog是查詢日誌,但它們確實是插入/更新/刪除語句日誌(binlog沒有不修改的查詢)。 – 2012-08-04 03:11:51

+0

@WesFreeman:感謝您的反饋..我已經更新了最後一段,用'statement'而不是'query'來闡明。 – Stennie 2012-08-04 03:18:30