![487762b5b408b499a894439f274e9441.png](https://img-blog.csdnimg.cn/img_convert/487762b5b408b499a894439f274e9441.png)
在使用PostgreSQL的逻辑复制时,需要将wal级别设置为logical,所以logical级别的wal日志一定时比replicate的wal日志多了一些数据来支持逻辑复制功能。我想很多用户或者DBA不清楚logical和replicate级别有何不同之处,这篇博客记录了logical级别相对于replicate级别多写入的wal数据,读者可以据此评估或分析改为logical级别后对wal日志膨胀的影响。
1. 逻辑复制的原理—Logical的使命
在这篇博客里详细介绍了逻辑复制的原理,这里再简单阐述一下,逻辑复制就是读取DML语句产生的wal日志,并将其解析为tuple的形式并发送到订阅端,订阅端接受到tuple之后将tuple做相应的更新处理。
比如说解析一条UPDATE语句产生的wal记录,会产生一个tuple-old和一个tuple-new,订阅端在目标表中查找与tuple-old相同的行,并把它更新为tuple-new。当然对于insert来说只有tuple-new,对于DELETE来说只有tuple-old.
所以逻辑复制的关键就是能不能从wal中解析出tuple-old和tuple-new,这也是logical级别的使命。
2. 不同Wal级别记录DML语句的方式
2.1 tuple-new的记录
FPI相关
INSERT,UPDATE或COPY语句会在数据页上插入新行。这个新行的数据一般会直接记录在这个语