postgres预写式日志的内核实现详解-wal记录读取
2019独角兽企业重金招聘Python工程师标准>>>
导读:
postgres预写式日志的内核实现详解-概述
之前已经写了关于wal记录的结构、wal记录的写入的博客,流复制、PITR、数据库启动、逻辑复制等PG功能都需要借助wal日志,他们是怎样读取wal日志记录的呢?这一篇博客将会讲解。
pg内核代码中读取wal有固定的程式。如下结构:
XLogReaderAllocate()
XLogFindNextRecord()
for (;;)
{
XLogReadRecord();
…
}
XLogReaderAllocate(XLogPageReadCB pagereadfunc, void *private_data)
函数用来做读取的预处理,数据初始化、空间分配、page读取函数注册等。
第一个参数pagereadfunc是一个函数指针,指向的函数功能为,读取page的数据、wal日志文件切换。
所有读取wal日志的程序都会都会为自己定制一个pagereadfunc函数,如代码中:
XLogDumpReadPage→pg_waldump工具的读取函数。
XLogPageRead→recovery过程读取wal的函数
read_page→逻辑复制使用的函数
SimpleXLogPageRead→pg_rewind使用的函数
XLogFindNextRecord(XLogReaderState *state, XLogRecPtr RecPtr)
获取RecPtr位置之后的第一个记录的位置,作为XLogReadRecord函数的入参
XLogRecord *XLogReadRecord(XLogReaderState *state, XLogRecPtr RecPtr, char **errormsg)
①从page中按照《postgres预写式日志的内核实现详解-wal结构》的结构读取记录
②通过DecodeXLogRecord()函数将读取到的record记录进行初步解析,获取到的实际数据存储到XLogReaderState结构体中。
#define XLogRecGetTotalLen(decoder) ((decoder)->decoded_record->xl_tot_len)
#define XLogRecGetPrev(decoder) ((decoder)->decoded_record->xl_prev)
#define XLogRecGetInfo(decoder) ((decoder)->decoded_record->xl_info)
#define XLogRecGetRmid(decoder) ((decoder)->decoded_record->xl_rmid)
#define XLogRecGetXid(decoder) ((decoder)->decoded_record->xl_xid)
#define XLogRecGetOrigin(decoder) ((decoder)->record_origin)
#define XLogRecGetData(decoder) ((decoder)->main_data)
#define XLogRecGetDataLen(decoder) ((decoder)->main_data_len)
#define XLogRecHasAnyBlockRefs(decoder) ((decoder)->max_block_id >= 0)
#define XLogRecHasBlockRef(decoder, block_id) \((decoder)->blocks[block_id].in_use)
#define XLogRecHasBlockImage(decoder, block_id) \((decoder)->blocks[block_id].has_image)
#define XLogRecBlockImageApply(decoder, block_id) \((decoder)->blocks[block_id].apply_image)
使用上述宏就可以获取wal记录里的数据。
回到概述页
转载于:https://my.oschina.net/lcc1990/blog/2963821
postgres预写式日志的内核实现详解-wal记录读取相关推荐
- PostgreSQL 10.1 手册_部分 III. 服务器管理_第 30 章 可靠性和预写式日志_30.4. WAL配置...
30.4. WAL配置 有几个WAL相关的配置参数会影响数据库性能.本节将解释它们的使用.关于服务器配置参数的设置的一般信息请参考第 19 章. 检查点是在事务序列中的点,这种点保证被更新的堆和索引数 ...
- PostgreSQL 10.1 手册_部分 III. 服务器管理_第 30 章 可靠性和预写式日志_30.5. WAL内部...
30.5. WAL内部 WAL是自动被启用的.除了做一些设置满足存放WAL日志的磁盘空间需求以及一些必要的调节以外(参阅第 30.4 节),对管理员没有什么其他要求. 当每个新记录被写入时,WAL记录 ...
- PostgreSQL数据库系列之五:预写式日志WAL
[WAL介绍] Write-Ahead Logging是一种保证数据完整性的标准方法.简单地说,WAL的概念就是对数据文件的改变(包括表和索引)必须先写入日志,即日志记录刷新到永久储存之后,才能被写. ...
- 预写式日志(Write-Ahead Logging (WAL))
SQL Server中使用了WAL(Write-Ahead Logging)技术来保证事务日志的ACID特性.而且大大减少了IO操作. WAL的核心思想是:在数据写入到数据库之前,先写入到日志.再将日 ...
- 预写式日志 - postgresql之WAL(Write Ahead Log)
oracle中存在重做日志文件(redo log),其作用是保证数据的一致性和事务的完整性,防止在系统崩溃时最近的事务无法恢复.在postgresql中引入了WAL(write ahead log), ...
- Java自动日志监控框架auto-log详解
Java自动日志监控框架auto-log详解 1. 需求概述 2. auto-log简介 2.1 auto-log定义 2.2 auto-log目的 2.3 auto-log特性 2.4 注解说明 2 ...
- Linux系统与网络、磁盘参数和日志监控等命令详解二
创作人QQ:851301776,邮箱:lfr890207@163.com, 欢迎大家一起技术交流,本博客主要是自己学习的心得体会,只为每天进步一点点! 个人座右铭: 1.没有横空出世,只要厚积一定发. ...
- Linux日志系统_syslog服务详解
Linux日志系统_syslog服务详解 参考链接:https://blog.csdn.net/weixin_42569329/article/details/116609984 一台服务器的日志对系 ...
- 日志切割工具cronolog详解
日志切割工具cronolog详解 大家都知道apache服务器,默认日志文件是不分割的,一个整文件既不易于管理,也不易于分析统计.本文主要讲解Web服务器日志切割工具cronolog,下面我们就来详细 ...
最新文章
- Ubuntu 10.10(64位)编译Android 2.3
- python爬虫反爬机制_Python Scrapy突破反爬虫机制(项目实践)
- BLIP:用更干净更多样的数据进行多模态预训练,性能超越CLIP!代码已开源!...
- 开发者必看!你想知道的迁移之道都在这里了
- 最爱的城市(dfs)
- Struts1与Struts2的区别和对比(深度好文)
- Python MD5值破解
- Riverbed助世界最大集装箱航运公司马士基实现数字化转型
- 二本机械毕业2年,从外包ETL到大厂数据开发,月薪13K到年薪40W
- 计算机二级 考试科目,2018全国计算机等级考试调整,一、二级都增加了考试科目...
- 中学-知识与能力【8】
- 光学透明胶片行业现状调研及趋势分析报告
- Vegas怎么制作古装墨迹笔刷开场效果
- 切入点和切入点表达式(AOP面向切面编程)
- schema testdb didn‘t config tables,so you must set dataNode property!
- 【MRI】解决DPABI计算功能连接时路径冲突
- 国产ETL etl-engine 星光不问赶路人 时我不待
- 桌面应用程序UI框架有哪些
- iStat Menus for mac中文
- Verilog HDL**两位数码管计数器,关于reg位数的问题