

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 逻辑复制
<a name="logical-replication-considerations"></a>

逻辑复制是一种基于对象及其更改的复制身份来复制数据对象及其更改的方法。逻辑复制使用*发布*和*订阅*模式，其中一个或多个订阅用户会订阅发布者节点上的一个或多个发布。订阅用户从其订阅的发布中拉取数据。

逻辑复制使您能够对数据复制和安全性进行精细控制。您可将逻辑复制用于以下使用案例：
+ 在不同主要版本的 PostgreSQL 之间进行复制
+ 在不同平台（例如，Linux 到 Windows）上的 PostgreSQL 实例之间进行复制

## 架构
<a name="architecture-logical-replication"></a>

以下工作流程步骤显示了逻辑复制架构的工作原理：

1. 您拍摄发布者数据库上的数据快照，然后将该数据复制到订阅用户数据库。

1. 发布者数据库中的更改实时发送给订阅用户。

1. 订阅用户按照与发布者相同的顺序应用数据，从而保证单次订阅内发布的事务一致性。

可以在主实例（发布者）上定义*发布*。发布是一组从一个表或一组表生成的更改。您可以从 INSERT、UPDATE、DELETE 和 TRUNCATE 操作的组合中选择更改。默认情况下，所有这些更改都会复制到订阅用户数据库。这与物理复制形成对比，物理复制使用精确的数据块地址进行逐字节复制。

已发布的表必须将 [REPLICA IDENTITY](https://www.postgresql.org/docs/current/sql-altertable.html#SQL-ALTERTABLE-REPLICA-IDENTITY) 配置为复制 UPDATE 和 DELETE 操作，以便可以在订阅用户端识别要更新或删除的相应行。在大多数情况下，副本身份由主键或唯一键确定。如果主键不存在且您无法创建主键，则可以将副本身份设置为 `full`。这意味着整行数据都成为主键。我们建议您将副本身份设置为 `full` 作为最后的手段，因为此设置效率低下。

*订阅*是逻辑复制的下游端。在其中定义订阅的节点称为*订阅用户*。订阅定义与另一个数据库的连接以及要订阅的发布（一个或多个）集。

## 配置设置
<a name="config-settings"></a>

发布者设置需要以下配置：
+ 将 `wal_level` 设置为 `logical`。
+ 将 `max_replication_slots` 设置为容纳至少预期连接的订阅数量，并为表同步预留一些插槽。
+ 将 `max_wal_senders` 设置为容纳 `max_replication_slots` 和您的物理副本数量。

订阅用户设置需要以下配置：
+ 将 `max_replication_slots` 设置为容纳您计划向订阅用户添加的最少数量的订阅和一些用于表同步的预留订阅。
+ 将 `max_logical_replication_workers` 设置为容纳至少订阅数量，并为表同步预留一些 Worker。
+ 将 `max_worker_processes` 至少设置为（`max_logical_replication_workers` \+ `1`）。

每个订阅都通过一个复制槽接收更改。

以下步骤显示如何执行逻辑复制：

1. 使用 [CREATE PUBLICATION](https://www.postgresql.org/docs/10/sql-createpublication.html) 命令为源数据库中的一组表（将成为复制的一部分）创建发布者。

1. 使用 [CREATE SUBSCRIPTION](https://www.postgresql.org/docs/10/sql-createsubscription.html) 命令创建订阅用户，然后在创建订阅用户时提供发布详细信息。

1. 初始数据加载将自动开始从源数据库加载到目标数据库。

1. 复制槽捕获的更改数据将复制到目标数据库。

1. 使用 [pg\_stat\_replication](https://www.postgresql.org/docs/current/monitoring-stats.html#MONITORING-PG-STAT-REPLICATION-VIEW)（目录表）来检查复制状态。使用 [pg\_stat\_replication\_slots](https://www.postgresql.org/docs/current/monitoring-stats.html#MONITORING-PG-STAT-REPLICATION-SLOTS-VIEW) 来检查复制槽。

有关更多信息，请参阅 AWS 数据库博客中的 [Using logical replication to replicate managed Amazon RDS for PostgreSQL and Amazon Aurora to self-managed PostgreSQL](https://aws.amazon.com/blogs/database/using-logical-replication-to-replicate-managed-amazon-rds-for-postgresql-and-amazon-aurora-to-self-managed-postgresql/) 文章。

## 限制
<a name="limitations-logical-replication"></a>

我们建议您在开始迁移之前，考虑逻辑复制方法的以下限制：
+ 逻辑复制当前存在最多的限制和功能缺陷。
+ 逻辑复制无法复制数据定义语言（DDL）、序列和大型对象操作。截断操作（适用于具有外键的表）必须将相关表包含在同一个订阅中。

有关逻辑复制的更多信息，请参阅 [31.6。PostgreSQL 文档中的限制](https://www.postgresql.org/docs/current/logical-replication-restrictions.html)。