postgresql四种逻辑复制的状态

准备

CreateCheckpoint,或者bgwriter启动时,或者创建logicalreplicationslot时都会调用LogStandbySnapshot 记录一个XLOG_RUNNING_XACTS类型的日志。日志中记录了所有提交的事务的xid(HistoricSnapshot)

启动(SNAPBUILD_BUILDING_SNAPSHOT)

当接收端读到 XLOG_RUNNING_XACTS 时,调用SnapBuildProcessRunningXacts开始记录所有看到的日志,但此时只知道提交的事务,不知道进行中的事务。在没有完整事务状态的情况下,接收端是不能开始apply日志的。这时日志中记录的 nextxid(1) 就是这之后再开启事务时的最小事务号。

组装事务状态(SNAPBUILD_FULL_SNAPSHOT)

当接收端再收到 XLOG_RUNNING_XACTS 时,如果发现nextxid(1)之前的日志都提交了,就证明当前从日志收集过的事务,已经是全部在运行的事务了,没有不知道的事务,此时事务状态是完整的,但因为之前收到的非事务的 log 都人为丢弃了,不能对这些事务 apply log,因为事务不完整,这时nextxid(2)记录的就是之后再开启事务的时的最小事务号 。

这时每次 apply 前要判断,要 apply 的这个事务的xid是否在nextxid(2)之前,如果是之前的就不apply,之后的才apply(SnapBuildProcessChange)。

第一次apply的时候会记录一个完整的HistoricSnapshot作为basesnapshot

事务状态已完整(SNAPBUILD_CONSISTENT)

当接收端再收到 XLOG_RUNNING_XACTS 时,如果发现nextxid(2)之前的日志都提交了,说明以后收到的 log一定可以 apply,不用再做上面的判断了。

第一次到这个状态时会写一个.snap文件

新的事务提交日志(SnapBuildCommitTxn)

在每次处理事务提交日志时,它会感知所有修改系统表的事务,把它们加入新snapshot中(SnapBuildAddCommittedTxn),并把这个新的 snapshot 挂到所有事务的reorderbuffer中(SnapBuildDistributeNewCatalogSnapshot)。当其它事务commit时(DecodeCommit),检查reorder_buffer(ReorderBufferCommit),就会 apply 这个 snapshot (TeardownHistoricSnapshot + SetupHistoricSnapshot)

相关推荐
serve the people1 小时前
Prompt Serialization in LangChain
数据库·langchain·prompt
万事大吉CC1 小时前
Win11卸载重装oracle 11g数据库
数据库
数据库那些事儿2 小时前
DMS Airflow:企业级数据工作流编排平台的专业实践
数据库
一 乐2 小时前
流浪动物救助|流浪猫狗救助|基于Springboot+vue的流浪猫狗救助平台设计与实现(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·毕设
好记忆不如烂笔头abc2 小时前
Configuration of TCP/IP with SSL and TLS for Database Connections
数据库·网络协议·ssl
安全系统学习2 小时前
自学网络安全学习的误区和陷阱
数据库·学习·安全·web安全·网络安全·安全架构
黄色茶杯3 小时前
AI编程工具TRAE解决日常问题之SQLite数据复制
数据库·sqlite
老华带你飞3 小时前
订票系统|车票管理系统|基于Java+vue的车票管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·订票系统
weixin_wx520-19833 小时前
骑士人才网全系与phpyun人才网系统数据转移或互转的技术文档和要领,和大家一起共勉
数据库·骑士人才网开源版·骑士人才网数据转移·phpyun人才网源码
聆风吟º3 小时前
国产化数据库选型深度剖析:金仓KES与达梦DM全生命周期成本对比
数据库·kingbasees