为什么大多数关系数据库使用内存映射写入日志而不是直接写入磁盘?

时间:2014-02-22 12:58:18

标签: relational-database mmap

有可用于将可写入文件映射到内存的内存映射工具。我希望所有现代操作系统都能异步地反映内存对磁盘的变化,那么为什么大多数关系数据库会使用日志文件/日志呢?

1 个答案:

答案 0 :(得分:4)

使用memmapped文件(一般是RAM缓存),使用日志
并写入磁盘并不矛盾。

在RAM中保留大量使用的数据将加速一切。

不会立即将更改写入磁盘 如果发生碰撞(停电......),可能造成数据丢失 (主要数据和/或日志)。

更改日志很有用,例如,在使用事务性内容时 而不是单个陈述(即,必须执行的多个动作
完全或没有):如果在运输过程中发生了崩溃, 重启后,磁盘上会出现不一致的数据 (只完成部分交易) 通过更改日志,可以再次撤消半交易 编辑:当一个插入/更新...没有直接映射到磁盘块,
通过缓存/写入某些磁盘块无法解决。

编辑@ comment: 不,正如我所说,db操作不会映射到磁盘块 让我们说表中有三个值:v1,v2,v3 v1和v2在块b2中的HDD块b1,v3中。

用户现在想要的:首先,将v1更改为100
然后在事务中添加123到v2和v3,
即。要么添加两者,要么不添加。
v1和v2的变化顺利进行,然后断电。

理论上,v2需要对旧值进行“回滚” 你如何只使用日记FS来做到这一点? 您可能会拥有磁盘块b1的旧内容和新内容 新内容v2已经改变:坏。
如果您使用旧内容,则也可以撤消v1的更改。坏。
您可以从新区块中取v1,从旧区块中取v2,是的 但是你怎么知道,没有数据库日志的哪个块可以采取什么?

edit2 :如果您可以在评论中保持原始问题不变,那就太好了。
它类似于“如果日记FS不会弃用数据库日志”。