PostgreSQL预写日志标志位的使用方法和影响

本篇内容主要讲解“PostgreSQL预写日志标志位的使用方法和影响”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PostgreSQL预写日志标志位的使用方法和影响”吧!

创新互联是一家专注于网站设计制作、做网站与策划设计,卧龙网站建设哪家好?创新互联做网站,专注于网站建设10多年,网设计领域的专业建站公司;建站业务涵盖:卧龙等地区。卧龙做网站价格咨询:028-86922220

本篇继续演示和讲解如何从代码中翻出自己需要的功能,以逻辑复制插件为例。过程中不可避免的会读很多无关的代码,这部分不需要啰嗦,随着代码熟悉程度的提高,这些开发过程中的开销会减少。

1、插件初始化设置callback函数commit_cb

它处理事务提交信息,但这里拿不到太多,LogicalDecodingContext 中并没有包含事务状态。

2、逻辑解码

src/backend/replication/logical/logical.c

callback函数 commit_cb 封装在 commit_cb_wrapper 中,设置到下一层的callback中:

/* commit callback signature */
typedef void (*ReorderBufferCommitCB) (
									   ReorderBuffer *rb,
									   ReorderBufferTXN *txn,
									   XLogRecPtr commit_lsn);

定义就不多说了,我们的目标是找到事务是否有控制标志,设置流程是什么,代码细节有兴趣自己看吧。

3、解码

再继续看下去,解码事务提交的函数是:DecodeCommit

src/backend/replication/logical/decode.c

这里可以看到,对于回滚掉的事务,也有一个专门的处理函数:DecodeAbort,它直接释放已经解码的结构。

4、事务标志位

  if (parsed->xinfo & XACT_XINFO_HAS_ORIGIN)
  {
    origin_lsn = parsed->origin_lsn;
    commit_time = parsed->origin_timestamp;
  }

随着代码的深入,它终于出现。扩展标志位xinfo,说扩展是由名字猜测。

/* does this record have a 'xinfo' field or not */
#define XLOG_XACT_HAS_INFO			0x80

而有没有xinfo由这个标志来确认,更多信息可以根据代码或者注释来了解。

5、它是什么时候设置的

src/backend/access/transam/xact.c 函数 XactLogCommitRecord

事务提交时根据状态写入。

6、我们还能看出什么

根据过滤器跳过部分事务

  if (SnapBuildXactNeedsSkip(ctx->snapshot_builder, buf->origptr) ||
    (parsed->dbId != InvalidOid && parsed->dbId != ctx->slot->data.database) ||
    ctx->fast_forward || FilterByOrigin(ctx, origin_id))
  {
    for (i = 0; i < parsed->nsubxacts; i++)
    {
      ReorderBufferForget(ctx->reorder, parsed->subxacts[i], buf->origptr);
    }
    ReorderBufferForget(ctx->reorder, xid, buf->origptr);

    return;
  }

那么,如果我们想自行控制事务是否解码,就可以使用这段逻辑,丝毫不用担心。

7、还有更多

继续上一点,不管事务是不是需要复制,都是要解码的,根据过滤条件再释放,也就是有一些无意义的开销。

其实这个过程还有很多不相关代码的阅读,确定无关就忽略掉,这里只列出有影响的部分。

到此,相信大家对“PostgreSQL预写日志标志位的使用方法和影响”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!


分享名称:PostgreSQL预写日志标志位的使用方法和影响
URL标题:http://scyanting.com/article/ghedec.html