46.2. 逻辑解码的概念

46.2.1. 逻辑解码

逻辑解码是提取数据库表的所有永久修改到一个连贯的、容易理解的格式 (不需要详细的数据库内部状态知识就可以解读)的过程。

PostgreSQL中,逻辑解码是通过解码预写日志 的内容实现的,预写日志描述了存储级别的修改,解码成一种应用特定的格式, 比如一连串的数组或SQL状态。

46.2.2. 复制槽

在逻辑复制的概念中,一个槽代表一连串的修改,这些修改可以以它们在原始服务器上制作的顺序在客户端上重放。 每个槽从一个数据库中流一系列的修改,准确发送每个修改一次(除了在流中向前窥视)。

注意: PostgreSQL也有流复制槽(参阅第 25.2.5 节), 但是它们的用法稍有不同。

一个复制槽有一个在PostgreSQL cluster的所有数据库中唯一的标识符。 槽是持久的,这独立于使用它们的连接,并且是崩溃安全的。

单个数据库中可能存在多个独立的槽。每个槽都有其自己的状态, 允许不同的消耗者从数据库修改流的不同的点接收更改。对于大多数应用来说, 每个消耗者都将需要一个单独的槽。

逻辑复制槽不知道接收者的状态。甚至可能有多个不同的接收者在不同的时间使用同一个槽; 他们将只能得到最后一个接收者停止消耗之后的修改。在任意给定的时间, 只能有一个接收者消耗槽中的修改。

注意: 复制槽在崩溃之后仍然存在,并且不知道它们的消耗者的状态。它们将阻止删除需要的资源, 即使没有连接使用它们了也是一样的。这会消耗存储,因为只要复制槽需要, VACUUM就不能从系统目录中删除不再需要的WAL或者行。 所以,如果不再需要一个槽了,就应该删除它。

46.2.3. 输出插件

输出插件将数据从预写式日志的内部表示转换到复制槽想要的消耗者的格式。

46.2.4. 导出的快照

当用流复制接口创建了一个新的复制槽时,导出一个快照(参阅第 9.26.5 节), 该快照将准确的显示数据库的状态,之后所有的修改都将包含在修改流中。这可以用来创建一个新的复制品, 可以通过使用SET TRANSACTION SNAPSHOT 读取槽创建瞬间数据库的状态。这个事务稍后可以用来转储在那个时间点的数据库状态, 之后可以使用槽的内容更新该数据库而不丢失任何修改。