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记录读取相关推荐

  1. PostgreSQL 10.1 手册_部分 III. 服务器管理_第 30 章 可靠性和预写式日志_30.4. WAL配置...

    30.4. WAL配置 有几个WAL相关的配置参数会影响数据库性能.本节将解释它们的使用.关于服务器配置参数的设置的一般信息请参考第 19 章. 检查点是在事务序列中的点,这种点保证被更新的堆和索引数 ...

  2. PostgreSQL 10.1 手册_部分 III. 服务器管理_第 30 章 可靠性和预写式日志_30.5. WAL内部...

    30.5. WAL内部 WAL是自动被启用的.除了做一些设置满足存放WAL日志的磁盘空间需求以及一些必要的调节以外(参阅第 30.4 节),对管理员没有什么其他要求. 当每个新记录被写入时,WAL记录 ...

  3. PostgreSQL数据库系列之五:预写式日志WAL

    [WAL介绍] Write-Ahead Logging是一种保证数据完整性的标准方法.简单地说,WAL的概念就是对数据文件的改变(包括表和索引)必须先写入日志,即日志记录刷新到永久储存之后,才能被写. ...

  4. 预写式日志(Write-Ahead Logging (WAL))

    SQL Server中使用了WAL(Write-Ahead Logging)技术来保证事务日志的ACID特性.而且大大减少了IO操作. WAL的核心思想是:在数据写入到数据库之前,先写入到日志.再将日 ...

  5. 预写式日志 - postgresql之WAL(Write Ahead Log)

    oracle中存在重做日志文件(redo log),其作用是保证数据的一致性和事务的完整性,防止在系统崩溃时最近的事务无法恢复.在postgresql中引入了WAL(write ahead log), ...

  6. 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 ...

  7. Linux系统与网络、磁盘参数和日志监控等命令详解二

    创作人QQ:851301776,邮箱:lfr890207@163.com, 欢迎大家一起技术交流,本博客主要是自己学习的心得体会,只为每天进步一点点! 个人座右铭: 1.没有横空出世,只要厚积一定发. ...

  8. Linux日志系统_syslog服务详解

    Linux日志系统_syslog服务详解 参考链接:https://blog.csdn.net/weixin_42569329/article/details/116609984 一台服务器的日志对系 ...

  9. 日志切割工具cronolog详解

    日志切割工具cronolog详解 大家都知道apache服务器,默认日志文件是不分割的,一个整文件既不易于管理,也不易于分析统计.本文主要讲解Web服务器日志切割工具cronolog,下面我们就来详细 ...

最新文章

  1. Ubuntu 10.10(64位)编译Android 2.3
  2. python爬虫反爬机制_Python Scrapy突破反爬虫机制(项目实践)
  3. BLIP:用更干净更多样的数据进行多模态预训练,性能超越CLIP!代码已开源!...
  4. 开发者必看!你想知道的迁移之道都在这里了
  5. 最爱的城市(dfs)
  6. Struts1与Struts2的区别和对比(深度好文)
  7. Python MD5值破解
  8. Riverbed助世界最大集装箱航运公司马士基实现数字化转型
  9. 二本机械毕业2年,从外包ETL到大厂数据开发,月薪13K到年薪40W
  10. 计算机二级 考试科目,2018全国计算机等级考试调整,一、二级都增加了考试科目...
  11. 中学-知识与能力【8】
  12. 光学透明胶片行业现状调研及趋势分析报告
  13. Vegas怎么制作古装墨迹笔刷开场效果
  14. 切入点和切入点表达式(AOP面向切面编程)
  15. schema testdb didn‘t config tables,so you must set dataNode property!
  16. 【MRI】解决DPABI计算功能连接时路径冲突
  17. 国产ETL etl-engine 星光不问赶路人 时我不待
  18. 桌面应用程序UI框架有哪些
  19. iStat Menus for mac中文
  20. Verilog HDL**两位数码管计数器,关于reg位数的问题

热门文章

  1. 阿拉伯数字转换英文数字表示算法解析及其实现
  2. 自考--网络经济与企业管理--选择易考题
  3. jQuery中bind,live,delegate与one方法的用法及区别
  4. JS-数组和函数冒泡排序递归函数
  5. PyTorch入门(三)--实现简单图像分类器
  6. TS Decorator
  7. c语言实现路由功能,前端路由的两种实现方式,内附详细代码
  8. Spring应用上下文 - - context
  9. C语言-数据结构-单链表的初始化,插入和输出
  10. etcd部署简单说明