postgresql复制标识问题
问题:
pgsql数据库报错:
ERROR: cannot delete from table "xxxxx" because it does not have a replica identity and publishes update
解决方法:
ALTER TABLE xxxxx REPLICA IDENTITY FULL;
原因分析:
当前度娘搜到的最多的是“PostgreSQL不喜欢缺少复制主键的表,即使是临时表
”,也是来自于一个网友的帖子
由于对postgresql数据的原理不太理解,所有对这个回复还是比较懵逼的,所有就查询整理了一下postgresql数据库复制的相关内容;
===postgresql逻辑复制-复制标识
逻辑复制
(Logical Replication),是一种根据数据对象的 复制标识
(Replica Identity)(通常是主键)复制数据对象及其变化的方法。
逻辑复制
这个术语与 物理复制
相对应,物理复制使用精确的块地址与逐字节复制,而逻辑复制则允许对复制过程进行精细的控制。
逻辑复制
基于 发布(Publication)
与 订阅(Subscription)模
型:
1)一个 发布者(Publisher)上可以有多个发布,一个 订阅者(Subscriber)上可以有多个 订阅 。
2)一个发布可被多个订阅者订阅,一个订阅只能订阅一个发布者,但可订阅同发布者上的多个不同发布。
针对一张表的逻辑复制通常是这样的:订阅者获取发布者数据库上的一个快照,并拷贝表中的存量数据。一旦完成数据拷贝,发布者上的变更(增删改清)就会实时发送到订阅者上。订阅者会按照相同的顺序应用这些变更,因此可以保证逻辑复制的事务一致性。这种方式有时候又称为 事务性复制(transactional replication)
。
这个业务逻辑使用场景还是比较多得,平时在工作中也有同样的使用场景,需要实时监控数据库数据的变化,例如:数据库与缓存(redis)数据的一致性,数据库中的数据变更要同步到缓存中,可能很多通过采用的方式是通过主动查询的形式不断查询数据库进行判断数据是否存在变更,这样对性能消耗比较大,实时性有延迟,并且逻辑比较复杂,postgresql数据库复制逻辑就能在数据同步时实现被动通知的模式,实时性高、资源请求次数少;
类似于阿里开发的canal
工具,用于订阅通知mysql数据库的变更数据,阿里的PolarDB PostgreSQL
和腾讯的DIP
都支持postgresql数据库数据的订阅功能,有兴趣的可以了解一下,本人也会在后续的文章中整理postgresql发布订阅
的方式,因为我们也经常在工作中用到获取postgresql变更数据的场景;
复制标识:
1)为了能够复制UPDATE和DELETE操作,被发布的表必须配置有一个复制标识
,这样在订阅者那一端才能标识对于更新或删除合适的行。
2)默认情况下,复制标识就是主键(如果有主键)。也可以在复制标识上设置另一个唯一索引(有特定的额外要求)。如果表没有合适的键,那么可以设置成复制标识“full”,它表示整个行都成为那个键。不过,这样做效率很低,只有在没有其他方案的情况下才应该使用。
3)如果在发布者端设置了“full”之外的复制标识,在订阅者端也必须设置一个复制标识,它应该由相同的或者少一些的列组成。
4)如果在复制UPDATE或DELETE操作的发布中加入了没有复制标识的表,那么订阅者上后续的UPDATE或DELETE操作将导致错误。不管有没有复制标识,INSERT操作都能继续下去。
复制标识支持以下几种类型:主键、唯一索引、FULL(整行数据)
--主库删除'AAA'
hr=> delete from jobs where job_id='AAA';
ERROR: cannot delete from table "jobs" because it does not have a replica identity and publishes deletes
HINT: To enable deleting from the table, set REPLICA IDENTITY using ALTER TABLE.
REPLICA IDENTITY
建议设置成主键。PG这样做可以避免很多风险,在 MySQL进行主从复制时,有时会出现主从延迟,通常是由于没有主键或没有索引导致操作缓慢。而PG直接告诉你,如果没有REPLICA IDENTITY
,就不能进行delete和update同步。因此就不会发生更新或删除缓慢的情况。如未设定主键也可直接使用REPLICA IDENTITY FULL
。在FULL的情况下,所有列的值始终被写入WAL。这是最消耗资源的模式。我们这里只是演示,如果是大量更新删除的表,建议不要使用FULL。
INSERT
操作总是可以无视 复制标识 直接进行(因为插入一条新记录,在订阅者上并不需要定位任何现有记录;而删除和更新则需要通过复制标识 定位到需要操作的记录)。如果一个没有 复制标识 的表被加入到带有UPDATE和DELETE的发布中,后续的UPDATE和DELETE会导致发布者上报错。
复制身份与索引的正确配置:
表上的复制标识配置,与表上有没有索引是两件独立的事。尽管各种排列组合都是可能的,然而在实际使用中只有三种可行的情况,其他情况都无法正常完成逻辑复制的功能(如果不报错,通常也是侥幸)
1)表上有主键,使用默认的 default 复制标识,不需要额外配置。
2)表上没有主键,但是有非空唯一索引,显式配置 index 复制标识。
3)表上既没有主键也没有非空唯一索引,显式配置full复制标识(运行效率低,仅作为兜底方案)
postgresql复制标识问题相关推荐
- postgresql 重启记录_PostgreSQL 高可用:PostgreSQL复制和自动故障转移
原文:PostgreSQL Replication and Automatic Failover Tutorial[1] 作者:Abbas Butt 翻译整理:alitrack 1.什么是 Postg ...
- repmgr 4.3 发布,PostgreSQL 复制与故障转移管理工具
repmgr 4.3 发布了,repmgr 是一款开源的.用于 PostgreSQL 服务器集群复制管理和故障转移的工具.它扩展了 PostgreSQL 内建的 hot-standby 能力,可以设置 ...
- pg函数同步数据到mysql_将数据从PostgreSQL复制到MySQL
我目前有一个PostgreSQL数据库,因为我们使用的其中一件软件仅支持该特定数据库引擎.然后,我有一个查询,该查询汇总了应用程序中的数据并将其拆分为更有用的格式. 在我的MySQL数据库中,我有一个 ...
- PostgreSQL复制特性历史漫谈-士别三日,当刮目相看
点击▲关注 "数据和云" 给公众号标星置顶 更多精彩 第一时间直达 刘伟 刘伟,云和恩墨软件开发部研究院研究员:前微博DBA,主要研究方向为开源数据库,分布式数据库,擅长自动化 ...
- PostgreSQL操作问题(转载)
PostgreSQL操作问题 4.1)如何只选择一个查询结果的头几行?或是随机的一行? 如果你只是要提取几行数据,并且你在执行查询中知道确切的行数,你可以使用LIMIT功能. 如果有一个索引与 ORD ...
- PostgreSQL最常见问题
PostgreSQL最常见问题 常见问题 1.1)PostgreSQL 是什么?该怎么发音? 1.2)PostgreSQL 的版权是什么? 1.3)PostgreSQL 可以运行在哪些操作系统平台上? ...
- Debezium系列之:使用Debezium接入PostgreSQL数据库数据到Kafka集群的详细技术文档
Debezium系列之:使用Debezium接入PostgreSQL数据库数据到Kafka集群的详细技术文档 一.概述 二.连接器的工作原理 1.安全 2.快照 3.Ad hoc snapshots ...
- flink 复postgresql数据库数据
1对操作用户进行权限设置 详见下文pg创建流复制账号步骤2.然后通过命令或者利用代码进行数据库数据的复制 安装flink 实例为1.13.6: 下载版本对应jar包 https://mvnreposi ...
- Debezium系列之:Debezium2.X之PostgreSQL数据库的Debezium连接器
Debezium系列之:Debezium2.X之PostgreSQL数据库的Debezium连接器 一.概述 二.连接器的工作原理 1.安全 2.快照 3.临时快照 4.触发临时快照 5.增量快照 6 ...
最新文章
- 用思维导图做的求婚计划,哈哈哈
- 业界丨一文详解腾讯布局AI生态的四大战略
- matlab 分子式
- 发送文件到打印机,打印机收不到(无线打印机)
- IT行业的日常工作方法 学习(转)
- php+转义实体字符,PHP针对HTML实体字符的转义函数
- 上位机获取单片机发来的数据并进行检验(完整版,附完整源码)
- java语言生日蛋糕代码_AcWing 168. 【Java】生日蛋糕
- python中的leap_Python-规则打破了leap年?
- r语言初学者指南_由R入统:R语言统计学类书籍推荐
- opencv模板匹配matchTemplate
- 红米k40关闭开发者模式教程介绍
- 导航系统中里程计研究综述
- 【ZYNQ】IP核_DDR4_SDRAM(MIG)的详细介绍
- Nginx的rewrite地址重写
- 6岁就获吉尼斯世界纪录!这届10后程序员「小鬼当家」
- 解决win10部分程序文本乱码,亲测有效
- 408计算机网络04-HTTP 长连接短连接使用场景是什么
- 云宏广东省中医院虚拟化管理平台
- 会计专业为什么要学python-财务人要学Python吗?
热门文章
- JS 流行库(七):WOW
- Hitchhiker 部署
- Struts(JFIS)
- 【2023 年第十三届 MathorCup 高校数学建模挑战赛】A 题 量子计算机在信用评分卡组合优化中的应用 详细建模过程解析及代码实现
- PHP自学之路----会话技术(cookie session)
- 9【c++入门】system函数详解
- 坚果Pro2手机-搭建本地天堂2单机服务器
- 利用js点击小眼睛图片实现转换明文暗码的效果
- linux testlink 安装,在ubuntu上安装TestLink指南
- HP ElitedeskProDesk更新win10十月更新蓝屏 WDF VIOLATION