简述什么是WAL(Write Ahead Log)预写日志 ?
WAL(Write Ahead Log)预写日志是数据库系统中常见的一种手段,用于保证数据操作的原子性和持久性。在使用WAL的系统中,所有的修改在提交之前,都会先被可靠地写入到WAL管理的Log文件中,然后再通过Log文件中记录的日志执行真正的操作。如果遵循这个过程,就无需在每个事务的提交时等待系统落盘,因为无论何时发生何种情况,都可以使用日志进行数据库的恢复。
WAL的日志文件中通常包含redo和undo的信息。redo信息用于在数据库崩溃后重启时,通过重新执行数据库在崩溃之前的行为,使数据库恢复到崩溃之前的状态。而undo信息则用于记录撤销事务时对数据库所做的变更,保证在重复重启时不会重做。
此外,在PostgreSQL等数据库系统中,WAL机制还采用了“先写日志后写数据”的策略,即保证对数据库文件的修改发生在这些修改已经写入到日志之后。同时,还引入了日志写进程等机制,使得事务提交记录可以异步写入到磁盘,从而极大地减轻了I/O的压力。