mysqlでは、次のようにしてレコードがどのように変更されたかをデバッグします
mysqlbinlog bin-88.log | grep "record-id" --before=2 --after=2
mongoで同様のことを行うにはどうすればよいですか?
ありがとう!
MongoDB でも同様のアプローチを使用できます。バイナリログに相当するものは、(MySQL バイナリログと同様に) 通常レプリケーションに使用される oplog です。MongoDB では、データベース内にあると呼ばれるoplog
キャップ付きコレクションです。上限のあるコレクションであるため、oplog は一定量の履歴を保持します。oplog のサイズを変更できます。oplog.rs
local
MongoDB で oplog を作成するには、レプリケーションを使用するように構成する必要がありますmongod
。oplogのみが必要な場合は、ノードが 1 つだけのダミーのレプリカ セットを作成できます。
注:フェイルオーバーとデータの冗長性を提供するため、推奨される運用構成は、最小 3 つのノードでレプリケーションを使用することです。
oplog 形式を説明する有益な一連のブログ投稿は、 Replication Internalsで始まります。これは、通常の MongoDB コレクションと同じようにクエリを実行できるため、いくつかの更新を試して、結果のコマンドが何であるかを確認できます。
o2._id
特定の名前空間 (mydb
データベース、 ) で特定のオブジェクト ID ( ) のすべての更新を検索する例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
}
}
上記の例では、 ObjectID を持つドキュメントの更新エントリ (:) を見つけましop
た。name、iq の 2 つの列の更新が適用されました。u
501c87fa9d2b5b2b54437125
MySQL バイナリログとの違いの 1 つは、MongoDB の oplog が、適用するべき等変更のリストであることです。MySQL バイナリログは、データを変更するステートメントのリストです。このoplog
形式により、MongoDB は望ましくない副作用なしにエントリを複数回安全に適用できます。また、複数のドキュメントに影響を与える更新コマンドの結果が、バイナリログに表示される単一の「UPDATE ..」ステートメントではなく、oplog 内の各ドキュメントの個別のエントリとして見つかることも意味します。