Mongodb 之 oplog

来源:https://www.cnblogs.com/frx9527/archive/2020/05/06/oplog.html
-Advertisement-
Play Games

一開始我就以為 oplog 應該就類似於 mysql bin-log 而事實上,確實差不多。oplog 也是用於複製集間由 Primary 記錄,Secondary 用來同步。從而保持數據一致。 最近遇到了誤刪db(刪庫不能跑路)的事情,所以,實驗了N多次的 oplog 恢複數據。 特地記錄一下,以 ...


一開始我就以為 oplog 應該就類似於 mysql bin-log 而事實上,確實差不多。oplog 也是用於複製集間由 Primary 記錄,Secondary 用來同步。從而保持數據一致。

最近遇到了誤刪db(刪庫不能跑路)的事情,所以,實驗了N多次的 oplog 恢複數據。

特地記錄一下,以備後查。

# ------------------------------ oplog ---------------------------------
## 1. 在複製集中使用 oplog ,可以使用以下命令查看oplog情況:
rpset1:PRIMARY> rs.printReplicationInfo()
configured oplog size: 10240MB
log length start to end: 149092secs (41.41hrs)
oplog first event time: Sun Apr 26 2020 20:25:46 GMT+0800 (CST)
oplog last event time: Tue Apr 28 2020 13:50:38 GMT+0800 (CST)
now: Tue Apr 28 2020 13:50:38 GMT+0800 (CST)

rpset1:SECONDARY> rs.printReplicationInfo()
configured oplog size: 10240MB
log length start to end: 149937secs (41.65hrs)
oplog first event time: Sun Apr 26 2020 20:10:59 GMT+0800 (CST)
oplog last event time: Tue Apr 28 2020 13:49:56 GMT+0800 (CST)
now: Tue Apr 28 2020 13:49:56 GMT+0800 (CST)

rpset1:SECONDARY> rs.printReplicationInfo()
configured oplog size: 10240MB
log length start to end: 148635secs (41.29hrs)
oplog first event time: Sun Apr 26 2020 20:32:00 GMT+0800 (CST)
oplog last event time: Tue Apr 28 2020 13:49:15 GMT+0800 (CST)
now: Tue Apr 28 2020 13:49:16 GMT+0800 (CST)

# 配置文件 conf/slave.conf 中的oplogSize
replication:
  oplogSizeMB: 10240
  replSetName: rpset1

 從以上的命令中可以看出,這個複製集的 oplog 有41小時的容量,而這個 mongodb 每天都有定時備份。所以,這個容量肯定是夠用了。

使用 oplogReplay 恢複數據,官文說必須要有一個特殊的許可權。

## 2. 創建專門的角色使用 oplogReplay  此角色必須有 anyResource 和 anyAction
# 備份時不需要此許可權,但恢復時必須要有此許可權,否則恢復失敗且沒有報錯信息。
use admin
db.createRole(
   {
    "role" : "sysadmin",
    "privileges" : [{ "resource" : {"anyResource" : true}, "actions" : ["anyAction"] }],
    "roles" : []
   }
)

# 創建專門的用戶使用此角色
db.createUser({user:"admin", pwd:"admin", roles:[{role:"sysadmin", db:"admin"}]})
# 或者授權某個用戶 db.grantRolesToUser( "root" , [ { role: "sysadmin", db: "admin" } ])  

 

檢查一下定時備份db的命令,找到如下:

## 3. 日常全量備份
./mongodump -h 10.170.6.116:27017 -u admin -p admin --authenticationDatabase admin --gzip -o /data/tmp/rs0

# 備份時如果有 --oplog 選項,輸出目錄下就會有 oplog.bson 文件
# ./mongodump -h 10.170.6.116:27000 -u rsroot -p abcd1234 --authenticationDatabase admin --oplog -o /data/tmp/rs0

 

因為備份時沒有帶 --oplog 參數,所以進行恢復時,使用先恢復備份,再 oplogReplay的方式完成,也就是參考下麵的第9點。

而4到8點,用來在恢復備份的同時帶上 oplogReplay 的方式。

## 4. 假設上次日常備份之後的某個時間點出現了誤刪除操作,就需要利用 oplogReplay 來恢復這段時間的新數據
# 先檢查上次日常備份的時間點(如果 dump 時使用了 --oplog 參數,就會有oplog.bson文件。如果沒有,可參考第9條):
./bsondump /data/tmp/rs0/oplog.bson > /data/tmp/0
cat /data/tmp/0  
# 找到第一行 {"ts":{"$timestamp":{"t":1588138496,"i":1}}, ...

# 欄位的意思:
ts: 操作發生的時間,t: unix時間戳, i: 可以認為是同一時間內的第幾個.
h: 記錄的唯一ID
v: 版本信息
op: 寫操作的類型
   n: no-op
   c: db cmd
   i: insert
   u: update
   d: delete

ns: 操作的namespace, 即: 資料庫.集合
o: 操作所對應的文檔
o2: 更新時所對應的where條件,更新時才有
# 起始時間戳可自由指定,不必oplog中找記錄。稍微早於需要的時間點即可。
./mongodump -h 192.168.6.116:27017 -u admin -p admin --authenticationDatabase admin -d local -c oplog.rs -q '{"ts":{"$gt": {"$timestamp":{"t":1588138300,"i":1}}}}' -o /data/tmp/rs1


## 5. 導出當前的 local/oplog.rs  註意 -q 選項的 JSON格式
# 因為備份整個 local/oplog.rs 容量太大,恢復也會耗時過長,所以採用起始時間的方式:
./mongodump -h 192.168.6.116:27017 -u admin -p admin --authenticationDatabase admin -d local -c oplog.rs -q '{"ts":{"$gt": {"$timestamp":{"t":1588138393,"i":1}}}}' -o /data/tmp/rs1
# 也可以同時指定結束時間,如下:
./mongodump -h 192.168.6.116:27017 -u rsroot -p abcd1234 --authenticationDatabase admin -d local -c oplog.rs -q '{"ts":{"$lte": {"$timestamp":{"t":1588142111,"i":1}}, "$gte": {"$timestamp":{"t":1588138393,"i":1}}}}' -o /data/tmp/rs2


## 6. 檢查 oplog.rs.bson 手工找出誤刪除的時間戳:
./bsondump /data/tmp/rs1/local/oplog.rs.bson > /data/tmp/1
# 打開 /data/tmp/1 手工查找,如果有刪除表或庫,則有 drop 信息, 如果有刪除數據,則有 "op":"d" 信息


## 7. 替換日常全備份中的 oplog.bson
rm -rf /data/tmp/rs0/oplog.bson
mv /data/tmp/rs1/local/oplog.rs.bson /data/tmp/rs0/oplog.bson


## 8. 執行恢覆命令(註意用戶許可權)
./mongorestore -h 192.168.6.116:27017 -u admin -p admin --authenticationDatabase admin --oplogReplay --oplogLimit "1588232764:1" --dir /data/tmp/rs0/ 
# 其中 1588232764 即是 $timestamp 中的"t",1 即是 $timestamp 中的 "i" 這樣配置後oplog將會
# 重放到這個時間點以前,即正好避開了第一條刪除語句及其後面的操作,資料庫停留在災難前狀態


## 9. 如果日常備份沒有 --oplog 並且使用了 --gzip,可以先恢復此備份。
# 然後再使用oplogReplay 指定單獨的 oplog.rs.bson 文件進行恢復.
./mongorestore -h 192.168.6.116:27017 -u admin -p admin --authenticationDatabase admin /data/tmp/rs0/ --gzip
./mongorestore -h 192.168.6.116:27017 -u admin -p admin --authenticationDatabase admin --oplogReplay --oplogLimit "1588232764:1" /data/tmp/rs1/local/oplog.rs.bson
# 有可能恢復時不成功,提示 “ applyOps field: no such field ” ,此時,只能使用上面的第8步的方式試試了。

不必擔心數據混亂。因為 oplog 的冪等性,即使多次Replay 也不會產生重覆數據。  已存在相同的 _id,即使其它欄位不同,也不會恢復,不存在的 _id 則會恢復。

當然,也可以將備份和oplog恢復到某台單機上,再使用導出導入的方法將數據移到生產環境。

 

試驗往單機恢復的時候,同一個命令執行多次,有時出錯有時成功,就不知道為什麼了。操作時只能是多試幾次了。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近 CentOS 系統,內部裝了許多軟體,導致磁碟空間大小不足,因此需要對系統的磁碟空間進行擴充。 1.虛擬機擴展磁碟容量 這裡填寫最終的磁碟大小,點擊擴展。 這裡的擴展只是增加了操作系統的磁碟空間,並沒有與系統內部的文件目錄掛載,所以,磁碟占有量還是不會變化,下一步就是要把擴展的容量掛載到文件目 ...
  • ngx_http_ssl_module簡介 為https提供支持 ngx_http_ssl_module參數解釋 1. ssl on|off; 2. ssl_certificate file; 當前虛擬主機使用PEM格式的證書文件 3. ssl_certificate_key file; 當前虛擬主 ...
  • 前言:在網上找了很多的博客教程,最後終於成功,記錄一下,方便日後的查找。 https://blog.csdn.net/M_Kerry/article/details/81664548大部分根據這個鏈接操作就好。 註意MySQL這裡會遇到很多問題。 完全卸載MySQL、mariadb https:// ...
  • 最近發現了一個比較好用的代理客戶端,比較智能;名字叫clash: https://github.com/Dreamacro/clash https://github.com/yichengchen/clashX https://github.com/Fndroid/clash_for_windows ...
  • 第三天MySQL學習 :分組函數、分組查詢、連接查詢(等值連接、非等值連接、自連接) ...
  • 學習視頻:https://www.bilibili.com/video/BV1tJ411r7EC?p=75 游標cursor:用於存放多條數據的容器。需要開始open和關閉close。游標下移使用“fetch...into...”。 declare cursor myCursor is select ...
  • /* *周一作為一周的開始 *當年的1月1號所在的周算作第一周 */ CREATE function GetWeekIndexFirstDate ( @date datetime ) returns int as begin /* *計算邏輯 *1.先找出當年的1月1號@firstDate *2.計 ...
  • Kylin on HBase 方案經過長時間的發展已經比較成熟,但也存在著局限性,因此,Kyligence 推出了 Kylin on Parquet 方案。通過標準數據集測試,與仍採用 Kylin on HBase 方案的 Kylin 3.0 相比,Kylin on Parquet 的構建引擎性能有... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...