postgresql中clog(commit log)文件与wal的关系及交互流程

  WAL相当于oracle中的redo log,mysql中的redolog,9.6及之前名为xlog,10+当前在pg_wal文件夹中,wal段默认大小为16M,在initdb时可以指定大小,后续原则上不可以修改。可以通过pg_waldump查看二进制日志的内容。wal的结构解析https://www.cnblogs.com/abclife/p/13708947.html,虽然不完全正确,比如LSN的物理文件ID解析就不正确)。wal的物理结构如下:

   WAL归档的执行过程可见https://wiki.moritetu.xyz/?PostgreSQL/%E8%A7%A3%E6%9E%90/WAL%E3%82%A2%E3%83%BC%E3%82%AB%E3%82%A4%E3%83%96

   clog(全称Commit Log,PostgreSQL transaction-commit-log manager,主要在clog.c中实现)里面记录了事务的执行状态,每次事务提交和回滚的时候,都需要更新该状态,PostgreSQL服务器访问该文件确定事务的状态,保存在pg_xact目录中,每个文件大小为256KB,每个事务2位(bit),故1个文件可以包含131072个事务。对于第一次修改的数据行来说,因为事务状态存储在clog中,所以修改后第一次判断行的可见性需要通过访问clog来确定,而访问clog是一个非常耗费性能的过程,故关于clog访问优化,有一个很长的discussion。

  事务在clog中的状态包括:。定义在xxx中。

  因为pg的MVCC在文件中实现undo,即使事务回滚了,新创建的行也不会被删除,但是因为clog中记录了事务的执行状态,所以其他事务在xmin和xmax判断时候可以过滤掉或不过滤掉这些记录

pg_xact(9.6及之前名为pg_clog,虽然代码中还是clog.c)

[postgres@hs-10-20-30-194 pg_xact]$ ll
total 13208
-rw------- 1 postgres postgres 262144 May 24 17:26 0000
-rw------- 1 postgres postgres 262144 May 24 17:26 0001
-rw------- 1 postgres postgres 262144 May 24 17:27 0002
-rw------- 1 postgres postgres 262144 May 24 17:27 0003
-rw------- 1 postgres postgres 262144 May 24 17:27 0004
-rw------- 1 postgres postgres 262144 May 24 17:28 0005
-rw------- 1 postgres postgres 262144 May 24 17:28 0006
-rw------- 1 postgres postgres 262144 May 24 17:28 0007

  clog和wal的交互:这得先理解事务的完整过程。

  

  每当一个新的clog页面(和pg中其他页面一样,也是BLCKSZ宏定义,默认8KB)被初始化为0的时候,clog.c就会生成一条wal记录。xact.c中针对提交和回滚操作的记录(recording)也会写clog。对于同步提交:在clog记录commit前,XLOG会确保被刷新,所以WAL可以自动被保证。对于异步提交:必须跟踪最新的LSN影响的每个CLOG页,这样才能刷新响应的xlog。clog的细节描述具体可以参见:https://www.interdb.jp/pg/pgsql05.html。clog的清理参见:https://www.interdb.jp/pg/pgsql06.html#_6.4.,由vacuum freeze负责清理。

其他目录说明:

pg_logical

pg_commit_ts

pg_multixact

pg_subtrans

pg_snapshots

pg_replslot

pg_dynshmem

9.6目录说明

10.0+目录说明(到14为止未在发生调整) 

原文地址:https://www.cnblogs.com/zhjh256/p/14807693.html