PostgreSQL(二十一)clog的作用与管理

时间:2024-07-13 11:07:01

一、CLOG的概念及作用

1、基础概念

(1)CLOG:记录事务号的状态,可以用其判断行的可见性。每个事务状态占用两个bit位。

tip:事务的状态有4种:IN_PROGRESS,COMMITTED,ABORTED和SUB_COMMITTED。

(2)CLOG由一个或多个8KB页组成。CLOG在逻辑上形成一个数组,数组的每个元素对应事务ID号和事务状态;

tip:一个事务占用2个bit位,一个字节可以存放4个事务状态,一个页块可以存放8192*4=32768个事务状态;

(3)当数据库库启动时,这些文件会被加载到内存中。CLOG的信息同样会被记录到Wal日志中,当数据库异常中断时,CLOG的信息会从Wal日志还原;

(4)CLOG先存放在缓存中,当 触发checkpoint时,开始将内缓存的内容刷新到CLOG文件中。

(5)当数据库库关闭库后,CLOG会被写入到 $PGDATA/pg_xact子目录中,文件命名为00000100002…,单个文件最大为256K。

2、CLOG的工作方式

T1时刻:事务号200的事务提交,事务号201的事务未提交,则clog中200记录为commit,201记录为in_progress;
T2时刻:事务号201的事务回滚,则clog中201的状态修改为abort。

二、CLOG的管理

1、CLOG如何自维护

数据库正常关闭或者检查点发生时,clog数据写入pg_xact目录下的文件中;

文件命名习惯:4位数字,从0000开始依次累加(0000 0001…);

数据库启动时会从pg_xact文件中加载数据;

由Vacuum进程定期处理 。

2、删除CLOG

当发生急性冻结时,会更新 pg_database.datfrozenxid的值;

此时,如果某些CLOG文件不包含最小pg_database.datfrozenxid以及之前的信息,会尝试删除不必要的clog文件,

因为这些clog文件中记录的事务所修改的行已经被冻结,那么在进行行可见性规则判断时就不需要获得该事务的状态。

综上:clog的删除是pg自动会进行的工作,不需要DBA手动维护。

3、实操:诊断当前使用的CLOG数据块位置

前面已知:一个事务占用2bit位,一个字节可以存放4个事务状态,则一个页块可以存放32768个事务状态(8192*4)。

(1)查看当前TXID号

select txid_current()

(2)计算记录在哪个CLOG块中

select txid_current()/(8192*4) block;

假设查询到的结果为:当前的事务ID为2792228。相除后得到的值为85。

则表示它记录在clog的第85个块中。

一个clog文件256k,一个块8k,则一个文件里有256/8=32个块。

85/32=2.6,表示第85个块在第2.6个数据文件中,0000 0001 0002,此事务ID记录在名为0002的clog文件中(也说明当前最大的事务文件就是这个)