<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                #### **描述:** ### 根據技術反饋,上午有人誤操作刪除了線上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備份。 ![](images/screenshot_1584070305356.png) **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-12T16:52:37.421+0800 done dumping jia_test.user (1000 documents) ### 刪除時間也知道了,我們需要把全量備份成功的時間,進行一下轉換,我們拿到時間戳, 盡量在備份時間在提前十分鐘,這樣我們日志就不會出現缺失,導入重復會自動覆蓋。 ![](images/screenshot_1584004718333.png) **我們拿到兩個時間戳:** >備份時間戳: 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正式業務,至少要使用復制集,不要單點,數據一定要有備份。 前段時間某公司刪除數據導致損失好幾億, ### **數據不備份 運維兩行淚**
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看