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

发布时间:2021-06-26 14:14:00 作者:chen
来源:亿速云 阅读:172

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

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

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预写日志标志位的使用方法和影响”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

推荐阅读:
  1. C#:写日志函数
  2. C#枚举类型用户标志位的代码

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

postgresql

上一篇:bootstrap中怎么实现多张图片上传并校验

下一篇:微信小程序如何实现使用table显示数据库反馈的多条数据功能

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》