![](/img/trans.png)
[英]Why my mongodb docker not writing data to host folder using volume?
[英]Link mongo-data to /data/db folder to a volume Mongodb Docker
從 docker 容器中的故障 mongodb 修復損壞文件的分步過程:
, 在你開始之前。 制作文件的副本。 !
確保您知道容器中運行的是哪個版本的映像
生成新容器以運行修復過程,如下所示
docker run -it -v <data folder>:/data/db <image-name>:<image-version> mongod --repair
修復文件后,您可以從docker-compose
啟動容器
如果修復失敗,通常意味着文件損壞無法修復。 仍然有機會按照此處所述導出數據來修復它。
數據庫不斷地處理文件,因此磁盤上的文件不斷變化。 此外,數據庫將在內部 memory 緩沖區中保留一些更改,然后再將它們刷新到文件系統。 盡管數據庫引擎在確保數據庫可以通過使用 2 階段提交過程(首先更新事務日志而不是數據文件)從突然故障中恢復方面做得很好,但是當文件被復制時,可能會出現損壞將阻止數據庫恢復。
這種損壞的原因是復制過程不知道數據庫寫入過程的進度,這會產生racing condition
。 用非常簡單的話來說,當數據庫正在寫入時,復制過程將創建一個半更新文件的副本,因此它將被破壞。
當數據庫編寫器正在寫入文件時,我們稱它們為hot
文件。 從操作系統的角度來看, hot files
是術語,MongoDB 也使用了從MongoDB
角度來看的術語hot backup
。 Hot backup
是指在數據庫運行時進行備份。
要拍攝正確的快照(確保文件是cold
的),您需要按照此處說明的過程進行操作。 簡而言之,在此過程中發出的命令db.fsyncLock()
將通知數據庫引擎刷新所有緩沖區並停止寫入文件。 這將使文件cold
,但數據庫仍然hot
,因此術語hot files
和hot backup
之間存在差異。 復制完成后,通過發出db.fsyncUnlock()
通知數據庫開始寫入文件系統
請注意,該過程更復雜,並且可以隨着數據庫的不同版本而改變。 在這里我對其進行簡化,以說明文件快照存在的問題。 為了確保正確和一致的備份,請始終遵循您使用的數據庫版本的記錄過程。
首選備份應始終是數據轉儲方法,因為這可確保即使在升級/降級數據庫引擎的情況下您也可以恢復。 MongoDB
提供了非常有用的工具,稱為mongodump
,可用於通過轉儲數據而不是復制文件來創建數據庫備份。
有關如何使用備份工具以及其他備份方法的更多詳細信息,請閱讀 MondoDB 文檔的MongoDB 備份方法一章。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.