一、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的工作方式
二、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文件中(也说明当前最大的事务文件就是这个)