返回首页

gbase数据、南大通用产品文档:GBase8c逻辑解码概述

更新日期:2024年09月11日

功能描述
GBase 8c 对数据复制能力的支持情况为:
支持通过数据迁移工具定期向异构数据库(如Oracle 等)进行数据同步,不具备实时
数据复制能力。不足以支撑与异构数据库间并网运行实时数据同步的诉求。
GBase 8c 提供了逻辑解码功能,通过反解xlog 的方式生成逻辑日志。目标数据库解析
逻辑日志以实时进行数据复制。具体如图21-1 所示。逻辑复制降低了对目标数据库的形态
限制,支持异构数据库、同构异形数据库对数据的同步,支持目标库进行数据同步期间的数
据可读写,数据同步时延低。

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
1124
图21-1 逻辑复制
逻辑复制由两部分组成:
逻辑解码和数据复制。
逻辑解码会输出以事务为单位组织的逻
辑日志。业务或数据库中间件将会对逻辑日志进行解析并最终实现数据复制。GBase 8c 当
前只提供逻辑解码功能,因此本章节只涉及逻辑解码的说明。
逻辑解码为逻辑复制提供事务解码的基础能力,GBase 8c 使用SQL 函数接口进行逻辑
解码。此方法调用方便,不需使用工具,对接外部工具接口也比较清晰,不需要额外适配。
由于逻辑日志是以事务为单位的,
在事务提交后才能输出,
且逻辑解码是由用户驱动的;
因此为了防止事务开始时的xlog 被系统回收,或所需的事务信息被VACUUM 回收,GBase
8c 新增了逻辑复制槽,用于阻塞xlog 的回收。
一个逻辑复制槽表示一个更改流,
这些更改可以在其它数据库中以它们在原数据库上产
生的顺序被重播。逻辑复制槽,由每个逻辑日志的获取者维护一个。
注意事项

不支持DDL语句解码,
在执行特定的DDL语句
(例如普通表truncate或分区表exchange)
时,可能造成解码数据丢失。

不支持列存、数据页复制的解码。

不支持级联备机进行逻辑解码。

当执行DDL 语句(如alter table)后,该DDL 语句前尚未解码的物理日志可能会丢失。

单条元组大小不超过1GB,考虑解码结果可能大于插入数据,因此建议单条元组大小
不超过500MB。

GBase 8c 支持解码的数据类型为:
INTEGER、
BIGINT、
SMALLINT、
TINYINT、
SERIAL、
SMALLSERIAL、
BIGSERIAL、
FLOAT、
DOUBLE PRECISION、
DATE、
TIME[WITHOUT

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
1125
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。

禁止在使用逻辑复制槽时在其他节点对该复制槽进行操作,
删除复制槽进行操作的操作

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
1126
需在该复制槽停止解码后执行。

参数说明:CM 模块端口认证方式,trust 表示未配置端口认证,gss 表示采用kerberos
端口认证。必须注意的是:只有当kerberos 服务端和客户端成功安装后才能修改为gss,否

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
1401
则CM 模块无法正常通信,将影响数据库状态。
取值范围:枚举类型,有效值有trust, gss。修改后需要重启cm_server 才能生效。参数
修改请参考表GUC 参数设置方式进行设置。
默认值:trust

sqldone() 函数确定数据库服务器当前是否正在处理 SQL 请求。

语法
mint sqldone();

用法

请在下列情况下使用 sqldone() 来检测数据库服务器的状态:
在调用 sqlbreak() 函数来确定数据库服务器是否正在处理 SQL 请求之前。
在信号句柄函数中,在调用 longjmp() 系统函数之前。如果 sqldone() 返回零(数据
库服务器空闲),则仅使用信号句柄函数中的 longjmp()。

当 sqldone() 函数确定当前数据库服务器未正在处理 SQL 请求时,您可假定数据库
服务器未开启任何其他处理,直到您的应用程序发出它的下一请求为止。

您可能想要为 -439 值创建定义的常量,来使得您的代码更加可读。例如,下列代码
片段创建 SERVER_BUSY 常量,然后使用它来检测 sqldone() 返回状态:
#define SERVER_BUSY -439
.
.
.
if (sqldone() == SERVER_BUSY)

返回代码
0
数据库服务器当前没有正在处理 SQL 请求:它是空闲的。

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 947 -
-439
数据库服务器当前正在处理 SQL 请求。