以heap_insert为例,简述WAL的插入过程。

在构建WAL日志记录的过程中主要涉及2个数据变量:static XLogRecData *rdatas数组和static registered_buffer *registered_buffers数组。这两个数组分别用来保存WAL数据和管理rdatas链表。

主要涉及3个重要的函数:XLogRegisterData、XLogRegisterBuffer和XLogRegisterBufData。这三个函数的作用分别是将WAL记录的特殊结构体数据注册到WAL,比如heap_insert中的xl_heap_insert结构体;将涉及到的buf注册到wal记录,比如heap_insert中page页赋予regbuf->page;将元组内容注册到WAL记录,比如insert语句的元组数据等。

下面首先介绍相关数据结构。

1、数据结构

HeapTupleData

typedef struct HeapTupleData
{uint32 t_len; /* length of *t_data */ItemPointerData t_self; /* SelfItemPointer */Oid t_tableOid; /* table the tuple came from */HeapTupleHeader t_data; /* -> tuple header and data */
} HeapTupleData;

xl_heap_header

/** We don't store the whole fixed part (HeapTupleHeaderData) of an inserted* or updated tuple in WAL; we can save a few bytes by reconstructing the* fields that are available elsewhere in the WAL record, or perhaps just* plain needn't be reconstructed.  These are the fields we must store.* NOTE: t_hoff could be recomputed, but we may as well store it because* it will come for free due to alignment considerations.*/
typedef struct xl_heap_header
{uint16 t_infomask2;uint16 t_infomask;uint8 t_hoff;
} xl_heap_header;

xl_heap_insert

/* This is what we need to know about insert */
typedef struct xl_heap_insert
{OffsetNumber offnum; /* inserted tuple's offset */uint8 flags;/* xl_heap_header & TUPLE DATA in backup block 0 */
} xl_heap_insert;

XLogRecData

/** The functions in xloginsert.c construct a chain of XLogRecData structs* to represent the final WAL record.*/
typedef struct XLogRecData
{struct XLogRecData *next; /* next struct in chain, or NULL */char    *data; /* start of rmgr data to include */uint32 len; /* length of rmgr data to include */
} XLogRecData;

registered_buffer

/** For each block reference registered with XLogRegisterBuffer, we fill in* a registered_buffer struct.*/
typedef struct
{
bool in_use; /* is this slot in use? */
uint8 flags; /* REGBUF_* flags */
RelFileNode rnode; /* identifies the relation and block */
ForkNumber forkno;
BlockNumber block;
Page page; /* page content */
uint32 rdata_len; /* total length of data in rdata chain */
XLogRecData *rdata_head; /* head of the chain of data registered with this block */
XLogRecData *rdata_tail; /* last entry in the chain, or &rdata_head if empty */
XLogRecData bkp_rdatas[2]; /* temporary rdatas used to hold references to* backup block data in XLogRecordAssemble() */
/* buffer to store a compressed version of backup block image */
char compressed_page[PGLZ_MAX_BLCKSZ];
} registered_buffer;

2、heap_insert涉及WAL的流程

第一步中,得到如下结果,mainrdata_last保存rdata[0],存储的是xl_heap_insert结构:

第二步,得到如下结果,取registered_buffer[0],其rdata_head->next指向rdata[1],存储tuple记录的头信息:

接着进入第三步,取rdata[2],将其放到rdata[1]->next中,即加入registered_buffers[0]的rdata_head链表中,存储TUPLE值:

以上是构建WAL记录的准备阶段,下一节介绍WAL的构建及其通用结构。

PostgreSQL WAL解析:构建WAL记录准备相关推荐

  1. HBase WAL 解析

    WAL(Write-Ahead-Log)是HBase的RegionServer在处理数据插入和删除的过程中用来记录操作内容的一种日志.大致过程如下图所示,首先客户端启动一个操作来修改数据,每一个修改都 ...

  2. postgresql lsn/location 获取 wal/xlog 文件名

    postgresql 10.x 叫做 wal.lsn postgresql 9.x 叫做 xlog.location 在实际应用中经常需要根据 lsn/location 获取 wal/xlog 文件名 ...

  3. Python 解析构建数据大杂烩 -- csv、xml、json、excel

    Python 可以通过各种库去解析我们常见的数据.其中 csv 文件以纯文本形式存储表格数据,以某字符作为分隔值,通常为逗号:xml 可拓展标记语言,很像超文本标记语言 Html ,但主要对文档和数据 ...

  4. python如何调用阿里云接口_python 调用阿里云云解析api添加记录

    首先安装阿里云SDK pip install aliyun-python-sdk-core pip install aliyun-python-sdk-alidns 可以配合jenkins传递参数 # ...

  5. 瑞萨单片机iap串口升级boot程序与app程序合并的工程构建-学习记录

    MCU型号: R7F0C004 编辑软件:CS+ for CC boot区程序地址分配:0x0000-0x1ffff app区程序地址分配: 0x2000-0xfffff 复制一份常规的app程序,然 ...

  6. 数仓知识12:PostgreSQL预写日志(WAL)和逻辑解码方案

    目录 PostgreSQL预写日志(WAL) PostgreSQL逻辑解码(Logical Decoding) 逻辑解码方案研究分析 PostgreSQL预写日志(WAL) 从PostgreSQL 9 ...

  7. 问题定位 | PostgreSQL 报错 requested WAL segment has already been removed

    本文首发于 2016-04-25 20:59:52 问题描述 在使用配置了热备的 PostgreSQL 数据库时,在执行大量事务时,尤其是一个需要插入几千万条数据的 insert 事务时(典型的做法是 ...

  8. PostgreSQL利用全备与WAL日志恢复数据库

    文章目录 基础备份--全备 使用pg_basebackup 参数 WAL日志的的备份 测试流程 将被数据文件全备 继续操作主库 配置recovery.conf文件 启动恢复实例 查看恢复情况 一般情况 ...

  9. webpack那些事:浅入深出-源码解析构建优化

    基础知识回顾 入口(entry) module.exports = {entry: './path/to/my/entry/file.js' }; //或者 module.exports = {ent ...

最新文章

  1. B - Dungeon Master POJ - 2251
  2. 优点和阵列的缺点,并且一个链表
  3. 机器学习实战-之SVM核函数与案例
  4. 【数据结构与算法】动画:什么是 BF 算法 ?
  5. Java 比特币开发系列教程汇总
  6. 20170822 前端开发日报
  7. 前端 JS/TS 调用 ASP.NET Core gRPC-Web
  8. 微信公众号怎么快速导出一个月的文章数据
  9. postman 使用_Postman使用方法
  10. 95-134-112-源码-维表-全量加载MySQL
  11. Kubernetes 小白学习笔记(31)--kubernetes云原生应用开发-istio架构和安装
  12. Facebook股价周四大涨15.5% 市值超亚马逊
  13. 移动接入身份认证技术
  14. GStreamer学习笔记
  15. pygame演示----黑猩猩小游戏
  16. Linux下最常用的10个文件压缩工具
  17. C++ 计算一个数的根号值
  18. mysql省市县数据库
  19. Python实现“鸟脸识别”系统,看看什么鸟最贪吃~ 初学者也能学会
  20. Flame 2020 for Mac破解版(影视特效合成软件)

热门文章

  1. php用正则表达式来判断,php正则表达式使用的详细介绍
  2. 快速get短视频配音制作技巧|帮你的视频插上翅膀,一飞冲天
  3. 深入理解StrongReference,SoftReference, WeakReference和PhantomReference
  4. deian10 安装aptitude
  5. calico工作原理_Calico原理
  6. 新款 iPad 真香,包邮送一个!
  7. capsule 安装_Capsule:开源的 JVM 应用部署工具
  8. 阿里巴巴鹰眼系统了解
  9. 第八周毛概课学习心得
  10. android timepicker 不可编辑,iView -- TimePicker 自定义修改时间选择器选择时间面板样式...