1.2 CLOG中的group_lsn Postgresql中的XLOG和CLOG是分开保存的,所以存在先写后写的问题。 场景一:XLOG落盘,CLOG没落盘 没问题,XLOG中有commit log,在redo中会重建clog。 场景二:XLOG没落盘,CLOG落盘 有问题:事务在clog中查询到已提交,但XLOG丢失redo无法恢复该事物,所以该事物应该是未提交状态,与CLOG矛盾——发生数据不一致。 of transactions */ #define CLOG_XACTS_PER_LSN_GROUP 32 /* keep this a power of 2 */ #define CLOG_LSNS_PER_PAGE (CLOG_XACTS_PER_PAGE / CLOG_XACTS_PER_LSN_GROUP) 每个逻辑组保存32个事务状态,每个页面有CLOG_LSNS_PER_PAGE个组。
CLOG中一个页面常称为SLOT。
---- 我们知道 clog 目录是存放 OceanBase 数据库记录修改操作的物理日志目录。目录具体的物理存放位置为 /data/log1/clustername/clog。 OceanBase 4.1.0 版本 clog 目录下不再是 OBServer 的 clog 文件,而是新增了一层目录:log_pool 和 tenant_id 两类目录。 才会将 clog 文件分配到租户的日志目录下。 3clog 磁盘使用控制 租户可使用的 clog 磁盘容量是有限度的,当租户 unit 的 clog 日志容量使用比例(log_disk_in_use/log_disk_size*100%)达到指定阈值 4clog 的使用量统计 在知道了 clog 目录结构之后,我们就可以通过计算租户目录下 clog 文件的生成量来统计租户每小时、每天的日志生成量,可以用于预估 OceanBase 备份盘的使用量。
clog为讨论单词,需要注意。 clog简介 ---- 第一个问题,什么是clog?或者换个说法,PG到底有哪些日志,它们分别是干啥的? #define CLOG_BITS_PER_XACT 2 #define CLOG_XACTS_PER_BYTE 4 #define CLOG_XACTS_PER_PAGE (BLCKSZ * CLOG_XACTS_PER_BYTE) #define CLOG_XACT_BITMASK ((1 << CLOG_BITS_PER_XACT) - 1) #define TransactionIdToPage 当这个事务最终提交或者回滚的时候,其最终状态就会被记录入clog。 事务提交与回滚时候的clog操作 ---- 首先来说提交。
1、CLOG脏页在checkpoint时刷写 CreateCheckPoint->CheckPointGuts->CheckPointCLOG SimpleLruFlush(ClogCtl, true 类型日志 xact_redo_commit TransactionIdCommitTree//标记CLOG为提交状态 CLOG在元组可见性判断中使用。 那么此时根据CLOG中记录的状态进行判断是否可见。若未提交,则不可见。这部分脏数据由后台vacuum进行进行回收。 当事务提交时,在XLogFlush后崩溃,则事务日志和commit日志都持久化完成,虽然事务状态未更新,但是可认为已提交,那么在恢复时,解析到commit时,将CLOG中事务状态更新。 若在XLogFlush前崩溃,那么事务未提交,如果其他事务将该事务的日志刷下去一部分,那么同样认为这是脏数据的日志,虽然将其回放恢复了,但在可见性判断时,未在CLOG中检查到其已提交,所以不可见。
clog为讨论单词,需要注意。 clog简介 ---- 第一个问题,什么是clog?或者换个说法,PG到底有哪些日志,它们分别是干啥的? #define CLOG_BITS_PER_XACT 2#define CLOG_XACTS_PER_BYTE 4#define CLOG_XACTS_PER_PAGE (BLCKSZ * CLOG_XACTS_PER_BYTE 当这个事务最终提交或者回滚的时候,其最终状态就会被记录入clog。 事务提交与回滚时候的clog操作 ---- 首先来说提交。 ,后续读取的时候,就不需要回查clog了。
CLOG中一个页面常称为SLOT。
SLRU页面选择函数SlruSelectLRUPage:选择一个空的或淘汰一个SLOT(可能触发IO),返回一个可用SLOT
SLRU页面选择函数SlruSelectLRUPage:选择一个空的或淘汰一个SLOT(可能触发IO),返回一个可用SLOT
第22讲:CLOG作用与管理 内容1: PostgreSQL CLOG概述 内容2: CLOG作用与管理 内容3: 诊断当前用到的CLOG块 内容4: 删除不需要的CLOG文件 CLOG概述 CLOG用来记录事务号的状态 CLOG由一个或多个8KB页组成。CLOG在逻辑上形成一个数组,数组的每个元素对应事务ID号和事务状态。 CLOG的信息同样会被记录到wal日志中,当数据库异常中断时,CLOG的信息会从wal日志还原。 CLOG存放在缓存中,当checkpoint时开始刷新到CLOG文件中。 Commit Log · CLOG工作方式 · CLOG如何维护 数据库正常关闭或者检查点发生时,clog数据写入pg_xact目录下的文件中 命名习惯:0000 0001 …… 数据库启动时从pg_xact 4) block; block ------- 0 删除不需要的CLOG文件 · 删除CLOG文件 当发生急性冻结时会更新pg_database.datfrozenxid的值,此时,如果某些CLOG文件不包含包含最小
在PG中事务状态可以从几个路径获取: 在快照中查询(活跃事务) 在元组头的状态为查询(不活跃事务) 在CLOG中查询(不活跃事务) 如果不看实现只看概念,不活跃事务提交状态也可以在XLOG中查询,CLOG 所以在write-WAL-before-data中,CLOG也会按照data来处理,只有XLOG属于WAL。 Postgresql中clog写盘实现SlruPhysicalWritePage postgresql中clog使用SLRU机制读写,在Slru写盘前,会有保证xlog先写的机制: group_lsn表示
2OceanBase 中的 stop slave 下面通过几个实验,来验证 clog 是如何影响 OceanBase 主备集群状态的。 实验 1:关闭 clog,集群是否可用? 关闭 clog 同步(在主集群 sys 租户上操作)。 验证一下,当 【主备集群 clog 同步断开时间】 > 【clog 的保留时间】,再次开启主备集群间的 clog 同步,新数据是否丢失? 修改 clog 保留天数为 1 天: MySQL [(none)]> ALTER SYSTEM SET clog_expire_days=1; 1 天后,主集群插入新数据。 原理:当开启主备集群 clog 同步,会自动检测数据一致性,如发现数据不一致,会自动拉取基线数据进行同步。 4:停止 clog 同步后,备集群是否可用?
在看到“初识输入输出”这一小节时,见书中提到了cout/cerr/clog三个输出对象,但说得又不分明,于是百度了一下,学习了这三者间的异同以及重定向方法,但同时又发现网上关于重定向的说法和我的实测结果不吻合 <<"clog"<<std::endl; return 0; } 编译生成D:\EX01.exe。 1> D:\ex01.txt 屏幕上输出: cerr clog 而文本“cout”已经被重定向输出到了D:\ex01.txt中。 若执行命令D:\>EX01.exe 2> D:\ex01.txt 屏幕输出: cout 此时,文本“cerr”和“clog”都被重定向输出到了D:\ex01.txt中。 例2. 内部重定向 下面以对cerr输出流的重定向为例,cout和clog也可同样操作。
除此之外,<iostream> 头文件中还声明有 2 个 ostream 类对象,分别为 cerr 和 clog。 cout、cerr 和 clog 之间的区别如下: cout 除了可以将数据输出到屏幕上,通过重定向(后续会讲),还可以实现将数据输出到指定文件中;而 cerr 和 clog 都不支持重定向,它们只能将数据输出到屏幕上 除了以上 2 点特性上的不同之外,cerr、clog 和 cout 没有任何不同。之所以我们常用 cout,是因为 cerr 和 clog 有各自不同的适用场景。 c.biancheng.net cerr:http://c.biancheng.net clog:http://c.biancheng.net 注意,此程序中并没有考虑 cerr 和 clog 各自特有的含义 ,这里仅是为了演示 cerr 和 clog 的基础用法,不建议读者这样使用。
在继续往下说之前,我们的提到clog, 这是理解后面要提到的一些事情的前提, 在POSTGRESQL 中clog 是记录每一个事务相关的xid, 以及事务的提交状态, 状态包含了 执行中, 已提交, 中断 那么clog 承担了对整体事务状态的记录和查询的任务. 下面是一段clog 代码和 xidstatus的状态结构 从上面两个图中可以得到的信息 CLOG_BITS_PER_XACT 2 一个事务使用2BIT CLOG_XACTS_PER_BYTE 4 一个字节记录4个事务 CLOG_XACTS_PER_PAGE (BLCKSZ*CLOG_XACTS_PER_BYTE) 一个页面记录(8196*4=32784) 个事务 ((xid) ) / CLOG_XACTS_PER_BYTE) 最后的公式是计算事务信息存在在字节内的偏移量 ((xid) % (TransactionId) CLOG_XACTS_PER_BYTE) 如果要知道
头文件 函数和描述 <iostream> 该文件定义了 cin、cout、cerr 和 clog 对象,分别对应于标准输入流、标准输出流、非缓冲标准错误流和缓冲标准错误流。 标准日志流(clog) 预定义的对象 clog 是 iostream 类的一个实例。clog 对象附属到标准输出设备,通常也是显示屏,但是 clog 对象是缓冲的。 这意味着每个流插入到 clog 都会先存储在缓冲区,直到缓冲填满或者缓冲区刷新时才会输出。 通过这些小实例,我们无法区分 cout、cerr 和 clog 的差异,但在编写和执行大型程序时,它们之间的差异就变得非常明显。 所以良好的编程实践告诉我们,使用 cerr 流来显示错误消息,而其他的日志消息则使用 clog 流来输出。
头文件 函数和描述 <iostream> 该文件定义了 cin、cout、cerr 和 clog 对象,分别对应于标准输入流、标准输出流、非缓冲标准错误流和缓冲标准错误流。 标准日志流(clog) 预定义的对象 clog 是 iostream 类的一个实例。clog 对象附属到标准输出设备,通常也是显示屏,但是 clog 对象是缓冲的。 这意味着每个流插入到 clog 都会先存储在缓冲区,直到缓冲填满或者缓冲区刷新时才会输出。 通过这些小实例,我们无法区分 cout、cerr 和 clog 的差异,但在编写和执行大型程序时,它们之间的差异就变得非常明显。 所以良好的编程实践告诉我们,使用 cerr 流来显示错误消息,而其他的日志消息则使用 clog 流来输出。
2)Clog PostgreSQL 在 CLOG 中维护事务的状态,持久化存储在 pg_xact 目录下,为了访问高效,会在内存中维护一块共享内存用于缓存 CLOG 的内容。 Clog buffer大小为Min(128, Max(4, NBuffers / 512)),初始化函数为CLOGShmemInit。启动时会从pg_xact读取事务状态加载到内存。 系统运行过程中,vacuum会定时将不再使用的clog文件清理。 3)Hint 在进行可见性判断时,需要获取事务的状态,即元组中 t_xmin 和 t_xmax 的状态,这些事务状态保存在 CLOG 中,为加速获取事务状态的过程,PostgreSQL 引入了 Hint 所有 Hint Bits,就是把事务状态直接记录在元组头中(HeapTupleHeaderData),避免频繁访问 CLOG,元组头中对应的标识位如下:tuple->t_infomask #define
》 《Postgresql源码(65)新快照体系Globalvis工作原理分析》 《Postgresql快照优化Globalvis新体系分析(性能大幅增强)》 《Postgresql源码(23)Clog 页面淘汰机制》 (第一篇PG视角、下一篇GTM视角) (前面是乱七八糟的一些概念,最后一部分是GDB走读) 1 概念 1.1 集群MVCC Postgres-xl基本上使用PG提供的xmin、xmax、clog ClusterMonitorCtl->gtm_recent_global_xmin = newOldestXmin; 5 CLOG扩展 5.1 基础 《Postgresql源码(22)CLOG内存结构图示 CLOG中一个页面常称为SLOT。 ) + CLOG_XACTS_PER_PAGE - 1; // 如果上一次申请到了10000,现在需要的xid5000,clog页面够用直接返回。
》 《Postgresql源码(65)新快照体系Globalvis工作原理分析》 《Postgresql快照优化Globalvis新体系分析(性能大幅增强)》 《Postgresql源码(23)Clog (这篇是PG视角看GTM、后面在总结一篇GTM内部逻辑) (前面是一些概念,后面是GDB走读) 1 概念 1.1 集群MVCC Postgres-xl基本上使用PG提供的xmin、xmax、clog ClusterMonitorCtl->gtm_recent_global_xmin = newOldestXmin; 5 CLOG扩展 5.1 基础 《Postgresql源码(22)CLOG内存结构图示 CLOG中一个页面常称为SLOT。 ) + CLOG_XACTS_PER_PAGE - 1; // 如果上一次申请到了10000,现在需要的xid5000,clog页面够用直接返回。