数据是MongoDB的核心,MongoDB通过使用Journal日志保证数据的安全。Journal日志用于记录上一个检查点之后发生的数据更新,并将更新的信息顺序写入Journal日志文件中。通过使用Journal日志能够将数据库从系统异常终止事件中还原到一个有效的状态。通过6.5.1.3小节的介绍了解到,MongoDB使用预写日志机制实现数据的持久化。每个Journal日志文件的大小是100M,并存储在由参数--dbpath指定的下的journal子目录中,如下所示:
tree /data/mydata/journal/ # 输出的信息如下: /data/mydata/journal/ ├── WiredTigerLog.0000000001 ├── WiredTigerPreplog.0000000001 └── WiredTigerPreplog.0000000002
提示:在默认情况下,MongoDB已经启用了Journal日志记录,如果没有启用可以通过在启动MongoDB服务器时指定参数--journal来启动Journal日志记录。
视频讲解如下:
当MongoDB发生数据丢失时,Journal日志文件可以用于数据的恢复。此时,MongoDB会重新执行从上一个检查点之后发生的数据更新操作,将数据还原到Journal日志记录的一致性状态。数据恢复的过程如下:
(1)从数据文件中查找上一个检查点发生的标识值。
(2)在Journal日志文件中搜索匹配上一个检查点的标识值的日志记录。
(3)重新执行匹配到的所有Journal日志记录以恢复数据。
提示:WiredTiger存储引擎会使用内存缓冲区来存储Journal日志信息,该缓冲区默认大小是128KB。当缓冲区中的日志信息超过了设定的128KB,才会将其写入到Journal日志文件中。这就意味着,如果MongoDB发生异常关机时,使用WiredTiger存储引擎将有可能丢失最大128KB的数据更新。