postgres预写式日志的内核实现详解-wal记录读取

 2023-09-13 阅读 15 评论 0

摘要:2019独角兽企业重金招聘Python工程师标准>>> 导读: 内核查看以往日志,postgres预写式日志的内核实现详解-概述 之前已经写了关于wal记录的结构、wal记录的写入的博客,流复制、PITR、数据库启动、逻辑复制等PG功能都需要借助wal日志,他们是怎

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

  导读:

内核查看以往日志,    postgres预写式日志的内核实现详解-概述

    

之前已经写了关于wal记录的结构、wal记录的写入的博客,流复制、PITR、数据库启动、逻辑复制等PG功能都需要借助wal日志,他们是怎样读取wal日志记录的呢?这一篇博客将会讲解。

linux内核原理。pg内核代码中读取wal有固定的程式。如下结构:

 XLogReaderAllocate()    
    XLogFindNextRecord()    
    for (;;)    
    {    
        XLogReadRecord();
        …
    }

XLogReaderAllocate(XLogPageReadCB pagereadfunc, void *private_data)
    函数用来做读取的预处理,数据初始化、空间分配、page读取函数注册等。
    第一个参数pagereadfunc是一个函数指针,指向的函数功能为,读取page的数据、wal日志文件切换。

oracle执行sql输出日志?    所有读取wal日志的程序都会都会为自己定制一个pagereadfunc函数,如代码中:

    XLogDumpReadPage→pg_waldump工具的读取函数。

    XLogPageRead→recovery过程读取wal的函数

docker查看实时日志的命令、    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

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/50309.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息