将mongo数据链接到/data/db文件夹到卷Mongodb Docker

将mongo数据链接到/data/db文件夹到卷Mongodb Docker,mongodb,docker,docker-compose,persistent-volumes,Mongodb,Docker,Docker Compose,Persistent Volumes,我不小心删除了一卷docker mongo data:/data/db,我有一份该文件夹的副本,现在的问题是,当我运行docker compose up mongodb container时,出现了一个mongo_1退出的错误,下面是代码14。有关错误和mongo data文件夹的更多详细信息,有人可以帮助我吗 在docker-compose.yml中 卷数: -./mongo数据:/data/db 从备份文件还原 修复docker容器中故障mongodb中损坏文件的分步过程: !!在你开始

我不小心删除了一卷docker mongo data:/data/db,我有一份该文件夹的副本,现在的问题是,当我运行docker compose up mongodb container时,出现了一个mongo_1退出的错误,下面是代码14。有关错误和mongo data文件夹的更多详细信息,有人可以帮助我吗

在docker-compose.yml中

卷数: -./mongo数据:/data/db

从备份文件还原 修复docker容器中故障mongodb中损坏文件的分步过程:

  • !!在你开始之前,把这些文件复制一下

  • 确保您知道容器中运行的是哪个版本的映像

  • 使用生成新容器来运行修复过程,如下所示

    docker run -it -v <data folder>:/data/db <image-name>:<image-version> mongod --repair
    
    docker run-it-v:/data/db:mongod--repair
    
  • 修复文件后,您可以从
    docker compose

  • 如果修复失败,通常意味着文件已损坏,无法修复。通过将数据导出为,仍然有机会修复它

    如何保护正确的备份文件 数据库不断地处理这些文件,因此磁盘上的文件不断地更改。此外,数据库将保留内部内存缓冲区中的一些更改,然后再将它们刷新到文件系统。尽管数据库引擎在确保数据库可以通过使用两阶段提交过程(首先更新事务日志而不是数据文件)从突发故障中恢复方面做得很好,但复制文件时可能会出现损坏,从而阻止数据库恢复

    造成这种损坏的原因是复制进程不知道数据库写入进程的进度,这会造成
    竞速情况。用非常简单的话来说,当数据库处于写入过程中时,复制过程将创建文件的一个副本,该副本被更新了一半,因此它将被损坏

    当数据库编写器正在写入文件时,我们称它们为
    hot
    文件<代码>热文件
    是从操作系统角度来看的术语,MongoDB还使用了一个术语<代码>热备份,这是从<代码>MongoDB角度来看的术语<代码>热备份表示备份是在数据库运行时进行的

    要拍摄正确的快照(确保文件是冷的),您需要按照说明的步骤进行操作。简而言之,在此过程中发出的命令
    db.fsyncLock()
    将通知数据库引擎刷新所有缓冲区并停止写入文件。这将使文件
    变冷
    ,但数据库仍保持
    ,因此术语
    热文件
    热备份
    之间存在差异。复制完成后,通过发出
    db.fsyncUnlock()

    注意,该过程更为复杂,可能会随着数据库版本的不同而变化。在这里,我对其进行了简化,以说明有关文件快照问题的要点。为了确保正确和一致的备份,请始终遵循所使用数据库版本的文档化过程

    建议的备份方法 首选的备份应该始终是数据转储方法,因为这样可以确保即使在数据库引擎升级/降级的情况下也可以进行恢复
    MongoDB
    提供了一个非常有用的工具,名为
    mongodump
    ,可以通过转储数据而不是复制文件来创建数据库备份


    有关如何使用备份工具以及其他备份方法的详细信息,请阅读MondoDB文档的章节。

    检查文件权限、文件所有者,并检查文件是否损坏。@jordanvrtanoski我已检查了权限和所有者,一切正常,如何修复损坏的文件?您可以尝试在数据文件夹顶部运行带有
    mongod--repair
    的容器,如果可以,请在数据上运行服务器容器!在做任何事情之前,请保留一份数据副本!继续之前阅读,了解有关恢复选项的更多详细信息。您好,谢谢帮助。它对我不起作用,我设法接收了旧文件夹,当我使用docker compose启动容器时,它工作了一段时间,然后再次发出一条消息,退出代码为14,不知道是什么问题,上面的命令发出此消息“msg”:“收集验证完成。未发现损坏”错误14与数据存储库“WiredTiger”有关,主要与数据库文件的状态有关,可能是:1)权限,2)损坏,3)时间同步,4)如果是macOS,则是从macOS共享FIL的VM机制。故障排除可能很耗时,因此我建议,如果您在修复后使用独立容器启动数据库,请导出数据并将其导入另一个干净的实例中。我在linux CentOS 8中运行它,确保权限相同,没有损坏迹象,但时间同步不知道如何检查,最后,我再次重新插入了所有的数据,但这种情况再也不会发生了,但是,我需要知道问题出在哪里,对于以后的问题,我必须修复现有的数据库文件夹(卷)。您所说的完全是我所做的,并导致了这个问题(复制热文件),现在,我创建了一个使用mongodump命令创建备份的脚本,并将阅读有关fsyncLock和fsyncUnLock的更多信息谢谢