首页 > 其他分享 >openGauss逻辑解码

openGauss逻辑解码

时间:2024-03-18 16:27:39浏览次数:24  
标签:slot 逻辑 postgres 解码 复制 日志 openGauss

openGauss 逻辑解码

逻辑复制由两部分组成:逻辑解码和数据复制。逻辑解码会输出以事务为单位组织的逻辑日志。业务或数据库中间件将会对逻辑日志进行解析并最终实现数据复制。

openGauss 当前只提供逻辑解码功能,因此文只对逻辑解码进行简单说明和测试。

逻辑解码为逻辑复制提供事务解码的基础能力,openGauss 使用 SQL 函数接口进行逻辑解码。此方法调用方便,不需使用工具,对接外部工具接口也比较清晰,不需要额外适配。

由于逻辑日志是以事务为单位的,在事务提交后才能输出,且逻辑解码是由用户驱动的;因此为了防止事务开始时的 xlog 被系统回收,或所需的事务信息被 VACUUM 回收,openGauss 新增了逻辑复制槽,用于阻塞 xlog 的回收。

注意事项

  • 不支持 DDL 语句解码。
  • 不支持列存、数据页复制的解码。
  • 不支持备机与级联备机进行逻辑解码。
  • 当执行 DDL 语句(如 alter table)后,该 DDL 语句前尚未解码的物理日志可能会丢失。
  • 使用逻辑解码功能时,禁止进行数据库在线扩容。
  • 使用逻辑解码功能时,禁止执行 VACUUM FULL。
  • 单条元组大小不超过 1GB,考虑解码结果可能大于插入数据,因此建议单条元组大小不超过 500MB。
  • openGauss 支持解码的数据类型为:INTEGER、BIGINT、SMALLINT、TINYINT、SERIAL、SMALLSERIAL、BIGSERIAL、FLOAT、DOUBLE PRECISION、DATE、TIME[WITHOUT TIME ZONE]、TIMESTAMP[WITHOUT TIME ZONE]、CHAR(n)、VARCHAR(n)、TEXT。
  • 目前默认不支持 ssl 连接,如果需要 ssl 连接需要设置 guc 参数 ssl=on。
  • 如果使用 JDBC 创建逻辑复制槽,则逻辑复制槽名称必须小于 64 个字符,且只包含字母、数字或者下划线中的一种或几种。
  • 当前逻辑复制不支持 MOT 特性。
  • 当逻辑复制槽所在数据库被删除后,这些复制槽变为不可用状态,需要用户手动删除。
  • 仅支持 utf-8 字符集。
  • 对多库的解码需要分别在库内创建流复制槽并开始解码,每个库的解码都需要单独扫一遍日志。
  • 不支持强起,强起后需要重新全量导出数据。

准备工作

$ gs_guc reload -N all -I all -c "ssl=on"
$ gs_guc reload -N all -I all -c "wal_level=logical"
$ gs_guc reload -N all -I all -c "max_replication_slots=10"    ## max_replication_slots>每个节点所需的(物理流复制槽数+逻辑复制槽数)
$ gs_om -t stop && gs_om -t start

Tips:

  • 物理流复制槽用于支撑主备 HA。数据库所需要的物理流复制槽数为:备节点(包括从备)与主节点之间的比例(假设数据库的高可用方案为 1 主 3 备,则所需物理流复制槽数为 3)。
  • 一个逻辑复制槽只能解码一个 Database 的修改,如果需要解码多个 Database,则需要创建多个逻辑复制槽。
  • 如果需要多路逻辑复制同步给多个目标数据库,在源端数据库需要创建多个逻辑复制槽,每个逻辑复制槽对应一条逻辑复制链路。
  • 仅限数据库管理员和拥有 REPLICATION 权限的用户进行操作。

创建逻辑复制槽

$ gsql -d postgres -p 26000 -r -q
-- 创建一个名为slot1的逻辑复制槽,plugin_name当前仅支持mppdb_decoding
postgres=# SELECT * FROM pg_create_logical_replication_slot('slot1', 'mppdb_decoding');
 slotname | xlog_position
----------+---------------
 slot1    | 0/8948D100      -- 逻辑复制槽解码的起始LSN位置

创建测试数据

postgres=# create table logic_test(id int,date1 date);
postgres=# insert into logic_test values(1,now());
postgres=# select * from logic_test ;
 id |        date1
----+---------------------
  1 | 2021-05-31 10:02:59

读取复制槽逻辑解码结果

postgres=# select * from pg_replication_slots;
 slot_name |     plugin     | slot_type | datoid | database | active | xmin | catalog_xmin | restart_lsn | dummy_standby
-----------+----------------+-----------+--------+----------+--------+------+--------------+-------------+---------------
 slot1     | mppdb_decoding | logical   |  15103 | postgres | f      |      |        13620 | 0/8948D080  | f
postgres=# select * from pg_logical_slot_peek_changes('slot1',null,4096);    -- (slot_name,LSN,upto_nchanges)
  location  |  xid  |     data
------------+-------+------------------------------------------------------------------------------------------------------------------
 0/8948D278 | 13620 | BEGIN 13620
 0/8948F088 | 13620 | COMMIT 13620 CSN 2277
 0/8948F1F8 | 13621 | BEGIN 13621
 0/8948F1F8 | 13621 | {"table_name":"public.logic_test","op_type":"INSERT","columns_name":["id","date1"],"columns_type":["integer","tim
estamp without time zone"],"columns_val":["1","'2021-05-31 10:02:59'"],"old_keys_name":[],"old_keys_type":[],"old_keys_val":[]}
 0/8948F300 | 13621 | COMMIT 13621 CSN 2278

Tips:

  • slot_name: 流复制槽名称
  • LSN: 日志的 LSN,表示只解码小于等于此 LSN 的日志, NULL 表示不对解码截止的日志位置做限制
  • upto_nchanges: 解码条数。假设一共有 3 条事务,分别包含 3、5、7 条记录,如果 upto_nchanges 为 4,那么会解码出前两个事务共 8 条记录。

删除逻辑复制槽 slot1

postgres=# select * from pg_drop_replication_slot('slot1');

标签:slot,逻辑,postgres,解码,复制,日志,openGauss
From: https://www.cnblogs.com/renxyz/p/18080622

相关文章

  • 初窥openGauss-之参数自调优X-Tuner
    **初窥openGauss之参数自调优X-Tuner**TPC-H是一个面向分析型业务(AP)的基准测试,它由一系列热点查询组成,这些热点查询都是高度复杂的,因此执行时间往往都比较长。在本次实验测试中,将手动向数据库加载TPC-H数据,并保存在名为tpch的数据库中。默认TPC-H数据库的表缺少索引......
  • 初窥-openGauss-之索引推荐Index-advisor
    初窥openGauss之索引推荐Index-advisorTPC-H是一个面向分析型业务(AP)的基准测试,它由一系列热点查询组成,这些热点查询都是高度复杂的,因此执行时间往往都比较长。在本次实验测试中,将手动向数据库加载TPC-H数据,并保存在名为tpch的数据库中。默认TPC-H数据库的表缺少索引......
  • 使用BenchmarkSQL压测openGauss
    使用BenchmarkSQL压测openGauss安装配置JDK官方网站下载JDK:https://www.oracle.com/technetwork/java/javase/downloads/index.html配置JDK环境解压到JDK到指定路径。#解压到JDK到指定路径tar-xvfjdk-8u231-linux-x64.tar.gz-C/usr/local#配置系统环境变......
  • openGauss的扩容缩容和问题处理
    openGauss的扩容缩容和问题处理openGauss提供了优秀的集群管理工具gs_om,集群管理信息写在二进制文件中,从而牺牲了增加节点和摘除节点的便利性(相对PG而言)。好在openGauss-1.1.0提供了节点扩容和缩容的工具,gs_dropnode和gs_expansion。生产主库服务器出现硬件故障,无法启......
  • openGauss数据库之Python驱动快速入门
    OpenGauss数据库之Python驱动openGauss是一款开源关系型数据库管理系统,采用木兰宽松许可证v2发行。openGauss内核源自PostgreSQL,深度融合华为在数据库领域多年的经验,结合企业级场景需求,持续构建竞争力特性。可是目前针对于OpenGauss数据库的Python应用程序的开发少......
  • Step-by-Step之-openGauss1-0-1单机安装指南v1-2
    StepbyStep之:openGauss1.0.1单机安装指南v1.2在CentOS7.6上安装openGauss单机版配置操作系统满足安装要求硬件环境:虚拟机的内存8GB,4核心CPU,900G磁盘(非必须)软件环境:CentOS7.6关闭防火墙#停止firewallsystemctlstopfirewalld.service#禁止firewall开机启......
  • openGauss的索引组织表
    openGauss的索引组织表概述今天有位小伙伴问我,Oracle数据库可以通过索引组织表(IOT)将数据按照主键排序存储,有序的数据存储可以有效提高数据库缓冲区的命中率,减少SQL查询的IO消耗,提升查询效率。而openGauss的建表语句中并没有看到索引组织表的相关语法。openGauss目前......
  • step-by-step系列之-openGauss1-0-1-Docker版本单机安装指南
    stepbystep系列之:openGauss1.0.1Docker版本单机安装指南1.软硬件环境硬件环境:项目最低配置推荐配置测试配置硬盘用于安装openGauss的硬盘需最少满足如下要求:至少1GB用于安装openGauss的应用程序包。每个主机需大约300MB用于元数据存储。预留70%以上的磁盘剩......
  • step-by-step之-install-docker版本opengauss1-0-1主备机群
    stepbystep之:installdocker版本opengauss1.0.1主备机群实验环境说明:OS:2颗8核心8GB内存。1.流程:先安装docker软件,下载Docker镜像,在创建启动主备容器数据库,进入数据库,进行主备切换试验。2.安装docker软件[root@node1~]#yum-yinstalldocker#检查docke......
  • openGauss增量备份恢复
    openGauss增量备份恢复openGauss数据库自2020年6月30日发布以来,很多小伙伴都提到“openGauss数据库是否有增量备份工具?“这么一个问题。在openGauss1.0.0版本的时候,关于这个问题的回答往往是:“Sorry…”,openGauss数据库可以使用gs_basebackup工具对数据库进行物......