アプリケーションまたは人為的エラーデータの破損における大きな問題の1つは、プライマリへの問題のある書き込みがすぐにセカンダリに複製されることです。
これは、ユーザーが「slaveDelay」を利用する理由の1つです。これは、固定時間遅延でセカンダリノードの1つを実行するオプションです(もちろん、これは、より短い期間中にエラーまたはバグを発見した場合にのみ役立ちます)。そのセカンダリの遅延)。
このような設定がない場合は、バックアップを使用して、バグ前の状態に復元する必要のあるレコードの状態を再作成する必要があります。
データの個別のスタンドアロンコピーですべての操作を実行します。すべてが適切に再作成されたことを確認した後でのみ、修正したデータを本番システムに移動する必要があります。
これを実行できるようにするために必要なのは、バックアップの最新のコピー(たとえば、バックアップがX時間前のものである)であり、クラスター上のoplogはX時間以上のデータを保持する必要があります。(a)レプリカセットのすべてのメンバーのoplogの内容が同じであり、(b)ノードメンバーごとにoplogサイズが異なる可能性があるため、どのノードのoplogを指定しませんでした。この場合、確認する必要があります。「最大の」もの。
つまり、最新のバックアップが52時間前のものであるとしましょう。しかし、幸いなことに、75時間分のデータを保持するoplogがあります(イェーイ)。
すべてのノード(プライマリおよびセカンダリ)に「不良」データがあることにすでに気付いているので、この最新のバックアップを新しいモンゴッドに復元します。ここで、これらのレコードを問題のある更新の直前の状態に復元します。次に、それらを現在のプライマリに移動して、そこからすべてのセカンダリに複製することができます。
バックアップを復元するときに、次のコマンドを使用してoplogコレクションのmongodumpを作成します。
mongodump -d local -c oplog.rs -o oplogD
oplogを独自のディレクトリに移動し、名前をoplog.bsonに変更します。
mkdir oplogR
mv oplogD/local/oplog.rs.bson oplogR/oplog.bson
次に、「問題のある」操作を見つける必要があります。bsondump
oplogR / oplog.bsonファイルのコマンドを使用して、人間が読める形式にoplogをダンプできます(次に、grepまたはwhat-notを使用して「不良」アップデートを見つけます)。use local
または、シェルのdb.oplog.rs.find()
コマンドを使用して、レプリカセットの元のoplogに対してクエリを実行することもできます。
ts
あなたの目標は、このエントリを見つけて、そのフィールドに注意することです。
次のようになります。
"ts" : Timestamp( 1361497305, 2789 )
mongorestore
コマンドには2つのオプションがあり、1つはと呼ばれ--oplogReplay
、もう1つはと呼ばれることに注意してくださいoplogLimit
。ここで、復元されたスタンドアロンサーバーでこのoplogを再生しますが、この問題のある更新操作の前に停止します。
コマンドは次のようになります(ホストとポートは新しく復元されたバックアップがある場所です):
mongorestore -h host --port NNNN --oplogReplay --oplogLimit 1361497305:2789 oplogR
これにより、oplogRディレクトリのoplog.bsonファイルから各操作が復元され、ts値Timestamp(1361497305、2789)のエントリの直前で停止します。
別のインスタンスでこれを行った理由は、復元と再生で作成された正しいデータを確認できるようにするためです。確認したら、復元されたレコードを実際のプライマリの適切な場所に書き込むことができます(レプリケーションの伝播を許可します)。セカンダリへの修正されたレコード)。