计算
弹性云服务器 ECS
Flexus云服务
裸金属服务器 BMS
弹性伸缩 AS
镜像服务 IMS
专属主机 DeH
函数工作流 FunctionGraph
云手机服务器 CPH
Huawei Cloud EulerOS
网络
虚拟私有云 VPC
弹性公网IP EIP
虚拟专用网络 VPN
弹性负载均衡 ELB
NAT网关 NAT
云专线 DC
VPC终端节点 VPCEP
云连接 CC
企业路由器 ER
企业交换机 ESW
全球加速 GA
安全与合规
安全技术与应用
Web应用防火墙 WAF
企业主机安全 HSS
云防火墙 CFW
安全云脑 SecMaster
DDoS防护 AAD
数据加密服务 DEW
数据库安全服务 DBSS
云堡垒机 CBH
数据安全中心 DSC
云证书管理服务 CCM
边缘安全 EdgeSec
威胁检测服务 MTD
CDN与智能边缘
内容分发网络 CDN
CloudPond云服务
智能边缘云 IEC
迁移
主机迁移服务 SMS
对象存储迁移服务 OMS
云数据迁移 CDM
迁移中心 MGC
大数据
MapReduce服务 MRS
数据湖探索 DLI
表格存储服务 CloudTable
云搜索服务 CSS
数据接入服务 DIS
数据仓库服务 GaussDB(DWS)
数据治理中心 DataArts Studio
数据可视化 DLV
数据湖工厂 DLF
湖仓构建 LakeFormation
企业应用
云桌面 Workspace
应用与数据集成平台 ROMA Connect
云解析服务 DNS
专属云
专属计算集群 DCC
IoT物联网
IoT物联网
设备接入 IoTDA
智能边缘平台 IEF
用户服务
账号中心
费用中心
成本中心
资源中心
企业管理
工单管理
国际站常见问题
ICP备案
我的凭证
支持计划
客户运营能力
合作伙伴支持计划
专业服务
区块链
区块链服务 BCS
Web3节点引擎服务 NES
解决方案
SAP
高性能计算 HPC
视频
视频直播 Live
视频点播 VOD
媒体处理 MPC
实时音视频 SparkRTC
数字内容生产线 MetaStudio
存储
对象存储服务 OBS
云硬盘 EVS
云备份 CBR
存储容灾服务 SDRS
高性能弹性文件服务 SFS Turbo
弹性文件服务 SFS
云硬盘备份 VBS
云服务器备份 CSBS
数据快递服务 DES
专属分布式存储服务 DSS
容器
云容器引擎 CCE
容器镜像服务 SWR
应用服务网格 ASM
华为云UCS
云容器实例 CCI
管理与监管
云监控服务 CES
统一身份认证服务 IAM
资源编排服务 RFS
云审计服务 CTS
标签管理服务 TMS
云日志服务 LTS
配置审计 Config
资源访问管理 RAM
消息通知服务 SMN
应用运维管理 AOM
应用性能管理 APM
组织 Organizations
优化顾问 OA
IAM 身份中心
云运维中心 COC
资源治理中心 RGC
应用身份管理服务 OneAccess
数据库
云数据库 RDS
文档数据库服务 DDS
数据管理服务 DAS
数据复制服务 DRS
云数据库 GeminiDB
云数据库 GaussDB
分布式数据库中间件 DDM
数据库和应用迁移 UGO
云数据库 TaurusDB
人工智能
人脸识别服务 FRS
图引擎服务 GES
图像识别 Image
内容审核 Moderation
文字识别 OCR
AI开发平台ModelArts
图像搜索 ImageSearch
对话机器人服务 CBS
华为HiLens
视频智能分析服务 VIAS
语音交互服务 SIS
应用中间件
分布式缓存服务 DCS
API网关 APIG
微服务引擎 CSE
分布式消息服务Kafka版
分布式消息服务RabbitMQ版
分布式消息服务RocketMQ版
多活高可用服务 MAS
事件网格 EG
企业协同
华为云会议 Meeting
云通信
消息&短信 MSGSMS
云生态
合作伙伴中心
云商店
开发者工具
SDK开发指南
API签名指南
Terraform
华为云命令行工具服务 KooCLI
其他
产品价格详情
系统权限
管理控制台
客户关联华为云合作伙伴须知
消息中心
公共问题
开发与运维
应用管理与运维平台 ServiceStage
软件开发生产线 CodeArts
需求管理 CodeArts Req
部署 CodeArts Deploy
性能测试 CodeArts PerfTest
编译构建 CodeArts Build
流水线 CodeArts Pipeline
制品仓库 CodeArts Artifact
测试计划 CodeArts TestPlan
代码检查 CodeArts Check
代码托管 CodeArts Repo
云应用引擎 CAE
开天aPaaS
云消息服务 KooMessage
云手机服务 KooPhone
云空间服务 KooDrive

逻辑解码概述

更新时间:2024-08-20 GMT+08:00

功能描述

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

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

一个逻辑复制槽表示一个更改流,这些更改可以在其他数据库中以它们在原数据库上产生的顺序重新执行。每个逻辑复制槽都由其对应逻辑日志的获取者维护。如果处于流式解码中的逻辑复制槽所在库不存在业务,则该复制槽会依照其他库的日志位置来推进。活跃状态的LSN序逻辑复制槽在处理到活跃事务快照日志时可以根据当前日志的LSN推进复制槽;活跃状态的CSN序逻辑复制槽在处理到虚拟事务日志时可以根据当前日志的CSN推进复制槽。

前提条件

  • 逻辑日志目前从DN中抽取,如果进行逻辑复制,应使用SSL连接,因此需要保证相应DN上的GUC参数ssl设置为on。
    说明:

    为避免安全风险,请保证启用SSL连接。

  • 设置GUC参数wal_level为logical。
  • 设置GUC参数max_replication_slots>=每个节点所需的(物理流复制槽数+备份槽数+逻辑复制槽数)。
    说明:
    关于逻辑复制槽数,请按如下规则考虑。
    • 一个逻辑复制槽只能解码一个Database的修改,如果需要解码多个Database,则需要创建多个逻辑复制槽。
    • 如果需要多路逻辑复制同步给多个目标数据库,在源端数据库需要创建多个逻辑复制槽,每个逻辑复制槽对应一条逻辑复制链路。
    • 同一实例上,最多支持同时开启20个逻辑复制槽进行解码。
  • 仅限初始用户和拥有REPLICATION权限的用户进行操作。三权分立关闭时数据库管理员可进行逻辑复制操作,三权分立开启时不允许数据库管理员进行逻辑复制操作。

注意事项

  • 逻辑解码支持DDL约束请参见规格约束
  • 在执行特定的DDL语句(如普通表truncate或分区表exchange)时,可能造成解码数据丢失。
  • 当使用逻辑复制功能时,建议事务内DDL数量不超过1000个;逻辑解码任务中DDL产生的数据占据的内存,在解码到DDL所在事务的提交日志时释放。
  • 不支持数据页复制的DML解码。
  • 当执行DDL语句(如alter table)后,该DDL语句前尚未解码的物理日志可能会丢失。
  • 单条元组大小不超过1GB,考虑解码结果可能大于插入数据,因此建议单条元组大小不超过500MB。
  • GaussDB支持解码的数据类型为:INTEGER、BIGINT、SMALLINT、TINYINT、SERIAL、SMALLSERIAL、BIGSERIAL、FLOAT、DOUBLE PRECISION、BOOLEAN、BIT(n)、BIT VARYING(n)、DATE、TIME[WITHOUT TIME ZONE]、TIMESTAMP[WITHOUT TIME ZONE]、CHAR(n)、VARCHAR(n)、TEXT、CLOB(解码成TEXT格式)。
  • 对于浮点型数据,解码结果显示精度extra_float_digits配置为3。
  • 支持M-Compatibility数据库的DML逻辑解码,解码数据类型如下:
    • 整型:tinyint(m)、smallint(m)、mediumint(m)、bigint(m)、int(m)/integer、bool/boolean。
    • 浮点型:float(m,d)、double(m,d)。
    • 定点型:decimal(m,d)、numeric(m,n)。
    • BIT类型:BIT。
    • 字符串二进制类型:char(n)、varchar(n)、binary、varbinary。
    • 文本类型:tinytext、text、mediumtext、longtext。
    • 日期类型:data、time、timestamp、year。
    • 大对象类型:tinyblob、blob、mediumblob、longblob。
    • 数据类型属性:unsigned(部分支持)、zerofil(不支持)。
    • 不支持类型:enum枚举类型、set类型。
  • 逻辑复制槽名称必须小于64个字符,仅支持小写字母、数字以及_?-.字符,且不支持“.”或“..”单独作为复制槽名称。
  • 当逻辑复制槽所在数据库被删除后,这些复制槽变为不可用状态,需要用户手动删除。
  • 对多库的解码需要分别在库内创建流复制槽并开始解码,每个库的解码都需要单独扫描一遍日志。
  • 不支持强切,强切后需要重新全量导出数据。
  • 备机解码时,switchover和failover时可能出现解码数据变多,需用户手动过滤。Quorum协议下,switchover和failover选择升主的备机,需要与当前主机日志同步。
  • 不允许主备,多个备机同时使用同一个复制槽解码,否则会产生数据不一致的情况。
  • 只支持主机创建删除复制槽。当删除的复制槽为最后一个复制槽时,删除完成后会产生告警"replicationSlotMinLSN is INVALID_WAL_REC_PTR!!!"和"replicationSlotMaxLSN is INVALID_WAL_REC_PTR!!!"。
  • 数据库故障重启或逻辑复制线程重启后,解码数据可能存在重复,用户需手动过滤。
  • 计算机内核故障后,解码可能存在乱码,需手动或自动过滤。
  • 请确保在创建逻辑复制槽过程中未启动长事务,启动长事务会阻塞逻辑复制槽的创建。
  • 不支持interval partition表DML复制。
  • 不支持全局临时表的DML解码。
  • 不支持本地临时表的DML解码。
  • M兼容性下,不支持SELECT INTO语句的解码。非M兼容性下,SELECT INTO语句会解码创建目标表的DDL操作,数据插入的DML操作不解码。
  • 禁止在使用逻辑复制槽时在其他节点对该复制槽进行操作,删除复制槽的操作需在该复制槽停止解码后执行。
  • 为解析某个astore表的UPDATE和DELETE语句,需为此表配置REPLICA IDENTITY属性,在此表无主键时需要配置为FULL,具体配置方式请参考《开发指南》中“SQL参考 > SQL语法 > ALTER TABLE”章节中“REPLICA IDENTITY { DEFAULT | USING INDEX index_name | FULL | NOTHING }”字段。
  • 基于目标库可能需要源库的系统状态信息考虑,逻辑解码仅自动过滤模式'pg_catalog'和'pg_toast'下OID小于16384的系统表的逻辑日志。若目标库不需要复制其他相关系统表的内容,逻辑日志回放过程中需要对相关系统表进行过滤。
  • 在开启逻辑复制的场景下,如需创建包含系统列的主键索引,必须将该表的REPLICA IDENTITY属性设置为FULL或是使用USING INDEX指定不包含系统列的、唯一的、非局部的、不可延迟的、仅包括标记为NOT NULL的列的索引。
  • 若一个事务的子事务过多导致落盘文件过多,退出解码时需执行SQL函数pg_terminate_backend(逻辑解码的walsender线程id)来手动停止解码,而且退出时延增加约为1分钟/30万个子事务。因此在开启逻辑解码时,若一个事务的子事务数量达到5万时,会打印一条WARNING日志。
  • 当逻辑复制槽处于非活跃状态,且设置GUC参数enable_xlog_prune=on、enable_logicalrepl_xlog_prune=on、max_size_for_xlog_retention为非零值,且备份槽或逻辑复制槽导致保留日志段数已超过GUC参数wal_keep_segments,同时其他复制槽并未导致更多的保留日志段数时,如果max_size_for_xlog_retention大于0且当前逻辑复制槽导致保留日志的段数(每段日志大小为16MB)超过max_size_for_xlog_retention,或者max_size_for_xlog_retention小于0且磁盘使用率达到(-max_size_for_xlog_retention)/100,当前逻辑复制槽会强制失效,其restart_lsn将被设置为7FFFFFFF/FFFFFFFF。该状态的逻辑复制槽不参与阻塞日志回收或系统表历史版本的回收,但仍占用复制槽的限制数量,需要手动删除。
  • 备机解码启动后,向主机发送复制槽推进指令后会占用主机上对应的逻辑复制槽(即标识为活跃状态)。在此之前主机上对应逻辑复制槽为非活跃状态,此状态下如果满足逻辑复制槽强制失效条件则会被标记为失效(即restart_lsn将被设置为7FFFFFFF/FFFFFFFF),备机将无法推进主机复制槽,且备机回放完成复制槽失效日志后当前复制槽的备机解码断开后将无法重连。
  • 不活跃的逻辑复制槽将阻塞WAL日志回收和系统表元组历史版本清理,导致磁盘日志堆积和系统表扫描性能下降,因此不再使用的逻辑复制槽请及时清理。
  • 通过协议连接DN创建逻辑复制槽仅支持LSN序复制槽。
  • 解码使用JSON格式输出时不支持数据列包含特殊字符(如'\0'空字符),解码输出列内容将出现被截断现象。
  • 不支持无日志表的DML解码。
  • 当同一事务产生大量需要落盘的子事务时,同时打开的文件句柄可能会超限,需将GUC参数max_files_per_process配置成大于子事务数量上限的两倍。
  • 不支持账本数据库功能,当前版本如果开启解码任务的数据库中有关于账本数据库的DML操作,则解码结果中会包含hash列,从而导致回放失败。
  • 不支持M-Compatibility数据库的DDL解码(对M-Compatibility数据库使用逻辑解码功能时,enable-ddl-decoding选项必须关闭)。

SQL函数解码性能

在Benchmarksql-5.0的100warehouse场景下,采用pg_logical_slot_get_changes时:
  • 单次解码数据量4K行(对应约5MB~10MB日志),解码性能0.3MB/s~0.5MB/s。
  • 单次解码数据量32K行(对应约40MB~80MB日志),解码性能3MB/s~5MB/s。
  • 单次解码数据量256K行(对应约320MB~640MB日志),解码性能3MB/s~5MB/s。
  • 单次解码数据量再增大,解码性能无明显提升。

如果采用pg_logical_slot_peek_changes + pg_replication_slot_advance方式,解码性能相比采用pg_logical_slot_get_changes时要下降30%~50%。

我们使用cookie来确保您的高速浏览体验。继续浏览本站,即表示您同意我们使用cookie。 详情

文档反馈

文档反馈

意见反馈

0/500

标记内容

同时提交标记内容