PostgreSQL-日志管理介绍
- 概述
1、日志管理器:
- 日志模块包括事务提交日志CLOG和数据日志XLOG。其中CLOG是系统为整个事务管理流程所建立的日志,主要用于记录事务的状态,同时通过SUBTRANS日志记录事务的嵌套关系。XLOG日志是数据库日志的主体,记录数据库中所有数据操作的变化过程。因此,XLOG日志管理器模块提供了日志操作的API供其他模块调用。
- 日志伴随着系统启动开始,始终在反复完成插入、刷新这样的过程,一旦系统崩溃还要完成数据恢复的功能。
2、SLRU缓冲池:PGSQL通过SLRU缓冲区来实现对CLOG日志、SUBTRANS日志以及MultiXact日志的管理。
SLRU缓冲池采用简单LRU算法作为页面置换算法的缓冲池。
SLRU由8个缓冲区组成。每个缓冲区为一个页面,对应一个磁盘块,大小为8KB。页面调度算法采用SLRU算法,即简单的最近最少使用算法。
SLRU缓冲池的并发控制:
一个LWLock保护缓冲区内容
一个LWLock保护I/O同步
3、CLOG日志管理器:CLOG日志管理器管理着CLOG日志缓冲池,该日志缓冲池是基于SLRU缓冲池实现的。CLOG日志记录的是事务的最终状态。
CLOG记录的四种事务状态:
事务正在运行in_progress
事务已提交committed
事务中止aborted
子事务已提交sub_committed
4、SUBTRANS日志管理器:记录子事务与父事务的关系。
SUBTRANS日志管理器管理一个基于SLRU缓冲池的缓冲池,存出每个子事务的父事务ID,通过遍历事务树可以由子事务到父事务,但是无法由父事务找到子事务。SUBTRANS日志只记录当前事务的父事务信息,系统崩溃或者重启时不保存数据。不需要和XLOG交互,也没有REDO操作。
5、MultiXact日志管理器
MultiXactID:由于PGSQL采用了多版本并发控制,那么同一个元组相关联的事务ID可能有多个,为了在加锁(行被多个事务加共享锁)的时候统一操作,PGSQL将与该元组相关联的事务ID组合用一个MultiXactID代替来管理。
6、XLOG日志管理器
XLOG是传统数据库理论中提到的事务日志,它详细记录了后端进程对数据库的操作过程(修改操作)。
每个XLOG文件都有一个ID,一个日志文件逻辑上为4G,实际上被分为一个个16MB的段文件存放,日志段文件名由时间线ID、日志ID、段ID的八位16进制数以此构成。
确定日志文件内一个日志记录,只需用一个XLOG文件号和日志记录在该文件内的偏移量即可。
XLOG日志管理器的主要操作:
XLOG日志的启动:系统引导时,创建第一个XLOG日志文件,同时在XLOG中插入第一条检查点记录,同时调用BootStrapCLOG、BootStrapSUBTRANS和BootStrapMultiXact对CLOG、SUBTRANS、MultiXact日志记录分别进行初始化。
XLOG日志文件的创建:建立一个新的XLOG段文件,使其成为当前的段或一个紧邻当前段的段。
XLOG日志文件的归档:按照WriteRqst所指示的写请求将日志写/同步到磁盘日志文件中
XLOG日志的刷新:确保到达给定位置的所有的XLOG数据都被刷写回磁盘
XLOG日志的插入:根据一个XlogRecData链表及相应的资源管理器信息,向XLOG日志文件中插入一条XLOG记录,事务执行插入、删除、更新、提交、中止等命令时需要调用该函数。
XLOG日志的打开:创建一个新的XLOG段文件或者打开一个已存在的XLOG段文件
XLOG日志文件的拷贝:拷贝一个已经存在的XLOG文件来创建一个新的XLOG段文件,用于恢复阶段
XLOG日志备份块的恢复:如果在一个XLOG记录中存在任何备份的块,那么将其恢复
XLOG日志记录的读取:尝试读一条XLOG记录
7、XLOG日志的恢复策略:先找到XLOG日志中最近建立并有效的检查点之后,读出检查点结构中Redo指针所指向的日志记录,根据日志记录类型调用不同的资源管理器,开始Redo操作。顺着日志的记录顺序往后做,直到做完最后一个日志记录。Redo主要用于确保已提交的事务修改的数据刷新到磁盘上。系统崩溃后重新启动会调用StartupXLOG入口函数,进行日志恢复。