面试题答案
一键面试1. 删除文档后存储层面(WiredTiger引擎)的变化
- 数据文件:在WiredTiger引擎中,删除文档时,并不会立即从磁盘的数据文件中移除该文档的物理空间。而是将该文档标记为已删除,这块空间被标记为可重用。随着后续的写入操作,新的数据可能会被分配到这些被标记为已删除的空间上。
- 缓存:WiredTiger会在内存缓存(B树结构等)中更新,移除指向已删除文档的指针等元数据信息,这样在后续的查询中就不会再返回这些已删除的文档。
2. 删除文档后索引层面的变化
- 索引更新:MongoDB中的索引是基于文档的特定字段构建的。当删除文档时,相关索引中指向该文档的索引条目会被删除。例如,如果有一个基于
user_id
字段的索引,当包含特定user_id
的文档被删除时,索引中对应的user_id
- 文档位置映射关系会被移除。这确保了索引与实际数据的一致性,避免查询通过索引找到已删除的文档。
3. 误删除且无备份情况下的恢复策略(假设开启了oplog)
- 使用oplog进行时间点恢复(Point - in - Time Recovery, PITR):
- 原理:oplog(操作日志)记录了MongoDB实例上执行的所有写操作。通过重放oplog中的记录,可以将数据库恢复到某个特定的时间点。
- 步骤:
- 首先,需要确定误删除操作发生的大致时间范围。可以通过查看应用程序日志、系统日志等,找到误删除操作对应的时间。
- 然后,使用
mongorestore
工具,并结合--oplogReplay
选项。mongorestore
会从最近的备份(虽然假设无备份,但可从oplog起始点开始)开始恢复数据,--oplogReplay
会重放oplog中记录的操作,从备份时间点一直到误删除操作之前的时间点,从而恢复误删除的数据。
- 局限性:如果oplog的保留时间有限,且误删除操作发生时间较早,超出了oplog保留范围,则无法完全恢复。另外,重放oplog过程中如果遇到错误(如数据结构不一致等问题),可能会导致恢复失败。
- 从Secondary节点恢复:如果存在Secondary节点,且其数据在误删除操作发生时未同步该删除操作,可以将Secondary节点提升为Primary节点,从而恢复数据。
- 原理:在复制集环境下,Secondary节点会从Primary节点同步数据。如果误删除操作还未同步到Secondary节点,那么该Secondary节点的数据就是未被误删除之前的状态。
- 步骤:
- 首先,需要停止复制集的自动故障转移机制,防止其他节点干扰恢复过程。
- 然后,将Secondary节点提升为Primary节点。可以使用
rs.promote()
命令(在MongoDB shell中)来完成提升操作。 - 最后,将其他节点重新配置为从新的Primary节点同步数据,使整个复制集恢复正常运行状态。
- 局限性:如果误删除操作已经同步到所有Secondary节点,此方法将无法恢复数据。同时,提升Secondary节点可能会影响应用程序的正常运行,需要在维护窗口等合适时间进行操作。