当前位置:网站首页>postgresql源码学习(33)—— 事务日志⑨ - 从insert记录看日志写入整体流程
postgresql源码学习(33)—— 事务日志⑨ - 从insert记录看日志写入整体流程
2022-07-31 05:31:00 【Hehuyi_In】
一、 整体流程
前面我们分开看了每一个步骤的具体函数,这里再通过一个简单insert语句的跟踪,来看看整体的流程。目前只看WAL相关的部分,因为insert整体涉及到非常多东西,有些是还没学习到的。


最简单的insert语句对应函数是 heap_insert,其中跟WAL相关的代码:
XLogBeginInsert();
XLogRegisterData((char *) &xlrec, SizeOfHeapInsert);
xlhdr.t_infomask2 = heaptup->t_data->t_infomask2;
xlhdr.t_infomask = heaptup->t_data->t_infomask;
xlhdr.t_hoff = heaptup->t_data->t_hoff;
/*
* note we mark xlhdr as belonging to buffer; if XLogInsert decides to
* write the whole page to the xlog, we don't need to store
* xl_heap_header in the xlog.
*/
XLogRegisterBuffer(0, buffer, REGBUF_STANDARD | bufflags);
XLogRegisterBufData(0, (char *) &xlhdr, SizeOfHeapHeader);
/* PG73FORMAT: write bitmap [+ padding] [+ oid] + data */
XLogRegisterBufData(0,
(char *) heaptup->t_data + SizeofHeapTupleHeader,
heaptup->t_len - SizeofHeapTupleHeader);
/* filtering by origin on a row level is much more efficient */
XLogSetRecordFlags(XLOG_INCLUDE_ORIGIN);
recptr = XLogInsert(RM_HEAP_ID, info);
PageSetLSN(page, recptr);二、 代码调试
1. 调试方法
会话1
postgres=# create table t_insert(a int);
CREATE TABLE
postgres=# select pg_backend_pid();
pg_backend_pid
----------------
8632会话2
vscode跟踪8632进程
会话1
postgres=# insert into t_insert values(1);
加一个断点到WAL相关部分,点击继续

2. 调试过程
- 首先是XLogBeginInsert,做代码安全检查工作,另外是设置begininsert_called标志,防止递归调用日志生成函数。

- XLogRegisterData,将WAL日志数据注册到rdatas数组。
参数的xlrec为xl_heap_insert结构体(日志记录中的main data部分),因此这一步是在构建并注册main data数据到WAL记录中。


- 构建xl_heap_header(block data)

- XLogRegisterBuffer:注册数据页,将被修改的buffer页面信息注册到registerd_buffers数组。由于XLOG是page-oriented log,所以在注册元组之前需要注册数据页。

- XLogRegisterBufData:注册xl_heap_header(block data),这里的xlhdr参数就是前面构建的xl_heap_header


- 注册实际元组数据
heaptup->t_data + SizeofHeapTupleHeader为实际元组

- 组装WAL记录并写入wal buffer

XLogInsert函数中调用日志组装函数XLogRecordAssemble 以及 XLogInsertRecord完成上述工作,最后返回的是写入的EndPos。

- 设置PageLSN
设置页面头PageLSN为recptr(即EndPos)。每个页面都会有PageLSN,页面中所有LSN<=Page LSN的WAL表示对应的操作都已经落盘。因此在崩溃恢复时,这些操作都不需要执行redo。

参考
https://blog.csdn.net/obvious__/article/details/119242908?spm=1001.2014.3001.5502
postgresql源码学习(23)—— 事务日志④-日志组装_Hehuyi_In的博客-CSDN博客_postgresql事务日志
https://blog.csdn.net/Hehuyi_In/article/details/125447500 postgresql源码学习(22)—— 事务日志③-日志的注册_Hehuyi_In的博客-CSDN博客
边栏推荐
- Some derivation formulas for machine learning backpropagation
- Exam Questions Previous True Questions Wrong Bills [The Fourth Session] [Provincial Competition] [Group B]
- Moment.js常用方法
- MySQL笔记下
- Oracle入门 10 - Linux 设备类型与文件目录结构
- 记录一下,今天开始刷剑指offer
- 哪吒监控安装脚本
- MySQL的触发器
- Oracle入门 03 - Linux / Unix 系统基础知识
- 批量翻译软件免费【2022最新版】
猜你喜欢
随机推荐
【编程题】【Scratch三级】2022.03 冬天下雪了
es6数组/数组对象求并集、交集、差集、去重、排序
MySQL笔记下
MySQL官网8.0.17 安装教程(适合离线安装)
批量翻译软件免费【2022最新版】
Oracle 日期函数相关
Install and use uView
shell脚本 -d 是目录文件,那么-e,-f等说明
机器学习反向传播的一些推导公式
Oracle入门 13 - Linux文件目录类命令
全网首发!ADK To Win11PE(1)中文+包
In-depth analysis of z-index
Oracle入门 07 - Linux 操作系统安装配置(REHL 7.x)
DNS域名解析服务
LXC的安装与配置使用
Shell编程规范与变量
CHI论文阅读(1)EmoGlass: an End-to-End AI-Enabled Wearable Platform for Enhancing Self-Awareness of Emoti
Oracle入门 02 - IT软硬件平台及操作系统介绍
记录一下,今天开始刷剑指offer
mysql的下载及安装使用









