WAL¶
参考 https://zhuanlan.zhihu.com/p/137512843
1 什么是 WAL 日志¶
WAL 日志是指 Write-Ahead Logging,即预写式日志。是一种被广泛应用于数据库系统中的一种数据结构或设计模式。其原理是先将所有操作记录下来,之后再顺序执行,保证操作的原子性,一旦系统异常,就可以通过日志进行恢复。
2 WAL 设计¶
WAL 日志的设计,可以简单分为以下几个步骤: 1. 在每次写入前将日志信息先写到硬盘的一定位置,保证在事务没有完成时也能进行恢复; 2. 将日志信息所引起的变化计入日志文件,并先写入到“redo”日志中,这样就可以通过重新读取该部分日志来重现数据操作; 3. 当事务执行完成,对事务提交进行 ACK 确认,并将包括该事务“undo”信息的日志标记为完成。
例如,在一个简单的关系型数据库中,当我们需要对一条记录进行修改时,此时相应的更新操作首先需要被记录到 WAL 日志中;之后才能依次执行实际的操作,并将修改后的信息写入内存数据库中。
3 WAL 面试题¶
3.1 什么是 WAL 日志?请具体讲解其设计原理及作用?¶
WAL 日志是一种设计模式,在每次 更新操作前将其记录到日志中,并保证在事务没有完成时也能进行恢复。WAL 的作用是确保数据的原子性,防止数据丢失,在异常情况下可以通过日志进行恢复。
3.2 如何防止恶意攻击者删除 WAL 日志?¶
日志文件的内容可以加密,只有拥有密钥的用户才能读取和修改日志文件。此外,该信息在写日志时通常会 同时写入多个地方,而要删除一条日志记录,则需要在所有写入的位置都进行删除,否则就会发生不一致的情况。
3.3 什么时候从 WAL 日志中清理数据?¶
由于 WAL 日志是用来保证数据的可靠性和完整性,因此它们通常会保存在磁盘上。一般来说,WAL 日志中的数据是在事务 END 时写入的,并根据数据的修改时间和日志大小决定何时删除。