解析XLog:使用python通过外部解析XLog
发布时间:2025-05-12 22:59:46 发布人:远客网络
一、解析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、链表实现的更快,明天用链表实现队列。