MongoDB 4.2.23执行mongorestore显示成功但查询不到文档的问题求助
我来帮你分析下这个头疼的问题——恢复日志明明白白显示成功恢复了19098个文档,但实际查询却返回0,换客户端也没用,这种情况通常有几个常见的排查方向,咱们一步步来:
1. 先确认备份归档里的命名空间是否和你预期的一致
你用了--nsInclude="mfm-data.*"来过滤要恢复的集合,但有可能备份里的集合命名空间和你想的不一样(比如大小写差异、额外前缀)。你可以先列出归档里的所有内容,看看目标集合的完整名称:
mongorestore --list --archive=/oradata/backup/mongo/mobile/mongo-mobile_backup_20221221_000002.tar
确认输出里有没有mfm-data.communication这个集合,避免因为命名空间不匹配导致恢复了个“假集合”。
2. 检查是不是恢复到了错误的数据库
MongoDB在区分大小写的文件系统(比如OEL的ext4)上,数据库名是大小写敏感的。你执行use mfm-data切换到了这个库,但有没有可能恢复时数据被写到了类似MFM-Data或者mfm_data的其他库?可以先列出所有数据库看看:
show dbs
如果有相似名称的库,进去检查下里面的集合和数据。
3. 确认你连接的是集群的主节点
因为你用的是MongoDB Enterprise集群,要是你连接的是从节点,可能会出现数据同步延迟的情况(虽然日志显示恢复完成,但从节点还没同步完),或者甚至因为权限问题看不到最新数据。你可以在当前连接里执行以下命令确认节点角色:
db.isMaster()
看输出里的ismaster字段是不是true,如果不是,切换到主节点再查询试试。
4. 尝试删除现有集合后重新恢复
你恢复时没有加--drop参数,日志显示“restoring to existing collection mfm-data.communication without dropping”,虽然日志说成功,但有可能旧集合的某些状态(比如索引冲突、数据残留)导致新恢复的数据不可见。你可以先删除这两个集合,再重新恢复:
# 先删除集合 mongo --eval "use mfm-data; db.communication.drop(); db.imageInfo.drop();" # 重新执行恢复 mongorestore --nsInclude="mfm-data.*" --archive=/oradata/backup/mongo/mobile/mongo-mobile_backup_20221221_000002.tar
恢复完成后再查count,看看数据能不能正常显示。
5. 检查MongoDB服务器日志找线索
有时候恢复日志的客户端输出只显示成功,但服务器端可能有警告或错误(比如磁盘空间不足、权限问题、索引创建失败)。你可以去MongoDB的日志目录(通常是/var/log/mongodb/,具体看你的配置),搜索mfm-data.communication相关的条目,看看有没有异常信息。
6. 验证备份归档本身是否有数据
可以尝试把归档里的单个集合导出到本地文件,确认备份本身是有数据的:
mongorestore --nsInclude="mfm-data.communication" --archive=/oradata/backup/mongo/mobile/mongo-mobile_backup_20221221_000002.tar --out=/tmp/test-restore
然后查看/tmp/test-restore/mfm-data/communication.bson的大小,如果这个文件有明显的体积(比如和恢复日志里的5.18GB接近),说明备份没问题,问题出在恢复到数据库的环节;如果文件是空的,那可能备份的时候就没正确保存数据。
备注:内容来源于stack exchange,提问作者Bubel Zokhan

