内容提要
本文介绍 PostgreSQL 逻辑复制的选择性列复制:将 wal_level 设为 logical,在发布端指定仅复制 id、first_name、address 等列,并在多个订阅端创建同名表与订阅,实现跨服务器按列同步数据,增删改会同步到订阅端。注意表名、模式名和列名两端必须一致,否则需借助 ETL 或 FDW 解决。
延伸解读
选择性列复制的适用场景
选择性列复制适合需要减少网络带宽和存储开销的场景,例如仅同步关键列到多个地理位置的订阅端。文章示例中,发布端只复制id、first_name和address三列,忽略last_name和age,从而降低传输数据量。但需注意,订阅端表结构必须包含这些列,且主键列通常需包含在发布列中以确保复制身份。
多订阅端配置要点
文章演示了单个发布端向两个订阅端复制数据。配置时需确保每个订阅端的订阅名称唯一,例如standby1_production_subscription和standby2_production_subscription,以避免冲突。同时,发布端wal_level必须设置为logical并重启生效。订阅端需创建与发布端同名的表和模式,列名也必须一致,否则复制无法进行。
命名一致性的限制与变通
选择性列复制要求源端和目标端的表名、模式名、列名完全一致,无法在复制过程中重命名。若需调整名称,文章建议使用自定义ETL脚本或Postgres外部数据包装器(FDW)作为替代方案。ETL脚本可作为定时任务运行,但已超出逻辑复制范畴。直接更新订阅端表虽可行,但会破坏复制一致性,不推荐。
Q&A
PostgreSQL 选择性列复制是什么?它有什么好处?
选择性列复制是 PostgreSQL 逻辑复制的一项功能,允许只复制表中的特定列而不是所有列。好处包括减少网络流量和存储空间,同时保持数据库间的数据一致性。
如何配置 PostgreSQL 以支持选择性列复制?
首先在发布端将 wal_level 设置为 logical 并重启服务器。然后创建表,使用 CREATE PUBLICATION 指定要复制的列,例如:CREATE PUBLICATION production_publication FOR TABLE production (id, first_name, address); 在订阅端创建具有相同列的表,然后创建订阅。
选择性列复制对表名、模式名和列名有什么要求?
在源服务器和目标服务器上,表名、模式名和列名必须完全一致。不能更改表名、模式名或列名,否则复制将无法正常工作。
如果需要在复制时重命名表或列,有什么解决方法?
可以使用自定义 ETL 脚本,在服务器之间传输数据并调整表、模式和列名。也可以使用 PostgreSQL 外部数据包装器(FDW)来解决重命名限制。
可以直接在订阅端表上执行更新操作吗?
可以直接更新订阅端表,但不推荐这样做,因为这会绕过复制机制,可能导致数据不一致并破坏复制过程的完整性。
为什么需要将数据存储在多个位置?
将数据存储在多个位置可以提供冗余,确保在硬件故障、自然灾害等意外事件时数据可用性。此外,它还能通过从最近的位置访问数据来提升性能,减少用户访问数据的延迟。