当前位置: 首页 > news >正文

PostgreSQL-日志管理介绍

  • 概述

1、日志管理器:

  1. 日志模块包括事务提交日志CLOG和数据日志XLOG。其中CLOG是系统为整个事务管理流程所建立的日志,主要用于记录事务的状态,同时通过SUBTRANS日志记录事务的嵌套关系。XLOG日志是数据库日志的主体,记录数据库中所有数据操作的变化过程。因此,XLOG日志管理器模块提供了日志操作的API供其他模块调用。
  2. 日志伴随着系统启动开始,始终在反复完成插入、刷新这样的过程,一旦系统崩溃还要完成数据恢复的功能。

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入口函数,进行日志恢复。

相关文章:

  • 【网络入侵检测】基于Suricata源码分析NFQ IPS模式实现
  • 分布式微服务架构,数据库连接池设计策略
  • 机器学习在网络安全中的应用:守护数字世界的防线
  • 前端 Excel 工具组件实战:导入 → 可编辑表格 → 导出 + 样式同步 + 单元格合并
  • 机器人灵巧手有刷与无刷空心杯电机解析
  • Kafka 命令行操作与 Spark-Streaming 核心编程总结
  • 让Docker端口映射受Firewall管理而非iptables
  • Python爬虫爬取图片并存储到MongoDB(注意:仅尝试存储一条空的示例数据到MongoDB,验证MongoDB的联通性)
  • Vue3 setup、计算属性、侦听器、响应式API
  • 【go语言】window环境从源码编译go
  • 游戏引擎学习第241天:将OpenGL VSync 和 sRGB 扩展
  • 【c++】【STL库】vector类详解
  • Unity 使用 ADB 实时查看手机运行性能
  • [linux]设置邮件发送告警功能
  • 【C++】入门基础【下】
  • 编译 C++ 报错“找不到 g++ 编译器”的终极解决方案(含 Windows/Linux/macOS)
  • 2025最新系统 Linux 教程(六)
  • HTML5 服务器发送事件 (Server-Sent Events):实现网页自动获取服务器更新
  • 第53.5讲 | 小项目实战:用 SHAP 值解释农作物产量预测模型 [特殊字符][特殊字符]
  • Next.js v15 eslint 规则配置
  • G40迎来返程大车流,今明两日预计超13万辆车经长江隧桥进沪
  • 新加坡国会选举投票抽样结果公布,执政党已获超半数议席
  • 首日5金!中国队夺得跳水世界杯总决赛混合团体冠军
  • 五一假期首日,上海外滩客流超55万人次
  • 国铁集团:5月1日全国铁路预计发送旅客2250万人次
  • 中国空间站多项太空实验已取得成果,未来将陆续开展千余项研究