# 大云海山数据库(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)




