【GaussDB】在逻辑复制中剔除指定用户的事务

1. 需求背景

在逻辑复制中,期望对源端指定用户的所有操作不复制到目标端。然而WAL日志中没有用户信息可用于过滤,因此考虑结合审计日志来实现这一需求。

2. 解决方案

2.1 配置审计日志

首先需要开启事务号记录和指定用户的全量审计:

--开启记录事务号 
gs_guc reload -c "audit_xid_info=1"--配置指定用户开启全量审计
gs_guc reload -c "full_audit_users='ogadmin'"

2.2 查询指定用户的事务号

通过以下SQL查询指定用户的所有事务号:

--查询指定用户的所有事务号
with t as (
select case when substr(detail_info,1,3)='xid' and substr(detail_info,4,3)<>'=NA'  then regexp_replace(detail_info,'xid=(\d+),.*','\1') end as transactionid, * from gs_query_audit('19000101','30000101') where username='ogadmin' )select * from t where transactionid is not null;

查询结果示例:

transactionidtimetyperesultuseridusernamedatabaseclient_conninfoobject_namedetail_infonode_namethread_idlocal_portremote_port
9285062025-06-26 13:34:22.000 +0800ddl_tableok16728ogadminpostgresgsql@[local]t7xid=928506, create table t7(a int);primary140316575266560@8042312624752037456null
9288102025-06-26 13:40:41.000 +0800ddl_schemaok16728ogadminpostgresgsql@[local]s2xid=928810, create schema s2;primary140316575266560@8042316410791307456null
9290012025-06-26 13:44:46.000 +0800dml_actionok16728ogadminpostgresgsql@[local]t7xid=929001, insert into t7 values (1);primary140316575266560@8042318866633567456null

2.3 审计日志事务号提取问题分析

GaussDB的ADM_AUDIT_TRAIL视图中已尝试截取出事务号,但该视图的SQL存在问题:

CASEWHEN "position"(a.detail_info, 'xid = NA'::text) = 1 AND "position"(a.detail_info, 'xid'::text) = 1 THEN NULL::textELSE substr(a.detail_info, "position"(a.detail_info, '='::text) + 1, "position"(a.detail_info, ','::text) - "position"(a.detail_info, '='::text) - 1)
END AS transactionid

主要问题:

  1. 实际日志中是xid=NA而非xid = NA,导致第一段条件永远无法匹配
  2. 当detail_info中存在其他=号时(如配置guc参数),会错误截取非事务号内容(如'bind_procedure_searchpath

因此需要自行从原始detail_info中截取事务号。

3. 方案实施挑战

3.1 关键问题分析

实施此方案需要解决以下核心问题:

  1. 审计日志完整性:如何确保审计日志记录是完整的?
  2. 逻辑嵌入:如何将剔除事务的逻辑嵌入到原有的逻辑复制程序中去?
  3. 操作顺序:如何确保各项操作的先后顺序?
  4. 资源消耗:如何减少重复查询审计日志的资源消耗(可否直接基于操作系统的存储接口去监控审计日志文件的变化)?

4. 替代方案:基于事务标签的过滤机制

PostgreSQL在双向复制中,通过在事务上标记名称来区分源端事务,防止循环复制,GaussDB同样具有此能力:

gaussdb 已移除pg_recvlogical二进制程序,仅保留了相关接口,为测试方便,这里实际是使用MogDB测试的
# 服务端
--创建一个复制槽
pg_recvlogical -d postgres -S test_slot --create--创建复制源标签
select pg_replication_origin_create('maintain_node');# 采集端
--开启流式解码
pg_recvlogical -d postgres -S test_slot --start -v -f -## sql执行客户端
--执行一些SQL,采集端可以捕获到数据--绑定当前会话标签
select pg_replication_origin_session_setup ('maintain_node');---执行一些SQL,采集端没有捕获到数据--解绑当前会话标签
select pg_replication_origin_session_reset ();--执行一些SQL,采集端可以捕获到数据# 环境清理
pg_recvlogical -d postgres -S test_slot --drop
select pg_replication_origin_drop('maintain_node');

原理:逻辑复制输出插件(如pgoutput、pg_recvlogical或test_decoding)默认会忽略携带复制源标签的事务,因为这些事务被视为"已同步过的数据",避免重复复制。

可以通过创建登录事件触发器,针对指定用户的登录自动打上复制源标签,从而实现指定的用户事务不复制。

5. 推荐方案:历史表归档策略

我个人不认为数据复制软件是用来处理这种归档操作的。比较通用的方式是:

  1. 源库对需要归档的表,在当前库建立历史表
  2. 归档时将需要归档的数据插入到历史表,然后删除当前表已归档的数据
  3. 对于历史表的修改操作(一般只有运维delete或truncate),配置同步规则,不进行数据删除的同步
  4. 可新建一个schema存放历史表,便于在复制软件中进行规则配置
  5. 复制软件针对历史表进行增量复制,对于实时表进行全量复制(其实这是ETL该干的事了)

虽然插入历史表会产生额外IO,可能使数据归档操作时间翻倍,但相比剔除事务不同步的方式,历史表方式更加安全,避免剔除事务时遗漏某些关键事务。

6.总结

本文探讨了在GaussDB中实现指定用户操作不复制到目标端的三种方案:

  1. 基于审计日志的事务过滤
    审计日志方案通过提取事务号实现过滤,但面临审计日志完整性、逻辑嵌入复杂性、操作顺序保证和资源消耗等挑战。虽然技术上可行,但实施复杂度较高,且存在事务遗漏风险。
  2. 基于逻辑复制标签的过滤
    基于逻辑复制标签实现过滤,技术上可行,但打标签这个附加操作需要在执行sql前执行(除非使用触发器,但触发器属于高风险操作,不建议使用),如果漏执行,将会存在错误覆盖目标库的风险。
  3. 基于历史表的归档策略
    历史表归档方案通过在源库建立历史表存储归档数据,配置复制规则排除历史表的删除操作,虽然会增加IO开销,但实现简单、安全性高,避免了事务过滤可能带来的风险。

推荐实践:采用历史表归档策略,新建独立schema存放历史表,便于复制规则配置。这种方法既满足了数据归档需求,又保证了复制数据的安全性和一致性,是更可靠的长期解决方案。

  • 本文作者: DarkAthena
  • 本文链接: https://www.darkathena.top/archives/GaussDB-Filtering-Out-Specified-User-s-Transactions-in-Logical-Replication
  • 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/920599.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/920599.shtml
英文地址,请注明出处:http://en.pswp.cn/news/920599.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C/C++---预定义常量

在C/C开发中&#xff0c;预定义常量是编译器与标准库提供的“隐形工具集”&#xff0c;无需开发者显式定义&#xff0c;却在跨平台兼容、调试定位、数值计算安全等场景中发挥核心作用。这些常量涵盖编译环境标识、语言标准判断、代码定位信息、数值边界限制等多个维度&#xff…

嵌入式学习笔记--LINUX系统编程--DAY03进程控制

1.进程概述进程和程序的区别程序&#xff1a;程序是存储在存储介质上的一个可执行文件---静态的进程&#xff1a;进程是程序的执行实例。可以说进程就是正在执行的程序。程序是一些指令的集合&#xff0c;而进程是程序的执行过程&#xff0c;这个过程的状态是变化的&#xff0c…

【90页PPT】新能源汽车数字化转型SAP解决方案(附下载方式)

篇幅所限&#xff0c;本文只提供部分资料内容&#xff0c;完整资料请看下面链接 https://download.csdn.net/download/2501_92808859/91777751 资料解读&#xff1a;《新能源汽车数字化转型SAP解决方案》 ​​详细资料请看本解读文章的最后内容​​ 在全球汽车产业加速向电…

LSM6DS3姿态芯片和LIS2MD磁力计芯片数据读取(stm32)

上代码main.c 代码示例#include "lsm6ds3.h" #include "lis2md.h"int16_t Acc[3] {0}, GYO[3] {0},Mag[3] {0};int main(void) {I2C_GPIO_Config(); //配置IIC使用端口Delayms(500); //延时Lsm6ds3_Init( ); …

数据传输安全-IKE工作过程

在前面的课程中&#xff0c;你已经掌握了&#xff1a;IPSec的目标&#xff1a;提供机密性、完整性、身份认证、防重放。IPSec的执行者&#xff1a;AH和ESP协议。IPSec的规则手册&#xff1a;SA&#xff08;安全关联&#xff09;&#xff0c;包含了所有保护参数&#xff08;算法…

翻译-同位协同克里金算法

同点协同克里金法 副标题: 地统计学课程 主要内容: 同点协同克里金法 摘要 同点协同克里金法是一种多元地统计学技术,用于借助次要变量(协变量)来估算主要变量。本课程介绍了同点协同克里金法,并将其与简单克里金法和简单协同克里金法进行了比较。通过一个假设的案例…

国家统计局数据分析01——机器学习

我们前面爬取过国家统计局数据爬取——机器学习-CSDN博客的数据,我们接下来就对爬取的数据进行分析。 这是一个完整的数据分析代码,主要用于加载、清洗和探索政府统计数据。让我为你详细解释每个部分: 1. 导入必要的库 import pandas as pd # 数据处理和分析的核心库 imp…

【杂谈】-混沌理论能否赋予机器差异化思考能力?

混沌理论能否赋予机器差异化思考能力&#xff1f; 文章目录混沌理论能否赋予机器差异化思考能力&#xff1f;1、AI与结构化思维的本质特征2、人类思维的独特优势3、混沌算法的创新实践4、混沌算法的作用机理5、混沌算法的应用实例5.1 音乐创作革新5.2 图像生成突破5.3 科学发现…

jQuery.print插件:网页内容打印与导出指南

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;在网页开发中&#xff0c;为了实现内容的打印或导出&#xff0c;可以利用jQuery.print插件&#xff0c;该插件提供了一个简易的解决方案&#xff0c;尤其适用于表格数据。本指南详细介绍了如何使用jQuery.print…

w嵌入式分享合集125

自己的原文哦~ https://blog.51cto.com/whaosoft/14165530 一、常用电路基础公式 1.欧姆定律计算 计算电阻电路中电流、电压、电阻和功率之间的关系。 欧姆定律解释了电压、电流和电阻之间的关系&#xff0c;即通过导体两点间的电流与这两点间的电势差成正比。说…

Docker 核心技术:Union File System

大家好&#xff0c;我是费益洲。UnionFS 作为 Docker 的技术核心之一&#xff0c;实现了 Docker 镜像的分层轻量化构建、容器资源的隔离复用等目的。本文将从核心原理、主流技术实现简单介绍 UnionFS。 核心原理 Linux 的联合文件系统&#xff08;Union File System&#xff0c…

MongoDB 文档模型设计:JSON 结构的灵活性与陷阱

MongoDB 文档模型设计&#xff1a;JSON 结构的灵活性与陷阱第一章&#xff1a;MongoDB 文档模型基础与核心特性1.1 MongoDB 文档模型的哲学基础1.2 文档模型的优势分析1.3 与关系型数据库的深度对比第二章&#xff1a;文档设计模式与最佳实践2.1 嵌入式模式&#xff08;Embeddi…

基于SQL大型数据库的智能问答系统优化

一、食用指南 基于SQL数据库的智能问答系统设计与实现介绍了在数据库中创建表格数据问答系统的基本方法&#xff0c;我们可以向该系统提出关于数据库数据的问题&#xff0c;最终获得自然语言答案。 为了针对数据库编写有效的查询&#xff0c;我们需要向模型提供表名、表结构和…

【计算机网络】前端基础知识Cookie、localStorage、sessionStorage 以及 Token

一、先搞懂&#xff1a;为什么需要这些“存储工具”&#xff1f; 网页是“无状态”的——比如你登录一个网站&#xff0c;浏览器和服务器每次通信都是独立的&#xff0c;服务器默认记不住你是谁。为了让服务器“记住”用户状态&#xff08;比如登录状态、购物车内容&#xff09…

【语法】【C+V】【mermaid】本身常用图表类型用法快查【CSDN不支持,VSCODE可用】

文章目录 Mermaid 简介Mermaid 由三部分组成Mermaid 的使用方法复杂图表结构的技巧饼图简介饼图语法饼图示例雷达图简介雷达图语法雷达图语法细节标题轴曲线选项 雷达图示例时间线简介时间线语法时间线示例树形图简介树形图语法树形图示例数据包图简介数据包图语法1&#xff1a…

不止效率工具:AI 在文化创作中如何重构 “灵感逻辑”?

一、引言1.1 AI 创作的崛起在当今时代&#xff0c;AI 技术在文化创作领域的迅猛发展已成为不可忽视的现象。从文字创作领域中&#xff0c;AI 能够快速生成小说、诗歌&#xff0c;一些新闻媒体也开始运用 AI 撰写新闻稿件&#xff1b;到视觉艺术方面&#xff0c;AI 绘画软件能依…

软考-系统架构设计师 专家系统(ES)详细讲解

个人博客&#xff1a;blogs.wurp.top 一、ES的核心概念与价值 1. 什么是专家系统&#xff08;ES&#xff09;&#xff1f; 专家系统是一种模拟人类专家解决特定领域问题的智能计算机程序系统。它运用特定领域内大量专家水平的知识和经验&#xff0c;进行推理和判断&#xff…

Vue3+TS+Element-Plus+el-tree创建树节点

1、一级树应用效果&#xff1a;代码&#xff1a;MaterialCategory.vue<script setup lang"ts" name"MaterialCategory"> ...... // 创建树&#xff08;一级树&#xff09; const createTree (dataList: IMaterialCategory[]) > {// 将原始数据转…

C++基础(④链表反转(链表 + 迭代 / 递归))

链表反转&#xff08;链表 迭代 / 递归&#xff09; 题目描述&#xff1a;给你单链表的头节点 head&#xff0c;请你反转链表&#xff0c;并返回反转后的链表头节点。 示例&#xff1a;输入链表 1→2→3→4→5 → 输出 5→4→3→2→1。 思路提示&#xff1a;迭代法&#xff1a…

面向企业级产品开发的自动化脚本实战

引言&#xff1a; 在产品开发团队中&#xff0c;设计师、产品经理和工程师之间的协作常常伴随着大量重复性工作&#xff1a;手动整理设计稿链接、更新产品需求文档、同步项目状态...这些工作不仅耗时&#xff0c;还容易出错。本文将带你编写一个Python脚本&#xff0c;自动化这…