文章目录环境症状问题原因解决方案报错编码环境系统平台N/A版本N/A症状在配置了逻辑复制的发布端数据库中当应用程序或用户尝试对未指定同步标识的表执行数据更新UPDATE或删除DELETE操作时数据库拒绝执行该 DML 操作并返回错误。测试用例--创建不带主键的普通表createtablet8(idint,namevarchar(100));--创建逻辑复制发布CREATEPUBLICATION dbz_publicationFORTABLEt8;--插入测试数据insertintot8values(1,aaa);--检查表是否被发布highgo# \d t8Tablepublic.t8Column|Type|Collation|Nullable|Default--------------------------------------------------------------id|integer|||name|charactervarying(100)|||Publications:---该情况说明表被下面的发布所包含dbz_publication执行 DELETE 时的错误输出highgo# delete from t8 where id 2;ERROR: cannotdeletefromtablet8because it doesnothave a replicaidentityandpublishes deletes HINT:Toenabledeletingfromthetable,setREPLICAIDENTITYusingALTERTABLE.执行 UPDATE 时的错误输出highgo# update t8 set name ccc where id 2;ERROR: cannotupdatetablet8because it doesnothave a replicaidentityandpublishes updates HINT:Toenableupdating thetable,setREPLICAIDENTITYusingALTERTABLE.问题原因在逻辑复制架构中当发布端对表数据执行 UPDATE 或 DELETE 操作时数据库必须在WAL中记录被修改或删除的旧数据行标识以便订阅端能够精确定位并应用相应的数据变更。数据库通过表的REPLICA IDENTITY属性来控制在 WAL 中记录旧数据行的具体级别。该属性的默认值为 DEFAULT即系统默认依赖该表的主键来作为数据行的唯一标识。REPLICA IDENTITY 属性此属性可在pg_class中的relreplident列中查看。d默认模式使用主键。 i通过唯一索引标识。 f全行模式所有列组合作为标识。 n无副本标识仅支持 INSERT 操作发布端同样拒绝delete/update。触发上述错误的直接原因为1.被发布的表未定义主键且未指定其他形式的唯一标识。2.该表已被加入到逻辑发布中且该发布的行为配置包含了 update 和 delete 操作。在此条件下由于数据库无法在 WAL 中生成合法的唯一标识以供订阅端寻址为防止数据同步中断或产生不一致数据库解析器会在执行阶段主动拦截DELETE和UPDATE 操作并抛出异常。解决方案为恢复对该表的正常 DML 操作并保障逻辑复制的稳定性需为目标表建立合适的同步标识。需要根据业务表的实际结构从以下方案中选择最适用的一项。方案一为表添加主键推荐添加主键后表的 REPLICA IDENTITY 将自动满足默认要求无需执行额外的属性修改命令。--示例添加主键ALTERTABLEt8ADDPRIMARYKEY(id);方案二显式指定唯一索引作为副本标识若由于业务限制无法对表创建主键但表存在满足特定条件的非空唯一索引可将该唯一索引指定为同步标识。-- 1. 确保列为 NOT NULLALTERTABLEt8ALTERCOLUMNidSETNOTNULL;-- 2. 创建唯一索引CREATEUNIQUEINDEXidx_t8_idONt8(id);-- 3. 将该索引设定为逻辑复制的标识ALTERTABLEt8 REPLICAIDENTITYUSINGINDEXidx_t8_id;方案三将发布表的同步标识设置为 FULL若目标表不可以添加任何能唯一标识的列无主键且无非空唯一约束只能强制要求数据库在 WAL 中记录更新或删除操作发生时的整行完整数据此方案会在订阅端每次进行全表扫描来寻找目标行大表高压力场景下可能会导致性能问题。操作命令ALTERTABLEt8 REPLICAIDENTITYFULL;方案四评估将受到影响的表移出发布highgo# ALTER PUBLICATION dbz_publication drop table t8;ALTERPUBLICATION注意1.对于全库发布create publication … FOR ALL TABLES的情况下不2.支持移除部分表只能删除发布后手动添加需要发布的表。修改发布后需要在订阅端刷新订阅信息订阅端执行ALTERSUBSCRIPTION dbz_subscription REFRESH PUBLICATION;报错编码does not have a replica identity
被逻辑发布且未指定同步标识的表无法被delete和update
文章目录环境症状问题原因解决方案报错编码环境系统平台N/A版本N/A症状在配置了逻辑复制的发布端数据库中当应用程序或用户尝试对未指定同步标识的表执行数据更新UPDATE或删除DELETE操作时数据库拒绝执行该 DML 操作并返回错误。测试用例--创建不带主键的普通表createtablet8(idint,namevarchar(100));--创建逻辑复制发布CREATEPUBLICATION dbz_publicationFORTABLEt8;--插入测试数据insertintot8values(1,aaa);--检查表是否被发布highgo# \d t8Tablepublic.t8Column|Type|Collation|Nullable|Default--------------------------------------------------------------id|integer|||name|charactervarying(100)|||Publications:---该情况说明表被下面的发布所包含dbz_publication执行 DELETE 时的错误输出highgo# delete from t8 where id 2;ERROR: cannotdeletefromtablet8because it doesnothave a replicaidentityandpublishes deletes HINT:Toenabledeletingfromthetable,setREPLICAIDENTITYusingALTERTABLE.执行 UPDATE 时的错误输出highgo# update t8 set name ccc where id 2;ERROR: cannotupdatetablet8because it doesnothave a replicaidentityandpublishes updates HINT:Toenableupdating thetable,setREPLICAIDENTITYusingALTERTABLE.问题原因在逻辑复制架构中当发布端对表数据执行 UPDATE 或 DELETE 操作时数据库必须在WAL中记录被修改或删除的旧数据行标识以便订阅端能够精确定位并应用相应的数据变更。数据库通过表的REPLICA IDENTITY属性来控制在 WAL 中记录旧数据行的具体级别。该属性的默认值为 DEFAULT即系统默认依赖该表的主键来作为数据行的唯一标识。REPLICA IDENTITY 属性此属性可在pg_class中的relreplident列中查看。d默认模式使用主键。 i通过唯一索引标识。 f全行模式所有列组合作为标识。 n无副本标识仅支持 INSERT 操作发布端同样拒绝delete/update。触发上述错误的直接原因为1.被发布的表未定义主键且未指定其他形式的唯一标识。2.该表已被加入到逻辑发布中且该发布的行为配置包含了 update 和 delete 操作。在此条件下由于数据库无法在 WAL 中生成合法的唯一标识以供订阅端寻址为防止数据同步中断或产生不一致数据库解析器会在执行阶段主动拦截DELETE和UPDATE 操作并抛出异常。解决方案为恢复对该表的正常 DML 操作并保障逻辑复制的稳定性需为目标表建立合适的同步标识。需要根据业务表的实际结构从以下方案中选择最适用的一项。方案一为表添加主键推荐添加主键后表的 REPLICA IDENTITY 将自动满足默认要求无需执行额外的属性修改命令。--示例添加主键ALTERTABLEt8ADDPRIMARYKEY(id);方案二显式指定唯一索引作为副本标识若由于业务限制无法对表创建主键但表存在满足特定条件的非空唯一索引可将该唯一索引指定为同步标识。-- 1. 确保列为 NOT NULLALTERTABLEt8ALTERCOLUMNidSETNOTNULL;-- 2. 创建唯一索引CREATEUNIQUEINDEXidx_t8_idONt8(id);-- 3. 将该索引设定为逻辑复制的标识ALTERTABLEt8 REPLICAIDENTITYUSINGINDEXidx_t8_id;方案三将发布表的同步标识设置为 FULL若目标表不可以添加任何能唯一标识的列无主键且无非空唯一约束只能强制要求数据库在 WAL 中记录更新或删除操作发生时的整行完整数据此方案会在订阅端每次进行全表扫描来寻找目标行大表高压力场景下可能会导致性能问题。操作命令ALTERTABLEt8 REPLICAIDENTITYFULL;方案四评估将受到影响的表移出发布highgo# ALTER PUBLICATION dbz_publication drop table t8;ALTERPUBLICATION注意1.对于全库发布create publication … FOR ALL TABLES的情况下不2.支持移除部分表只能删除发布后手动添加需要发布的表。修改发布后需要在订阅端刷新订阅信息订阅端执行ALTERSUBSCRIPTION dbz_subscription REFRESH PUBLICATION;报错编码does not have a replica identity