暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

大云海山数据库(He3DB)源码详解:He3DB-CLOG日志管理器函数之WriteZeroPageXlogRec、CheckPointCLOG

于巍 2024-11-26
21

# 大云海山数据库(He3DB)源码详解:He3DB-CLOG日志管理器函数之WriteZeroPageXlogRec、CheckPointCLOG

背景

大云He3DB 采用了先进的存储引擎和查询优化技术,能够快速处理大量数据和复杂查询。无论是 OLTP(在线事务处理)还是 OLAP(在线分析处理)场景,都能提供出色的性能表现。He3DB 具备完善的数据备份和恢复机制,能够在系统故障或数据损坏时快速恢复数据,确保业务的连续性。He3DB 支持水平扩展和垂直扩展,可以轻松应对不断增长的数据需求。He3DB 提供了严格的访问控制和数据加密功能,确保数据的安全性和隐私性。

本文基于大云He3DB,针对CLOG日志管理模块进行源码解读分享,包含WriteZeroPageXlogRec、CheckPointCLOG函数

CheckPointCLOG函数

检查点机制

背景:
当数据库系统运行时,它会不断地修改内存中的数据,并将这些更改异步地写入到磁盘上。然而,这种异步写入方式可能导致在系统崩溃时,最近的一些更改尚未被刷新到磁盘上,从而造成数据丢失。

检查点机制:
通过定期地将内存中的脏页(即已修改但尚未写入磁盘的页)写入磁盘,并更新数据库的控制文件(包含关于最新检查点信息的元数据),来减少数据丢失的风险。这样,在系统崩溃后,恢复过程可以从最近的检查点开始,而不需要重放所有的事务日志,从而加快了恢复速度。

函数体

void CheckPointCLOG(void) { /* * Write dirty CLOG pages to disk. This may result in sync requests * queued for later handling by ProcessSyncRequests(), as part of the * checkpoint. */ TRACE_POSTGRESQL_CLOG_CHECKPOINT_START(true); SimpleLruWriteAll(XactCtl, true); TRACE_POSTGRESQL_CLOG_CHECKPOINT_DONE(true); }
TRACE_POSTGRESQL_CLOG_CHECKPOINT_START(true);
  • 追踪检查点开始
SimpleLruWriteAll(XactCtl, true);
  • 将CLOG日志缓冲池中的脏页面写回到磁盘中
TRACE_POSTGRESQL_CLOG_CHECKPOINT_DONE(true);
  • 追踪检查点结束

函数流程图

在这里插入图片描述

WriteZeroPageXlogRec源码解读

static void WriteZeroPageXlogRec(int pageno) { XLogBeginInsert(); XLogRegisterData((char *) (&pageno), sizeof(int)); (void) XLogInsert(RM_CLOG_ID, CLOG_ZEROPAGE); }
  • 开始WAL记录,调用XLogBeginInsert函数
void XLogBeginInsert(void) { Assert(max_registered_block_id == 0); Assert(mainrdata_last == (XLogRecData *) &mainrdata_head); Assert(mainrdata_len == 0); if (!XLogInsertAllowed()) elog(ERROR, "cannot make new WAL entries during recovery"); if (begininsert_called) elog(ERROR, "XLogBeginInsert was already called"); begininsert_called = true; }
    • 是构建WAL记录的一个初始化步骤,它确保在尝试添加任何数据到WAL记录之前,环境是干净的,并且当前的数据库状态允许进行WAL插入

ps.具体解读见XLOG日志管理器-XLogBeginInsert文档

  • 注册要记录的数据,调用XLogRegisterData函数,将页面号为pageno的数据进行注册
void XLogRegisterData(char *data, int len) { XLogRecData *rdata; Assert(begininsert_called); if (num_rdatas >= max_rdatas) elog(ERROR, "too much WAL data"); rdata = &rdatas[num_rdatas++]; rdata->data = data; rdata->len = len; mainrdata_last->next = rdata; mainrdata_last = rdata; mainrdata_len += len; }
  • 插入WAL记录,调用XLogInsert函数

接受资源管理器id为RM_CLOG_ID,并插入信息为CLOG_ZEROPAGE的WAL日志记录
ps.具体XLogInsert函数详情,见对应解析文档

总结

函数 作用
WriteZeroPageXlogRec 创建一个新CLOG日志页面时,调用该函数创建一条ZEROPAGE的XLOG日志记录,以记录所创建CLOG日志页面的页面号,方便系统崩溃或恢复过程中重建CLOG日志

其余文章参考链接

大云海山数据库(He3DB)源码详解:He3DB-CLOG日志管理器函数之TransactionIdSetTreeStatus

大云海山数据库(He3DB)+AI(五):一种基于强化学习的数据库旋钮调优方法

大云海山数据库(He3DB)+AI(四):一种基于迁移学习的启发式数据库旋钮调优方法

大云海山数据库(He3DB)源码解读:海山PG 词法、语法分析

大云海山数据库(He3DB)源码详解:海山PG 空闲空间映射表FSM
词法、语法分析](https://www.modb.pro/db/1838032718672703488)

大云海山数据库(He3DB)源码详解:海山PG 空闲空间映射表FSM

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论