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

66 阅读3分钟

大云海山数据库(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);
  • 追踪检查点结束

函数流程图

image.png

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