首页 > 数据库 >openGauss怎么工作SQL函数接口读取逻辑解码结果?

openGauss怎么工作SQL函数接口读取逻辑解码结果?

时间:2024-08-14 17:56:33浏览次数:19  
标签:slot 逻辑 数据库 复制 SQL test openGauss 解码

在这里插入图片描述

功能描述

在openGauss中如果实现数据复制呢?

  1. 可以通过数据迁移工具定期向目标数据库进行数据库的同步,说的定期,这就意味着这种方式不能满足数据实时复制的需求。
  2. 在openGauss中为我们提供了逻辑解码功能,工作原理就是反解xlog,从而生成逻辑日志,在目标数据库中通过对逻辑进行解析来实现数据的实时复制能力。由于目标数据库对逻辑日志进行解析生成的SQL语句,都是标准SQL,因此逻辑复制大大降低了对目标数据库的形态限制,故支持异构数据库、同构异形数据库对数据的同步,同时也是支持在目标数据库对数据同步期间的可读可写操作,降低了数据同步到时延。


通过上面的图,我们可以清楚的看到逻辑复制是由两部分组成:

  1. 逻辑解码
  2. 数据复制

逻辑解码部分会产生逻辑日志,逻辑日志是以事务为单位进行组织的。我们可以在自己的业务对逻辑日志进行组成SQL语句,从而实现数据复制到目的,数据库中间件即为此原理。

思考一下
我们如何自己实现一个openGauss数据同步到中间件呢?如果你有想法来评论区交流交流吧!

要是实现逻辑复制,逻辑解码是必须可少的,因为逻辑解码提供了事务解码的基础能力,在openGauss中要实现逻辑解码很是简单,我们可以通过SQL函数接口就能做到,是不是简单到超乎你的想象,这种方式使用起来不需要额外的工具,简单易用好上手,也能非常方便的对接外部工具。
因为逻辑日志的基本单位是事务,所以只有当事务提交后才会有输出,并且这个过程是用户自行驱动的;在openGauss高斯中为了阻塞xlog的回收,使用了逻辑复制槽,这样中的目的是:

  1. 防止事务开始时的xlog被系统回收;
  2. 防止所需要的事务信息被VACUUM回收。

什么是VACUUM?
在页面级别、表级别和数据库级别的整体清理,这个机制称之为VACUUM操作。

上面说到了一个概念“逻辑复制槽”,那么这个是什么呢?
说白了逻辑复制槽就是一个更改流,相关的更改能在其他数据库中以它们的原数据库中产生的顺序被重放,逻辑复制槽由每个逻辑日志的获取者维护一个。

注意事项

这部分内容来自官方

  • 不支持DDL语句解码,在执行特定的DDL语句(例如普通表truncate或分区表exchange)时,可能造成解码数据丢失。
  • 不支持列存、数据页复制的解码。
  • 不支持级联备机进行逻辑解码。
  • 当执行DDL语句(如alter table)后,该DDL语句前尚未解码的物理日志可能会丢失。
  • 单条元组大小不超过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连接需要保证前置设置GUC参数ssl=on。
  • 逻辑复制槽名称必须小于64个字符,且只包含小写字母、数字或者下划线中的一种或几种。
  • 当前逻辑复制不支持MOT特性。
  • 当逻辑复制槽所在数据库被删除后,这些复制槽变为不可用状态,需要用户手动删除。
  • 仅支持utf-8字符集。
  • 对多库的解码需要分别在库内创建流复制槽并开始解码,每个库的解码都需要单独扫一遍日志。
  • 不支持强起,强起后需要重新全量导出数据。
  • 备机解码时,switchover和failover时可能出现解码数据变多,需用户手动过滤。Qurem协议下,switchover和failover选择升主的备机,需要与当前主机日志同步。
  • 不允许主备,多个备机同时使用同一个复制槽解码,否则会产生数据不一致。
  • 只支持主机创建删除复制槽。
  • 数据库故障重启或逻辑复制进程重启后,解码数据存在重复,用户需自己过滤。
  • 计算机内核故障后,解码存在乱码,需手动或自动过滤。
  • 当前备机逻辑解码,不支持开启极致RTO。
  • 请确保在创建逻辑复制槽过程中长事务未启动,启动长事务会阻塞逻辑复制槽的创建。
  • 不支持interval partition表复制。
  • 不支持全局临时表。
  • 在事务中执行DDL语句后,该DDL语句与之后的语句不会被解码。
  • 如需进行备机解码,需在对应主机上设置guc参数enable_slot_log = on。
  • 禁止在使用逻辑复制槽时在其他节点对该复制槽进行操作,删除复制槽进行的操作需在该复制槽停止解码后执行。
  • 在开启逻辑复制的场景下,如需创建包含系统列的主键索引,必须将该表的REPLICA IDENTITY属性设置为FULL或是使用USING INDEX指定不包含系统列的、唯一的、非局部的、不可延迟的、仅包括标记为NOT NULL的列的索引。

好了,到这次讲了这么多,那么我们该如何使用呢?
不着急,让眼睛休息一下,我们继续往下看…

使用SQL函数接口进行逻辑解码

修改配置

wal_level=logica
max_replication_slots=8

操作步骤

  1. omm用户登录openGauss数据库的主节点
  2. 采用gsql命令登录
gsql -d postgres -p 9999 -r

上面的9999端口修改你的实际端口号

  1. 创建逻辑复制槽
openGauss=# SELECT * FROM pg_create_logical_replication_slot('test-slot', 'mppdb_decoding');
slotname | xlog_position
----------+---------------
test-slot    | 0/601C150
(1 row)

test-slot就是槽名称,当前你可以根据你自己的规则命令,我这里仅仅是做演示。

  1. 创建数据表并插入数据
-- 创建test表
CREATE TABLE test(a int PRIMARY KEY, b int);
-- 插入数据
INSERT INTO test VALUES(1024,512);
  1. 读取test-slot槽解码结果
SELECT * FROM pg_logical_slot_peek_changes('slot1', NULL, 4096);
location  |  xid  | data                                                                                         
-----------+-------+------------------------------------------------------------------
--------------------------------------------------------------------------------------
------------------------------------
 0/601C188 | 1010023 | BEGIN 1010023
 0/601ED60 | 1010023 | COMMIT 1010023 CSN 1010022
 0/601ED60 | 1010024 | BEGIN 1010024
 0/601ED60 | 1010024 | {"table_name":"public.test","op_type":"INSERT","columns_name":["a","b"],"columns_type":["integer",
                       "integer"],"columns_val":["1024","512"],"old_keys_name":[],"old_keys_type":[],"old_keys_val":[]}
 0/601EED8 | 1010024 | COMMIT 1010024 CSN 1010023
(5 rows)

  1. 通过下面的方式删除复制槽test-slot
SELECT * FROM pg_drop_replication_slot('test-slot');
 pg_drop_replication_slot
--------------------------

(1 row)

标签:slot,逻辑,数据库,复制,SQL,test,openGauss,解码
From: https://blog.csdn.net/u010490822/article/details/141196347

相关文章

  • sqlserver清理数据库日志并写作业定期执行
    清理数据库日志最终sql:USE[master]GOALTERDATABASElsrz_zjwb_wSETRECOVERYSIMPLEWITHNO_WAITGOALTERDATABASElsrz_zjwb_wSETRECOVERYSIMPLE--简单模式GOUSElsrz_zjwb_wGODBCCSHRINKFILE(N'lsrz_zjwb_log',2,TRUNCATEONLY)--日志文件逻辑名称......
  • SQL中exists和in的用法以及区别
    SQL中exists和in的用法以及区别  目录一、in用法二、exists用法三、in与exists的区别in语句:只执行一次exists语句:执行n次(外表行数)区别和应用场景notin和notexists四、结论 一、in用法in 语法为:select*fromtable_namewherecol_namei......
  • Mysql 中Exists
    existsexists对外表用loop逐条查询,每次查询都会查看exists的条件语句,当exists里的条件语句能够返回记录行时(无论记录行是的多少,只要能返回),条件就为真,返回当前loop到的这条记录;反之,如果exists里的条件语句不能返回记录行,则当前loop到的这条记录被丢弃,exists的条件就像一个bool条件......
  • SQLServer 错误: 8646,在数据库 'msdb',表 1077578877 的索引 ID 1 中找不到索引条目
    一台非生产服务器,磁盘被打满了,刚开始以为只是正常的磁盘使用增长满了,就清理了一部分空间出来,没过一会,就又满了,排查到sqlserver的错误日志文件一直在增 同时查看sqlserver错误日志,大量报错日志:[298]SQLServer错误:8646,在数据库'msdb',表1077578877的索引ID1中找不到索......
  • postgresql常用快捷命令
    查看帮助信息通过此命令查看数据库命令帮助信息,本文中的所有命令都可以在帮助命令列表找到命令格式:?示例:\?查看所有数据库命令格式:\l示例:\l切换数据库命令格式:\c数据库名称示例:\ctest_database执行成功会切换到指定的数据库查看数据库对象的相关信息命......
  • MySQL快速查询表和列
    1、获取某个库的所有表信息select*frominformation_schema.TABLESwhereTABLE_SCHEMA=(selectdatabase())即可查询当前数据库的表信息,包括了表名,注释等。2、查询某个表的字段信息select*frominformation_schema.COLUMNSwhereTABLE_SCHEMA=(selectdatabase())......
  • Padding Mask;Sequence Mask;为什么如果没有适当的掩码机制,解码器在生成某个位置的输出
    目录掩码Mask PaddingMask SequenceMask为什么需要SequenceMask?SequenceMask是如何工作的?具体实现为什么如果没有适当的掩码机制,解码器在生成某个位置的输出时,可能会“看到”并错误地利用该位置之后的信息自回归性质一、定义二、性质三、应用限制掩码Mask......
  • CTFHub~SQL注入超简单详细教程
    0x01整数型注入#本题告诉我们是整数型,所以就很容易了#判断字段数量1orderby2#判断回显点-1unionselect1,2#查询全部数据库名-1unionselect1,group_concat(schema_name)frominformation_schema.schemata#判断数据库中的表名-1unionselec......
  • 基于 canal+mysql 实现 yjs-schema 数据实时同步
    MySQL自动同步开源工具在现代的数据处理中,数据同步是非常重要的一个环节。MySQL作为一个广泛应用的数据库管理系统,自动同步数据也是一个比较常见的需求。今天我们将介绍一些开源工具,可以帮助我们实现MySQL数据库的自动同步。1.MaxScaleMaxScale是一个开源的MySQLProxy工具,它......
  • 在Centos系统源码安装postgreSQL数据库及postGIS扩展
    本次安装的各版本如下postgresql-13.5.targeos-3.10.2gdal-3.4.1proj-8.2.1postgis-3.2.1一、安装postgreSQL1.1安装包下载地址选postgresql-13.5.tar.gz。使用工具将下载好的包传到服务器。解压,进入解压目录[root@localhostlocal]#yuminstallgccreadline-develzlib-d......