在 PostgreSQL(PG)里,REPLICA IDENTITY 这一设置在逻辑复制里起着关键作用,它能决定在复制时如何识别行。下面是关于 REPLICA IDENTITY 设置的详细介绍:
在逻辑复制过程中,当数据发生更新或者删除操作时,PostgreSQL 需要一种方式来确定哪些行受到了影响。REPLICA IDENTITY 就定义了如何唯一识别这些行。
- DEFAULT:
- 若表有主键,就使用主键来识别行。
- 若表没有主键,就使用所有列来识别行。
- 示例:
ALTER TABLE your_table REPLICA IDENTITY DEFAULT;
- USING INDEX index_name:
- 采用指定的唯一索引来识别行。此索引得是唯一索引,并且所有列都不能为
NULL。
- 示例:
- FULL:
- 用表的所有列来识别行。这种设置会使复制数据量增多,不过能保证在任何数据变更下都能准确复制。
- 示例:
ALTER TABLE your_table REPLICA IDENTITY FULL;
- NOTHING:
- 不存储任何识别信息。在更新或者删除时,不会发送足够的信息给订阅者,所以在逻辑复制中不能用于更新或者删除操作。
- 示例:
ALTER TABLE your_table REPLICA IDENTITY NOTHING;
- 性能方面:
DEFAULT 和 USING INDEX 通常能提供较好的性能,因为它们仅需跟踪少量列。而 FULL 会增加复制的开销,因为要复制所有列的数据。
- 数据完整性方面:要是表没有主键,并且有更新或者删除操作,
FULL 或者 USING INDEX 是更合适的选择,这样可以确保复制的准确性。
- 复制需求方面:若只进行插入操作,
NOTHING 或许能满足需求,因为不需要行识别信息。
你可以通过查询 pg_class 系统表来查看表的 REPLICA IDENTITY 设置:
SELECT relreplident FROM pg_class WHERE relname = 'your_table';
这里的 relreplident 取值如下:
d 代表 DEFAULT
i 代表 USING INDEX
f 代表 FULL
n 代表 NOTHING
依据你的具体复制需求和性能要求,合理选择 REPLICA IDENTITY 设置。