PG逻辑复制的REPLICA IDENTITY几种设置

news2024/11/14 3:59:47

前两天同事问了一个PG的错误,创建一张普通表,insert插入正常,但是执行update和delete时,提示这个错误,

代码语言:javascript

复制

SQL 错误 [55000]: ERROR: cannot delete from table "temp_tb" because it does not have a replica identity and publishes updates
Hint: To enable updating from the table, set REPLICA IDENTITY using ALTER TABLE.


SQL 错误 [55000]: ERROR: cannot delete from table "temp_tb" because it does not have a replica identity and publishes deletes
Hint: To enable deleting from the table, set REPLICA IDENTITY using ALTER TABLE.

PG确实接触少,顺着错误,捋一捋,首先是PG版本,是12,

代码语言:javascript

复制

SELECT current_setting('server_version_num');

从报错来看,为了能执行更新和删除操作,需要用ALTER TABLE设置REPLICA IDENTITY,其实讲的很清楚,根据一些资料,

如果一张表缺少主键,并且涉及到复制,就需要执行这条语句,

代码语言:javascript

复制

ALTER TABLE temp_tb REPLICA IDENTITY FULL;

执行完成,确实能正常更新和删除了。但这是为什么?

首先了解下,逻辑复制的概念。逻辑复制是PostgreSQL V10重量级新特性,支持内置的逻辑复制。在10版本之前,虽然没有内置的逻辑复制,也可以通过其它方式实现,例如触发器、自定义脚本实现表级别同步,另外也可以通过外部工具Londiste3实现。从9.4版本开始,PostgreSQL就支持逻辑复制了,只是一直没有将其引入内核。可以针对同一个数据库实例,同时使用逻辑复制和物理复制,因为他们都是基于REDO的。

逻辑复制的应用场景,可基于表级别复制,是一种粒度可细的复制,主要用在以下场景,

(1) 满足业务上需求,实现某些指定表数据同步。

(2) 报表系统,采集报表数据。

(3) PostgreSQL 跨版本数据同步。

(4) PostgreSQL 大版本升级。

(5) 可从多个上游服务器,做数据的聚集和合并。

逻辑复制原理,使用发布者/订阅者模型,使用订阅复制槽技术,可并行的传输WAL日志,通过在订阅端回放WAL日志中的逻辑条目,保持复制表的数据同步,注意这里不是“SQL”复制,而是复制SQL操作的结果。

逻辑复制的主要组成

(1) publication - 发布

可以在任何物理复制主机上定义发布;定义发布的节点称为发布者。发布是从一个表或一组表中生成的一组更改,也可能被描述为更改集或复制集。每个发布只存在于一个数据库中。发布与模式不同,不影响表格的访问方式;如果需要,每张表可以添加到多个发布。发布目前可能只包含表;对象必须显式添加, 除非为ALL TABLES创建了一个发布。发布可以选择将它们所产生的改变限制在INSERT,UPDATE和DELETE的任意组合上,类似于触发器。默认情况下,复制所有操作类型。

(2) subscription - 订阅

就是订阅变更的内容。

(3) Replication Slots - 复制槽(发布端)

每个(活动)订阅都从远程(发布)端的复制槽接收更改。通常,使用CREATE SUBSCRIPTION创建订阅时会自动创建远程复制槽,使用DROP SUBSCRIPTION删除订阅时会自动删除该槽。复制槽提供了一种自动化的方法来确保主控机在所有的后备机收到WAL段之前不会移除它们,主库随时知道从库应用WAL的情况,哪怕从库掉线,主库依然保留WAL日志。这种机制的缺点是,如果从库掉线很久, 那么主库的WAL日志会一直保留以至于撑暴硬盘,这时监控需要做到位。

关于发布端和订阅端

(1) 发布端

逻辑复制的前提是将数据库wal_level参数设置成logical。

源库上逻辑复制的用户必须具有replicatoin或superuser角色。

逻辑复制目前仅支持数据库表逻辑复制,其它对象例如函数、视图不支持。

逻辑复制支持DML(UPDATE、INSERT、DELETE)操作,TRUNCATE 和 DDL 操作不支持。

需要发布逻辑复制的表,须配置表的REPLICA IDENTITY特性。

一个数据库中可以有多个publication,通过pg_publication查看。

允许一次发布所有表,语法,

代码语言:javascript

复制

CREATE PUBLICATION alltables FOR ALL TABLES;

(2) 订阅端

订阅节点需要指定发布者的连接信息。

一个数据库中可以有多个订阅者。

可以使用enable/disable启用/暂停该订阅。

发布节点和订阅节点表的模式名、表名必须一致,订阅节点允许表有额外字段。

发布节点增加表名,订阅节点需要执行:

代码语言:javascript

复制

ALTER SUBSCRIPTION sub1 REFRESH PUBLICATION

被复制的表上最好有主键约束;如果没有,必须执行,

代码语言:javascript

复制

ALTER TABLE reptest REPLICA IDENTITY FULL;

REPLICA IDENTITY,复制标识,共有4种配置模式,分别为,

(1) 默认模式(default):

非系统表采用的默认模式,如果有主键,则用主键列作为身份标识,否则用完整模式。

(2) 索引模式(index):将某一个符合条件的索引中的列,用作身份标识。

(3) 完整模式(full):将整行记录中的所有列作为复制标识(类似于整个表上每一列共同组成主键)。

(4) 无身份模式(nothing):不记录任何复制标识,这意味着UPDATE|DELETE操作无法复制到订阅者上。

表改复制标识可以通过ALTER TABLE进行修改。

代码语言:javascript

复制

ALTER TABLE tbl REPLICA 
IDENTITY { DEFAULT | USING INDEX index_name | FULL | NOTHING };

具体有四种形式,

(1) 使用主键,如果没有主键则为FULL,

代码语言:javascript

复制

ALTER TABLE t_normal REPLICA IDENTITY DEFAULT;

(2) 使用整行作为标识,

代码语言:javascript

复制

ALTER TABLE t_normal REPLICA IDENTITY FULL;

(3) 使用唯一索引,

代码语言:javascript

复制

ALTER TABLE t_normal REPLICA IDENTITY USING INDEX t_normal_v_key;

(4) 不设置复制标识,

代码语言:javascript

复制

ALTER TABLE t_normal REPLICA IDENTITY NOTHING;

如果没有任何复制标识,可以将复制标识设置为FULL,也就是把整个行当作复制标识。但是,使用FULL模式的复制标识效率很低,所以这种配置只能是保底方案,或者用于很小的表。因为每一行修改都需要在订阅者上执行全表扫描,很容易将订阅者拖垮。

模拟创建过程,并证明下这个库像上面所说设置了相关的参数配置。

1. 创建表,插入正常,更新和删除,就会提示55000错误,

代码语言:javascript

复制

CREATE TABLE temp_tb (
  code varchar(32) COLLATE pg_catalog.default primary key,
  name varchar(32) COLLATE pg_catalog.default,
  aliases jsonb
)
;

执行如下语句,更新和删除正常,

代码语言:javascript

复制

ALTER TABLE reptest REPLICA IDENTITY FULL;

2. 查询当前表的复制属性,返回值是logical,说明设置了逻辑复制,

代码语言:javascript

复制

select setting from pg_settings where name='wal_level';

3. 查询表当前复制标识,返回值是f,说明这张表确实设置了复制,而且是基于所有列的,

代码语言:javascript

复制

select relreplident from pg_class where relname='temp_tb';

返回值说明, 

d = 默认(主键,如果存在)

n = 无

f = 所有列

i = 索引的indisreplident被设置或者为默认

4. 查询视图,temp_tb隶属于test_publication这个发布,

代码语言:javascript

复制

select * from pg_publication_tables where tablename='temp_tb';
pubname             schemaname  tablename
test_publication    public      temp_tb

5. 检索这个发布,

代码语言:javascript

复制

select * from pg_publication;

puballtables确实勾选了,

说明这个发布,发布所有表中的所有更改,

代码语言:javascript

复制

CREATE PUBLICATION test_publication FOR ALL TABLES;

pg_publication的字段定义,

因此,可以问创建test_publication的人有什么意图,或者将逻辑复制logical更改成物理复制,如果逻辑复制是必须的,可能有效的方式,就是设置主键,其实从数据库应用设计开发的规范角度,无特殊情况,还是要为表创建一个主键,而且推荐是无意义的类型,例如序列。

参考链接,

http://postgres.cn/docs/12/catalog-pg-publication.html

https://stackoverflow.com/questions/56000702/cannot-update-table-temp-table-because-it-does-not-have-a-replica-identity-and-p

https://www.pgfans.cn/a?id=194

http://postgres.cn/docs/12/logical-replication-publication.html

http://postgres.cn/docs/12/sql-createpublication.html

https://www.bbsmax.com/A/GBJrvBkZJ0/

https://pigsty.cc/zh/blog/2021/03/03/pg%E5%A4%8D%E5%88%B6%E6%A0%87%E8%AF%86%E8%AF%A6%E8%A7%A3replica-identity/

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flutter 小技巧之 Shader 实现酷炫的粒子动画

在之前的《不一样的思路实现炫酷 3D 翻页折叠动画》我们其实介绍过:如何使用 Shader 去实现一个 3D 的翻页效果,具体就是使用 Flutter 在 3.7 开始提供 Fragment Shader API ,因为每个像素都会过 Fragment Shader ,所以我们可以通…

<项目代码>YOLOv7 草莓叶片病害识别<目标检测>

YOLOv7是一种单阶段(one-stage)检测算法,它将目标检测问题转化为一个回归问题,能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法(如Faster R-CNN),YOLOv7具有更高的…

一文读懂什么是RAG?附MindSpore和MindNLP实现的TinyRAG框架

什么是RAG? 首先我们给出RAG的定义:RAG(Retrieval-Augmented Generation)技术是一种结合了信息检索(Retrieval)和生成式模型(Generation)的人工智能方法。对于用户的Query&#xff…

字节、快手、Vidu“打野”升级,AI视频小步快跑

文|白 鸽 编|王一粟 继9月份版本更新之后,光锥智能从生数科技联合创始人兼CEO唐家渝朋友圈获悉,Vidu大模型将于本周再次进行版本升级,Vidu-1.5版本即将上线。 此版本更新方向仍是重点延伸大模型的泛化能力和主体…

matlab建模入门指导

本文以水池中鸡蛋温度随时间的变化为切入点,对其进行数学建模并进行MATLAB求解,以更为通俗地进行数学建模问题入门指导。 一、问题简述 一个煮熟的鸡蛋有98摄氏度,将它放在18摄氏度的水池中,五分钟后鸡蛋的温度为38摄氏度&#x…

React Query在现代前端开发中的应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 React Query在现代前端开发中的应用 React Query在现代前端开发中的应用 React Query在现代前端开发中的应用 引言 React Query …

汇总常用的114款AI视频创作工具,堪称运营神器,收藏备用!

随着AI工具的使用起来起广泛,国内各个互联网大厂都开始在圈内出围。过去我们写文案、做视频、拍视频、剪辑视频、画漫画、处理图片等,都需要手工一点一点地精雕细琢。现在通过AI工具,零基础也能做出很多精致的作品。 前面我在上个月的28号分…

在vue中,完成@wangeditor/editor组件的大数据量加载,解决卡顿

背景 简单说一下需求,一个页面中只存在一个Editor组件,但是需要通过选择不同类型展示不同的content的数据,不过直接通过提供的Editor组件加载的时候,在数据量大(测试数据226KB)的情况下, 切换类…

通义千问API调用测试 (colab-python,vue)

文章目录 代码(来自官网)colab中用python测试Qwen2.5在官网上查看并确定过期时间这里看到我的免费额度到25年5月在同一个页面,点击API示例 前端调用直接在前端调用的优缺点以vue为例(代码是基于官网node.js的代码转换而来&#xf…

使用 Elasticsearch 构建食谱搜索(一)

作者:来自 Elastic Andre Luiz 了解如何使用 Elasticsearch 构建基于语义搜索的食谱搜索。 简介 许多电子商务网站都希望增强其食谱搜索体验。正确使用语义搜索可以让客户根据更自然的查询(例如 “something for Valentines Day - 情人节的礼物” 或 “…

微服务各组件整合

nacos 第一步&#xff0c;引入依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency> 第二步&#xff0c;增加配置 spring:application:name: …

【大数据学习 | HBASE高级】hive操作hbase

一般在查询hbase的数据的时候我们可以直接使用hbase的命令行或者是api进行查询就行了&#xff0c;但是在日常的计算过程中我们一般都不是为了查询&#xff0c;都是在查询的基础上进行二次计算&#xff0c;所以使用hbase的命令是没有办法进行数据计算的&#xff0c;并且对于hbas…

modbus协议 Mthings模拟器使用

进制转换 HEX 16进制 (0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F表示0-15) dec 10进制 n(16进制) -> 10 abcd.efg(n) d*n^0 c*n^1 b*n^2 a*n^3 e*n^-1 f*n^-2 g*n^-3&#xff08;10&#xff09; 10 -> n(16进制) Modbus基础概念 高位为NUM_H&…

列表(list)

一、前言 本次博客主要讲解 list 容器的基本操作、常用接口做一个系统的整理&#xff0c;结合具体案例熟悉自定义内部排序方法的使用。如有任何错误&#xff0c;欢迎在评论区指出&#xff0c;我会积极改正。 二、什么是list list是C的一个序列容器&#xff0c;插入和删除元素…

Sam Altman:年底将有重磅更新,但不是GPT-5!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…

zabbix监控端界面时间与服务器时间不对应

1. 修改系统时间 # tzselect Please select a continent, ocean, "coord", or "TZ".1) Africa2) Americas3) Antarctica4) Asia5) Atlantic Ocean6) Australia7) Europe8) Indian Ocean9) Pacific Ocean 10) coord - I want to use geographical coordina…

大数据新视界 -- 大数据大厂之 Impala 性能提升:高级执行计划优化实战案例(下)(18/30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

P2356 弹珠游戏

铁子们好呀&#xff0c;博主好久没更新了&#xff0c;今天给大家更新一道编程题&#xff01;&#xff01;&#xff01; 题目链接如下&#xff1a;P2356 弹珠游戏 好&#xff0c;接下来&#xff0c;我将从三个方面讲解这道例题。分别是 题目解析算法原理代码实现 文章目录 1.题…

项目管理十大知识领域:如何提升项目执行力

项目管理是一门复杂的学科&#xff0c;涉及到多个领域的知识与技能。有效的项目管理不仅能够确保项目按时、按质、按预算完成&#xff0c;还能提升团队协作、提高效率&#xff0c;甚至在面对风险和变化时保持项目的稳定性和成功率。项目管理十大知识领域是构建成功项目的基石&a…

【miniMax开放平台-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…