问题:
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复制标识问题相关推荐

  1. postgresql 重启记录_PostgreSQL 高可用:PostgreSQL复制和自动故障转移

    原文:PostgreSQL Replication and Automatic Failover Tutorial[1] 作者:Abbas Butt 翻译整理:alitrack 1.什么是 Postg ...

  2. repmgr 4.3 发布,PostgreSQL 复制与故障转移管理工具

    repmgr 4.3 发布了,repmgr 是一款开源的.用于 PostgreSQL 服务器集群复制管理和故障转移的工具.它扩展了 PostgreSQL 内建的 hot-standby 能力,可以设置 ...

  3. pg函数同步数据到mysql_将数据从PostgreSQL复制到MySQL

    我目前有一个PostgreSQL数据库,因为我们使用的其中一件软件仅支持该特定数据库引擎.然后,我有一个查询,该查询汇总了应用程序中的数据并将其拆分为更有用的格式. 在我的MySQL数据库中,我有一个 ...

  4. PostgreSQL复制特性历史漫谈-士别三日,当刮目相看

    点击▲关注 "数据和云"   给公众号标星置顶 更多精彩 第一时间直达 刘伟 刘伟,云和恩墨软件开发部研究院研究员:前微博DBA,主要研究方向为开源数据库,分布式数据库,擅长自动化 ...

  5. PostgreSQL操作问题(转载)

    PostgreSQL操作问题 4.1)如何只选择一个查询结果的头几行?或是随机的一行? 如果你只是要提取几行数据,并且你在执行查询中知道确切的行数,你可以使用LIMIT功能. 如果有一个索引与 ORD ...

  6. PostgreSQL最常见问题

    PostgreSQL最常见问题 常见问题 1.1)PostgreSQL 是什么?该怎么发音? 1.2)PostgreSQL 的版权是什么? 1.3)PostgreSQL 可以运行在哪些操作系统平台上? ...

  7. Debezium系列之:使用Debezium接入PostgreSQL数据库数据到Kafka集群的详细技术文档

    Debezium系列之:使用Debezium接入PostgreSQL数据库数据到Kafka集群的详细技术文档 一.概述 二.连接器的工作原理 1.安全 2.快照 3.Ad hoc snapshots ...

  8. flink 复postgresql数据库数据

    1对操作用户进行权限设置 详见下文pg创建流复制账号步骤2.然后通过命令或者利用代码进行数据库数据的复制 安装flink 实例为1.13.6: 下载版本对应jar包 https://mvnreposi ...

  9. Debezium系列之:Debezium2.X之PostgreSQL数据库的Debezium连接器

    Debezium系列之:Debezium2.X之PostgreSQL数据库的Debezium连接器 一.概述 二.连接器的工作原理 1.安全 2.快照 3.临时快照 4.触发临时快照 5.增量快照 6 ...

最新文章

  1. 深度学习先驱Bengio:AI顶会论文的Deadline是时候取消了
  2. rds 数据库营销报告_千人千面的营销数智化测试,你还没做?
  3. JWT【JSON Web Token】 简述
  4. 【无码专区11】异或2(结论 / 推式子 + 哈希hash + 大整数高精度 加减乘除重载考察)
  5. springboot listener_Springboot 监听redis key的过期事件
  6. 受损虚拟机的修复方法
  7. Python 包管理工具poetry配置国内PyPI镜像源
  8. 腾讯说:云上移动开发很简单(这不是P的)!
  9. 如何识别计算机病毒,怎样识别计算机病毒
  10. 移动魔百和系统升级服务器地址,【当贝市场】移动魔百盒升级后无法观看视频怎么办...
  11. 【IOS账号分享】《帕斯卡契约》
  12. 五种线粒体呼吸链复合体研究工具
  13. X4扭曲字体或图形 coreldraw_CorelDRAWX4SP2简体中文正式版精简增强版
  14. 图像处理中“灰度级数”是什么?(灰度值)(位深度)(1bit=1位)
  15. 用户行为分析zhi应用分析模型
  16. Android 手机上获取手机当前上网IP地址(手机网关给手机号分配的IP)
  17. EVE模拟器如何设置预配
  18. 信息技术应用 中职计算机教学,新形势下信息技术在中职计算机课程教学中的应用...
  19. 01-认识产品经理:什么是合格的产品经理?其分类?岗位职责?能力素质?职业发展?
  20. d3dcompiler_47.dll缺失怎么修复

热门文章

  1. windows下浏览器检索与常用快捷键
  2. 面试题目总结(1) https中间人攻击,ConcurrentHashMap的原理 ,serialVersionUID常量,redis单线程,
  3. 本人表白失败,希望大家能够吸取我的教训
  4. Snipaste吸取色值
  5. 聊一聊“关于C语言与嵌入式的那些事”
  6. FIO工具测试IOPS简单说明
  7. python svr回归_SVR回归分析简明教程
  8. 同城货运app开发解决货运市场运输效率问题
  9. 小心手机迅雷成流量炸弹
  10. 写一篇怎样判断三角形相似的逐字稿