求问DataWorks中数据集成实时同步出错 The replica identity of tables you selected is not full 是为啥?源表是有主键的?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在DataWorks中进行数据集成实时同步时,如果出现错误提示 "The replica identity of tables you selected is not full",即使源表有主键,也可能是因为PostgreSQL数据库的 replica identity 设置不符合实时同步的要求。
PostgreSQL 数据库在进行逻辑复制(如实时同步)时,需要为每张表设置 replica identity。该设置决定了在更新或删除操作时,如何标识受影响的行。默认情况下,PostgreSQL 的 replica identity 是 DEFAULT,即仅使用主键来标识行。然而,在某些场景下,实时同步任务要求将 replica identity 设置为 FULL,以确保所有列的旧值都能被记录到 WAL(Write-Ahead Logging)日志中。
如果未手动设置 replica identity 为 FULL,即使表有主键,实时同步任务仍可能报错。
要解决此问题,您需要对源表执行以下 SQL 命令,将 replica identity 设置为 FULL:
ALTER TABLE [tableName] REPLICA IDENTITY FULL;
确认当前表的 replica identity 设置
您可以通过以下 SQL 查询当前表的 replica identity 配置:
SELECT relname, relreplident
FROM pg_class
WHERE relkind = 'r' AND relname = '[tableName]';
relreplident 的值含义如下:
d:默认值,仅使用主键。n:无 replica identity。f:FULL,记录所有列的旧值。i:使用索引。修改 replica identity 为 FULL
如果查询结果显示 relreplident 不是 f,则需要执行以下命令:
ALTER TABLE [tableName] REPLICA IDENTITY FULL;
重新启动实时同步任务
修改完成后,重新启动 DataWorks 的实时同步任务,检查是否解决问题。
FULL 会增加 WAL 日志的大小,因为每次更新或删除操作都会记录所有列的旧值。因此,请根据实际业务需求权衡性能与同步需求。ALTER TABLE 命令需要具备足够的权限,确保操作用户具有 ALTER 权限。此问题的根本原因是 PostgreSQL 表的 replica identity 设置不满足实时同步的要求。通过将表的 replica identity 设置为 FULL,可以解决该问题并确保同步任务正常运行。
DataWorks基于MaxCompute/Hologres/EMR/CDP等大数据引擎,为数据仓库/数据湖/湖仓一体等解决方案提供统一的全链路大数据开发治理平台。