您当前的位置:首页 > 互联网教程

解析XLog:使用python通过外部解析XLog

发布时间:2025-05-12 22:59:46    发布人:远客网络

解析XLog:使用python通过外部解析XLog

一、解析XLog:使用python通过外部解析XLog

1、初衷就是想深入xlog内部,想具体看一看wal内部到底存储着什么内容,为什么可以通过wal日志恢复所有的数据信息,包括为什么他可以实现主从复制等一系列操作

2、我们可以使用pg_waldump查看wal信息

3、初始化XLOG的函数入口为BootStrapXLOG

4、这个函数只会在初始化的时候调用一次,用来创建控制文件和初始化XLOG segment。

5、我们先看看第一个XLOG文件名称生成:

6、所以最大的XLOG文件名称为:00000001FFFFFFFF000000FF,而不是理论上的00000001FFFFFFFFFFFFFFFF,因为uint64% 256最大是FF。

7、还是在xlog.c这个文件中说明创建这个文件之间会先创建一个临时文件,

8、pg_wal/xlogtemp.xxxxxxx("xlogtemp."加个当前进程PID),避免其他process来搞事情,然后循环写入每次写入XLOG_BLOCKSZ个字节

9、刚才创建的文件其实是一个空文件,随后通过durable_link_or_rename进行rename。

10、到这里,XLOG就创建完成了,不过这个文件还是空空如也

11、首先写入的是XLOG的头(XLogPageHeader)。

12、这个page_magic也可以用来验证是否是一个page的开头

13、每个XLogSegment的第一个page头会写入XLogLongPageHeaderData,结构体如下:

14、这个page的前40个字节就是XLogLongPageHeaderData。写入完之后整个的XLOG_SEGMENT的结构如下图所示:

15、但是有一个问题就是为什么是40B?这里先按下不表,后面解析的时候会遇到问题。

16、日志之间有链接关系,xl_prev指向上一条日志的起始位置,下一条日志的位置用xl_tot_len可以找到,日志之间形成“双向链表”。

17、uint32xl_tot_len;/* total len of entire record*/

18、TransactionId xl_xid;/* xact id*/

19、XLogRecPtrxl_prev;/* ptr to previous record in log*/

20、uint8xl_info;/* flag bits, see below*/

21、RmgrIdxl_rmid;/* resource manager for this record*/

22、/* 2 bytes of padding here, initialize to zero*/

23、pg_crc32cxl_crc;/* CRC for this record*/

24、/* XLogRecordBlockHeaders and XLogRecordDataHeader follow, no padding*/

25、【日志的数据信息】} XLogRecord;

26、xl_info低4位保存flag信息,高4位保存日志动作信息。

27、void(*rm_redo)(XLogReaderState*record);//重做函数

28、void(*rm_desc)(StringInfo buf, XLogReaderState*record);//负责解析对应资源事务日志

29、const char*(*rm_identify)(uint8 info);//解析xlog记录中的Info字段

30、void(*rm_startup)(void);//启动时的初始化工作

31、void(*rm_cleanup)(void);//结束时的清理工作

32、void(*rm_mask)(char*pagedata, BlockNumber blkno);//在对页面做一致性检查前,是否需要对页面的某些部分做掩码} RmgrData;

33、据xlog中的xl_rmid调用资源管理器中不同资源的rm_redo回放函数进行回放。

34、在 PostgreSQL内核中,rmgrlist.h文件定义了各种类型的 rmgr(record manager),每个 rmgr对应一个不同的数据库操作。这些 rmgr在事务日志(XLog)中起着重要作用,用于记录不同类型的数据库操作,以便在之后的恢复过程中重做(redo)或撤销(undo)这些操作。

35、heap_mask函数是 PostgreSQL内核中用于在执行一致性检查之前对堆页(heap page)进行掩码处理的函数。在执行恢复操作时,数据库会读取 XLog记录中的内容,并应用到对应的数据页上。为了保证恢复的正确性,必须对数据页进行一致性检查,而 heap_mask就是用于在执行这些检查之前,对数据页进行掩码处理,从而屏蔽掉不应该参与一致性检查的部分。

36、以下是 heap_mask函数的主要功能:

37、在实现WAL一致性检查功能时,只有涉及数据表的RMGR才需要使用Mask Function,而对于其他类型的RMGR,由于其重做操作本身已经保证了数据的正确性,因此不需要添加Mask Function。

38、通过区分需要Mask的RMGR和不需要Mask的RMGR,可以在WAL一致性检查过程中准确地找出可能导致数据不一致的地方,并对数据库的一致性进行严格的验证。这样,复制过程中出现的潜在问题可以及早被检测出来,并及时处理,保障数据库系统的可靠性和稳定性。

39、为什么XLogLongPageHeaderData一搜都是40B?仔细阅读源码,发现问题

40、在XLogPageHeaderData底下出现了这个定义

41、这一块定义了XLogPageHeaderData的长度

42、分析一下 MAXALIGN---其实读英文名就可以知道他的意思是对齐最大

43、这个上面的内容就是 PG内部做了一个对齐宏,类似于只要是PG内部的东西基本上就按照这个对齐宏走

44、其中 MAXIMUM_ALIGNOF这个是获得当前编译器中占最大位的基本类型,比如long long类型

45、取得的long long类型的大小为8BYTE,所以在这个宏定义当中,MAXIMUM_ALIGNOF=8

46、MAXALIGN的作用其实就是为了使sizeof( struct)向上对齐,成为8的倍数的大小

47、思考为什么会有rem等问题,如果这个操作的tuple内容很多怎么办,或者当前record没有填满怎么办

48、他会根据逻辑地址算出物理插入地址,也就是说,物理地址并不会像逻辑地址那样整齐排列。

49、拿到对应的info后,应该怎么判断它属于什么操作,增删改查?

二、蓝桥杯python要怎么准备

1、准备蓝桥杯Python编程竞赛时,你可以按照以下步骤进行准备:

2、首先,学习Python基础知识。掌握Python的语法、数据类型、函数、模块等基本知识,这是编程的基础。理解变量、条件语句、循环语句、函数定义等,这些都是编程中常用的基本元素。

3、其次,理解算法和数据结构。了解常见的算法和数据结构,包括数组、链表、栈、队列、树、排序算法等。掌握它们的概念和基本操作,例如数组的初始化、链表的插入和删除、栈的压栈和弹栈、队列的入队和出队等。

4、接着,刷题练习。通过刷题来提高你的编程能力和解题思路。可以从基础题目开始,逐步挑战难度更高的编程题目。可以使用在线的编程题库、LeetCode、牛客网等平台进行刷题。刷题过程中,要注重理解题目的要求和思考解题思路,不断优化自己的代码。

5、此外,解读往届蓝桥杯Python真题。了解往届蓝桥杯Python竞赛题目的出题风格和难度。通过分析往届真题,了解常见的题型和解题思路,为比赛做好准备。可以通过仔细阅读题意、分析题目的输入输出、找到规律和模式,提高解题能力。

6、最后,参加模拟考试。参加模拟考试可以提前感受比赛的氛围和压力,检验自己的编程水平,并找出不足之处,及时进行弥补和提高。模拟考试可以帮助你熟悉比赛流程,提高应试能力。

7、总之,准备蓝桥杯Python编程竞赛需要掌握Python基础知识、理解算法和数据结构、刷题练习、解读往届真题和参加模拟考试,这些步骤缺一不可。

8、希望以上内容对你有所帮助,祝你取得好成绩!

三、python-033-实现栈-使用链表实现-提高时间复杂度

1、栈在我们之前的文章中就说明过了,想了解的去看一下030即可。

2、之前我们实现的栈,算法时间复杂度在摊销的情况下,是O(1),其底层是python的列表,是一种动态数组,在内存中是一个固定长度的数组,是无法改变大小的,只有重新换一个更大的数组来装新的数据。虽然实现起来非常简单,但是并不够完美。

3、在我们最开始的几篇文章中,很详细的介绍了链表的各种使用方式。之前实现链表时,只声明了节点对象,但是我们在程序的使用中应该把链表作为一个整体,作为一个对象来使用,这样封装性更好。

4、今天就不写这个链表了,我们利用在栈类中定义一个嵌套类来做为链表的节点对象,因为创建节点的操作非常多,所以我们用 slots来声明节点的两个成员变量,来减少内存的使用,提高效率。

5、链表是一种可以随时改变的数据结构。我们可以随时改变他的结构。

6、这次实现的栈的每一个方法操作,其时间复杂度都为O(1),不需要摊销。这与用数组实现的栈形成了对比。

7、链表实现的更快,明天用链表实现队列。