一. 背景 今天在MongoDB 4.0.4版本下,在還原恢複數據庫時報錯。 主要錯誤為: Failed: restore error: error applying oplog: applyOps: not authorized on admin to execute command { appl ...
一. 背景
今天在MongoDB 4.0.4版本下,在還原恢複數據庫時報錯。
主要錯誤為:
Failed: restore error: error applying oplog: applyOps: not authorized on admin to execute command { applyOps: [ { ts: Timestamp(1548004840, 1), h: 1234878425364100170, v: 2, op: "u", ns: "config.system.sessions", o: { $v: 1, $set: { lastUse: new Date(1548004840930) } }, o2: { _id: { id: UUID("375d7607-1a37-46ff-969d-76cba89ecd1d"), uid: BinData(0, A6653754954E376BB727538E13AB142D86A1278B7DD827C77241907FB377D777) } } } ], $db: "admin" }
具體的錯誤截圖如下:
從這個圖中可以看出,正常的完整備份已恢復OK,只是在恢復備份過程中產生的oplog的備份時報錯,replaying oplog產生Error。
MongoDB oplog的相關知識可參照 博客 https://www.cnblogs.com/xuliuzai/p/9832333.html 和 https://www.cnblogs.com/xuliuzai/p/9917137.html 上相關介紹。
二 . 錯誤分析
從報錯信息 :not authorized on admin to execute command ,可以初步判斷是賬號許可權的問題。
回頭看下,檢查下我們的新MongoDB實例的設置,已在還原實例上設置了 root 許可權的賬號,並且 登入驗證,賬號是沒有問題的。
執行的還原命令 也是用的root許可權的賬號,也是沒有問題的啊。
這就很奇怪!印象中,在之前的版本中沒有遇到過類似的錯誤。
這時想到去查看mongodb的運行log,說不定有相關的錯誤信息。
在log中,發現緊挨著 這個報錯信息的地方還有一個錯誤 信息
2019-01-21T14:45:03.076+0800 W ACCESS [conn7] Could not insert user testroot@admin in _mergeAuthzCollections command: DuplicateKey: User "testroot@admin" already exists。
而log錯誤信息中的testroot正是我們 在 還原實例 和代還原實例上都擁有root角色許可權的賬號。
所以,問題基本可以定位到了:就是還原實例上已經有了testroot賬號,所以在還原admin 資料庫時,還原庫上的testroot賬號insert不進來,而還原oplog備份需要原來的賬號信息。
怎麼驗證這個推斷是否正確呢?最直接的辦法就是 將還原資料庫所在的實例設置為免密登入,再進行驗證即可:
step 1 ,將新實例(還原的實例)服務關閉;
step 2,將mongodb 下的數據文件刪除 ,logs文件保留。
step 3,將conf 配置文件中auth=true 註釋掉
step 4,重啟mongodb服務。
在此執行還原,執行OK,不再報錯。
2019-01-21T16:15:00.234+0800 replaying oplog
......
2019-01-21T16:15:00.364+0800 done
註意:在完整還原的基礎上,再逐一還原oplog時也會報類似錯誤(即增量備份還原也有類似錯誤),所以建議資料庫完全還原完後再設置登入驗證。
三 .解決方案
方案1. 如上文的測試一樣,將新的MongoDB實例設置為免密登入,恢復後馬上設置驗證登入,即配置文件中添加auth=true,然後,重啟服務(推薦,但還原後一定要設置密碼方式登入。)。
方案2. 待還原的實例和新的實例,兩者的root許可權的賬戶不要命名一樣,這樣也可以避免 DuplicateKey,影響admin資料庫的賬號還原。
本文版權歸作者所有,未經作者同意不得轉載,謝謝配合!!!