Mongodbバックアップを任意の時点にリカバリ
説明:
技術のフィードバックによると、午前中にオンラインmongodb表のデータを誤って削除した人がいて、ユーザーはすでにカスタマーサービスにフィードバックして、今ユーザーにデータを回復する必要があります。
まず、削除されたデータのデータベース・アーキテクチャがどのパターンであるかを決定します。
1.1、単点:バックアップがあるか、バックアップがある場合、一つのインスタンスを起動し、バックアップデータを新しいインスタンスにインポートし、新しいインスタンスに削除されたデータがあるかどうかを調べ、mongodumpを使ってデータをエクスポートし、ソースの削除されたデータインスタンスにインポートし、データを回復する.詳細は本章の下の内容を参照してください:2.2バックアップと2.5リカバリ単一ノードmongodbにはoplogの概念がなく、バックアップがなければデータが失われ、正式な環境ではできるだけレプリケーションセットアーキテクチャを使用します.
1.2、複製セット:1.2.1、遅延ノードの形式を採用することができ、一つのPRIMARYノード、二つのSECONDARYの中の一つは遅延ノードとして、例えば私たちは遅延ノードが8時間遅延した場合、私たちはデータを削除して8時間以内に発見し、回復する(oplogがカバーされないことを保証する場合)1.2.2、全量+増分:データ量と重要性によって、天全量バックアップ+時間増分oplogバックアップ、あるいは周全量バックアップ+日増分oplogバックアップを選択する.1.3、スライスクラスタスライスクラスタも複数の複製セットから構成され、バックアップ方式は複製セットのバックアップ戦略に従うことができる
2、複製セットアーキテクチャシミュレーションの誤削除:
フルバックアップ+oplogインクリメンタルバックアップ方式2.1、1000個のデータを挿入:for(var i=0;i<1000;i+){db.user.save({"userid":i})}
[root@10-1-1-159 ~]# /data/mongodb3.6.9/bin/mongo 10.1.1.159:27020
rs02:PRIMARY> use jia_test
switched to db jia_test
rs02:PRIMARY> for (var i=0;i<1000;i++){ db.user.save({"userid":i}) }
rs02:PRIMARY> db.user.count()
1000
rs02:PRIMARY> db.user.find()
{ "_id" : ObjectId("5e69f820ce1bb2285a21a343"), "userid" : 0 }
{ "_id" : ObjectId("5e69f820ce1bb2285a21a344"), "userid" : 1 }
{ "_id" : ObjectId("5e69f820ce1bb2285a21a345"), "userid" : 2 }
{ "_id" : ObjectId("5e69f820ce1bb2285a21a346"), "userid" : 3 }
2.2、フルバックアップを行います.
[root@10-1-1-159 ~]# /data/mongodb3.6.9/bin/mongodump -h 10.1.1.159:27020 -d jia_test -o /root/
2020-03-12T16:52:37.418+0800 writing jia_test.user to
2020-03-12T16:52:37.421+0800 done dumping jia_test.user (1000 documents)
2.3、第一のケース:バックアップ後数時間で削除操作を行う場合、データを新しいインスタンスに導入すればデータを取り戻すことができる.これは簡単すぎる.リカバリにはバックアップが必要です.2.4、第二の状況を継続する
データを挿入し続けます.
[root@10-1-1-159 ~]# /data/mongodb3.6.9/bin/mongo 10.1.1.159:27020
rs02:PRIMARY> use jia_test
rs02:PRIMARY> db.user.insert({"userid" :1000})
WriteResult({ "nInserted" : 1 })
rs02:PRIMARY> db.user.insert({"userid" :1001})
WriteResult({ "nInserted" : 1 })
rs02:PRIMARY> db.user.insert({"userid" :1002})
WriteResult({ "nInserted" : 1 })
rs02:PRIMARY> db.user.insert({"userid" :1003})
WriteResult({ "nInserted" : 1 })
rs02:PRIMARY> db.user.insert({"userid" :1004})
WriteResult({ "nInserted" : 1 })
rs02:PRIMARY> db.user.insert({"userid" :1005}) #1、
WriteResult({ "nInserted" : 1 })
rs02:PRIMARY> db.user.remove({"userid" :1003}) #2、
WriteResult({ "nRemoved" : 1 })
rs02:PRIMARY> db.user.insert({"userid" :1006}) #3、
WriteResult({ "nInserted" : 1 })
rs02:PRIMARY>
「userid」:1003のこのデータを復元し、削除の直前、すなわち実行dbに復元する必要があります。user.remove({「userid」:1003})という時点の前です。
2.5.フル・バックアップをインポートする新しいレプリカ・セット・インスタンスを作成する
[root@10-1-1-159 ~]# /data/mongodb3.6.9/bin/mongorestore -h 10.1.1.77:27010 -d jia_test /root/jia_test/
2020-03-12T17:03:27.054+0800 the --db and --collection args should only be used when restoring from a BSON file. Other uses are deprecated and will not exist in the future; use --nsInclude instead
2020-03-12T17:03:27.055+0800 building a list of collections to restore from /root/jia_test dir
2020-03-12T17:03:27.056+0800 reading metadata for jia_test.user from /root/jia_test/user.metadata.json
2020-03-12T17:03:27.074+0800 restoring jia_test.user from /root/jia_test/user.bson
2020-03-12T17:03:27.099+0800 no indexes to restore
2020-03-12T17:03:27.099+0800 finished restoring jia_test.user (1000 documents)
2020-03-12T17:03:27.099+0800 done
/data/mongodb3.6.9/bin/mongo 10.1.1.77:27010
rs02:PRIMARY> db.user.count()
1000
rs02:PRIMARY>
2.6、oplogログをエクスポートする:
### 、
[root@10-1-1-159 ~]# /data/mongodb3.6.9/bin/mongo 10.1.1.159:27020
rs02:PRIMARY> use local
switched to db local
rs02:PRIMARY> db.oplog.rs.find({"op":"d","ns":"jia_test.user"}) #op ,d ,ns ,oplogs oplog
{ "ts" : Timestamp(1584003536, 1), "t" : NumberLong(1), "h" : NumberLong("5476681688775461425"), "v" : 2, "op" : "d", "ns" : "jia_test.user", "ui" : UUID("2527737e-eeea-415b-95de-061b6615a23c"), "wall" : ISODate("2020-03-12T08:58:56.056Z"), "o" : { "_id" : ObjectId("5e69f9b02e42450b5489dd4f") } }
rs02:PRIMARY>
既知:フルバックアップ時間:2020-03-12 T 16:52:37.421+0800 done dumping jia_test.user (1000 documents)
削除時間もわかりましたが、フルバックアップに成功した時間を変換し、タイムスタンプを取得する必要があります。
バックアップ時間を10分前にすると、ログが失われず、インポートが自動的に上書きされます.タイムスタンプを2つもらいました
バックアップタイムスタンプ:1584002557削除タイムスタンプ:「ts」:Timestamp(1584003536,1)
削除データ・インスタンスのoplogログをエクスポートします(バックアップ時間よりも削除時間よりも大きい場合)。
[root@10-1-1-159 ~]# /data/mongodb3.6.9/bin/mongodump -h 10.1.1.159:27020 -d local -c oplog.rs -q '{ts:{$gt:Timestamp(1584002557, 1),$lt: Timestamp(1584003536, 1)},"ns":{"$regex":"jia_test.user"}}' -o .
2.7、oplogを新しいインスタンスにインポートする:
[root@10-1-1-159 ~]# /data/mongodb3.6.9/bin/mongorestore -h 10.1.1.77:27010 –oplogReplay local/oplog.rs.bson
2.8、接続の新しいリカバリインスタンスの表示:
[root@10-1-1-77 ~]# /data/mongodb3.6.9/bin/mongo 10.1.1.77:27010
rs02:PRIMARY> use jia_test
switched to db jia_test
rs02:PRIMARY> db.user.count()
1006
rs02:PRIMARY> db.user.find({"userid":1003}) # 1003
{ "_id" : ObjectId("5e69f9b02e42450b5489dd4f"), "userid" : 1003 }
rs02:PRIMARY> db.user.find({"userid":1006}) # 1006 , , 。
rs02:PRIMARY>
2.9、古いインスタンスの表示:
[root@10-1-1-159 ~]# /data/mongodb3.6.9/bin/mongo 10.1.1.159:27020
rs02:PRIMARY> use jia_test
switched to db jia_test
rs02:PRIMARY> db.user.count()
1006
rs02:PRIMARY> db.user.find({"userid" :1003}) #1003
rs02:PRIMARY> db.user.find({"userid" :1006}) #1006 ,
{ "_id" : ObjectId("5e69f9d42e42450b5489dd52"), "userid" : 1006 }
rs02:PRIMARY>
2.10新しいインスタンスデータをエクスポートして、オンラインの正式な環境にインポートすればいいです.
お知らせ:Mongodbの正式な業務は、少なくともレプリケーションセットを使用し、単点ではなく、データにバックアップが必要です。
この間、ある会社がデータを削除して何億も損失しました.