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

标签 relational-database mmap

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

最佳答案

使用内存映射文件(一般为 RAM 缓存),使用日志
并写入磁盘并不矛盾。

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

不立即将更改写入磁盘会导致
如果崩溃(停电......),可能会丢失数据
(主要数据和/或日志)。

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

编辑@评论:
不。正如我所说,数据库操作不会映射到磁盘块。
假设表中有三个值:v1、v2、v3。
v1 和 v2 在硬盘块 b1 中,v3 在块 b2 中。

用户现在想要的:首先,将 v1 改为 100
然后在一个事务中将 123 添加到 v2 和 v3,
IE。要么添加要么不添加。
v1和v2的变化工作顺利,然后停电。

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

编辑2 :如果您可以在评论中保持原始问题不变,那就太好了。
这就像“如果日志文件系统不弃用数据库日志”。

关于relational-database - 为什么大多数关系数据库使用内存映射写入日志而不是直接写入磁盘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21954657/

相关文章:

database-design - 如何为多种产品设计产品表,其中每种产品都有很多参数

php - Laravel - Eloquent 关系不起作用

c++ - 将 mmap 偏移量的最后 12 位归零

c - C mmap 和 numpy memmap 之间的差异

c++ - 为什么我们可以映射到一个文件但超过文件大小?

sql - 选择常量作为伪列并对伪列进行算术运算

php - "Conditional"根据字段值加入?

database - 将三元关系映射到关系模型(员工、客户、项目)

c - 如何在c中使用mmap

python - 如何使用 python 找出 (windows) 内存映射文件是否已经存在