postgres预写式日志的内核实现详解-wal记录写入
导读:
如下就是将一个记录存储到wal日志文件的主要函数,本文主要是对这些函数进行逐一说明。
XLogBeginInsert();
XLogRegisterData();
XLogRegisterBuffer();
XLogRegisterBufData();
XLogSetRecordFlags();
XLogInsert();
XLogRecordAssemble();
XLogInsertRecord();
PageSetLSN
一、重要数据结构
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; 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;
二、重要全局变量
static XLogRecData *mainrdata_head; static XLogRecData *mainrdata_last = (XLogRecData *) &mainrdata_head; /*使用XLogRegisterBuffer注册的数据存储到registered_buffers数组里*/ static registered_buffer *registered_buffers; /*使用XLogRegisterBufData注册的数据存储到rdatas数组里,并链接为链表,使用registered_buffer结构里的rdata_head和rdata_tail作为链表的首尾。*/ /*使用XLogRegisterData注册的数据存储到rdatas数组里,并使用mainrdata_head和mainrdata_lastata注册的数据存储到rdatas数组里,并链接为链表,使用registered_buffer结构里的rdata_head和rdata_tail作为链表的首尾。*/ static XLogRecData *rdatas;
三、函数说明
1.XLogBeginInsert()
作用:判断当前是否可以执行xlog插入,标志wal插入开始。
2.XLogRegisterData()
作用:
①将本条wal记录的特殊结构体数据注册到wal记录,比如XLOG_HEAP_INSERT子类型的xl_heap_insert结构体。
②将一些旧元组数据注册到wal记录,比如执行update语句的旧元组数据、delete语句的旧元组数据。
实现过程:
找到rdatas数组中第一个空的的位置,将传入的参数赋值给这个空位置
3.XLogRegisterBuffer():
作用:
将涉及到的buff注册到wal记录,比如insert语句的目标buff、update语句的目标buff和源buff。
实现过程:
找到registered_buffer数组中第一个空的的位置,并将这个位置的数据填充
4.XLogRegisterBufData():
作用:
将元组内容注册到wal记录。比如insert语句的元组数据、update语句的新元组数据
实现过程:
在registered_buffer中找到此data的相关buff。
找到rdatas数组中第一个空的的位置,将传入的参数赋值给这个空位置。
将这个位置链接到rdata_tail处
5.XLogSetRecordFlags():
作用:
设置origin
6.XLogInsert():
作用:
根据当前的数据库状态(full_page_write、checkpoint、REPLICA IDENTITY等),把上述函数注册的数据进行筛选组装,最终形成完整的wal记录并
写入到walbuff。
函数功能主要由XLogRecordAssemble()和XLogInsertRecord()完成
7.XLogRecordAssemble()
作用:
代码执行到这个函数的时候,所有的数据已经完成注册,目前wal记录的数据存储在①mainrdata_head②每一个注册的buff的rdata_head③每一个注册的buff的page字段中
这个函数就是要①②③中的数据组合到一起的过程。
实现过程:
过程太复杂,画一组图来说明一下。
8.XLogInsertRecord
作用:
此函数就是将XLogRecordAssemble()函数返回的hdr_rdt依次写到wal的内存中。
9.PageSetLSN();
作用:
更新被修改的page LSN。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
基于 Git Namespace 的存储库快照方案
前言 Git 是一种分布式的版本控制系统,分布式版本控制系统的一大特性就是远程存储库和本地存储库都包含存储库的完整数据。 而集中式的版本控制系统只有在中心服务器上才会包含存储库完整的数据,本地所谓的存储库只是远程服务器特定版本的 checkout。当中心服务器故障后,如果没有备份服务器,那么集中式的版本控制系统存储库的数据绝大部分就会被丢失。这很容易得出分布式版本控制系统的代码要必集中式的版本控制系统更加安全。 但是,安全并不是绝对的,尤其当 Git 被越来越多的人使用后,用户也会需要 Git 吸收集中式版本控制系统的特性来改进用户体验,这种情形下,Git 分布式版本控制系统的安全性也就面临挑战。终端用户获取的不是完整的数据,为了保证存储库的安全仍然需要备份或者镜像远程服务器上的存储库。(用户可以使用浅表克隆,单分支克隆或者使用 git vfs(GVFS) 之类的技术加快 git 访问。) Git 给开发者非常大的自由,git 可以修改 commit 重新提交,也可以强制推送<sup>1</sup>引用到远程服务器,覆盖特定的引用,不合理的使用强制推送是非常危险...
- 下一篇
深入浅出Vue 使用中的小技巧
众所周知在vue的使用过程中会遇到各种场景,当普通使用时觉得没什么,但是或许优化一下可以更高效更优美的进行开发。下面有一些我在日常开发的时候用到的小技巧,在下将不定期更新~ 1. 多图表resize事件去中心化 1.1 一般情况 有时候我们会遇到这样的场景,一个组件中有几个图表,在浏览器resize的时候我们希望图表也进行resize,因此我们会在父容器组件中写: mounted() { setTimeout(() => window.onresize = () => { this.$refs.chart1.chartWrapperDom.resize() this.$refs.chart2.chartWrapperDom.resize() //欢迎加入全栈开发交流圈一起吹水聊天学习交流:864305860 }, 200) destroyed() { window.onresize = null } 这样子图表组件如果跟父容器组件不在一个页面,子组件的状态就被放到父组件进行管理,为了维护方便,我们自然希望子组件的事件和状态由自己来维护,这样在添加删除组件的时候就不需要去父组...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Red5直播服务器,属于Java语言的直播服务器
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS8安装Docker,最新的服务器搭配容器使用
- MySQL8.0.19开启GTID主从同步CentOS8
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS7设置SWAP分区,小内存服务器的救世主