PostgreSQL之Commit Log

PostgreSQL数据库把事务的状态信息保存在Commit Log(简称clog)中,clog被分配在共享内存shared memory,记录事务的所有状态变化。下面我们先了解一下事务状态都有哪些。

事务状态

PG中的事务状态有4种,包括IN_PROGRESS、COMMITTED、ABORTED、SUB_COMMITTED。我们主要关注前三种。

关于Clog

clog在共享内存中由1个或多个8KB的页面组成。逻辑上clog是一个数组,存放每个事务ID及对应的事务状态,如下图所示:
在这里插入图片描述
从上图可以看出,clog保存了当前时间点的事务及事务状态。
当txid往前进的时候如果发现clog的页面已经存放了,就会追加一个页面写进去。
当需要获取一个事务的状态信息时,会调用相关的内部函数。这些函数读取clog并返回相关事务的状态信息。

clog维护

当PG数据库实例被关闭或者是运行checkpoint时,clog数据会被写到磁盘文件中,具体保存在pg_xact子目录(在PG 9.6或早期版本中称为pg_clog)。pg_xact子目录下面的文件命名为0000,0001等。每个文件最大为256KB。比如,如果clog用到了8个页面那么总大小为64KB,这64KB就会写到0000这一个文件中(因为64KB没超过256KB)。如果有37个页面,数据就会写到0000和0001两个文件中,文件大小分别为256KB和40KB。
当数据库启动时,pg_xact下文件的数据就会被加载并初始化共享内存的clog
clog大小会持续增长,因为当一个clog页面填满时就会自动追加一个新的页面。但并不是所有的clog中的数据都是必须的。我们在前面文章关于VACUUM介绍中也提到了VACUUM动作会清理一些不必须的clog页面以及相关的文件。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据源的港湾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值