1.3.2需要写日志的操作分析
1.3.2.1主要操作步骤分析:
所有可进行恢复的项目,都需要在事务进行的过程中按照如下顺序写日志,以便在需要恢复时有足够的备份信息帮助恢复。
如执行“insert into table_1 values(1,1)”,将调用“heap_insert”方法,执行“heap_insert”方法完毕后,就需要立即执行“XLogInsert”,以便记载信息:
recptr = XLogInsert(RM_HEAP_ID, info, rdata);
PageSetLSN(page, recptr);
PageSetTLI(page, ThisTimeLineID);
注意,所有写日志的操作都调用XlogInsert()进行,XlogInsert()中通过调用XLogWrite()将日志记录写入缓冲区,“XLogInsert”的返回值是“XLogRecPtr”结构类型,其实际功效可以作为“LSN”(log secquence number)使用,在执行“XLogInsert”后,即把其返回值“XLogRecPtr”类型的内容通过调用“PageSetLSN”记载到“page”中,这提示我们将来可以据此考虑实现增量备份。
随后,调用“PageSetTLI”把本次系统启动以来(不管是否恢复过)相对应的正确的时间线“ThisTimeLineID”记载到“page”(page将在适时的时候被pgwriter刷出到磁盘),这样,保证了本次系统运行中所执行的事务在xlog日志中记载的时间线不和上次相同,以便于区分不同的恢复数据。
当事务要结束的时候,将调用“XlogFlush” 把日志缓冲区中的数据刷到磁盘上,以保证“WAL”的实施(注意下图中的事务提交和取消调用与“XlogFlush”的关系):