当您通过逻辑复制的方式将PolarDB PostgreSQL版(兼容Oracle)中的无主键表同步到其它数据库时,可能导致该表上的操作报错,您可以通过设置polar_create_table_with_full_replica_identity参数解决该问题。

PolarDB PostgreSQL版(兼容Oracle)的逻辑复制采用“发布-订阅”模式,可以将发布端的操作以类似SQL的形式在订阅端执行,达到数据同步的目的。为了在订阅端标识待更新或删除的数据,发布端需要配置表的复制标识。

复制标识支持以下几种类型:

  • 主键
  • 唯一索引
  • FULL(整行数据)

复制标识默认为主键,如果一个没有主键的表进行逻辑复制,会出现变更操作报错的情况,从而影响业务的正常运行。报错信息如下所示:

ERROR:  cannot delete from table "polardb_test" because it does not have a replica identity and publishes deletes
HINT:  To enable deleting from the table, set REPLICA IDENTITY using ALTER TABLE.
重要 当您使用逻辑复制(例如使用DTS进行数据同步)时,需要确保所有待同步的无主键表的复制标识均已设置为FULL

PolarDB PostgreSQL版(兼容Oracle)提供了如下两种方式将表的复制标识修改为FULL

  • 将现有表的复制标识修改为FULL,修改命令如下:
    ALTER TABLE <table_name> REPLICA IDENTITY FULL;
  • polar_create_table_with_full_replica_identity参数设置为on即可将新建表的默认复制标识设置为FULL