Semab Tariq:PostgreSQL 中的选择性列复制

Semab Tariq:PostgreSQL 中的选择性列复制

💡 原文英文,约1100词,阅读约需4分钟。
📝

内容提要

本文介绍 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)来解决重命名限制。

可以直接在订阅端表上执行更新操作吗?

可以直接更新订阅端表,但不推荐这样做,因为这会绕过复制机制,可能导致数据不一致并破坏复制过程的完整性。

为什么需要将数据存储在多个位置?

将数据存储在多个位置可以提供冗余,确保在硬件故障、自然灾害等意外事件时数据可用性。此外,它还能通过从最近的位置访问数据来提升性能,减少用户访问数据的延迟。

🏷️

标签

➡️

继续阅读