PostgreSQL 逻辑复制
什么是PostgreSQL逻辑复制?
PostgreSQL逻辑复制是一种数据复制技术,它允许将数据库中的特定表或数据子集复制到另一个PostgreSQL实例中。与物理复制(如流复制)不同,逻辑复制是基于逻辑层面的数据变更(如INSERT、UPDATE、DELETE)进行复制的。这使得逻辑复制更加灵活,能够实现跨版本、跨架构的复制。
逻辑复制的核心是通过**发布者(Publisher)和订阅者(Subscriber)**的机制来实现的。发布者负责将数据变更发布到逻辑复制槽中,而订阅者则从这些槽中读取变更并应用到自己的数据库中。
逻辑复制的工作原理
逻辑复制的核心组件包括:
- 发布者(Publisher):负责将 数据变更发布到逻辑复制槽中。
- 订阅者(Subscriber):从逻辑复制槽中读取变更并应用到自己的数据库中。
- 逻辑复制槽(Replication Slot):用于存储发布者的变更记录,确保订阅者不会丢失数据。
逻辑复制的工作流程如下:
- 发布者将数据变更(如INSERT、UPDATE、DELETE)记录到WAL(Write-Ahead Logging)中。
- 发布者将这些变更解码为逻辑格式,并发布到逻辑复制槽中。
- 订阅者从逻辑复制槽中读取变更,并将其应用到自己的数据库中。
配置逻辑复制
1. 在发布者端创建发布
首先,在发布者端创建一个发布(Publication),指定需要复制的表。
-- 在发布者端创建一个发布
CREATE PUBLICATION my_publication FOR TABLE my_table1, my_table2;
2. 在订阅者端创建订阅
接下来,在订阅者端创建一个订阅(Subscription),连接到发布者并开始接收数据变更。
-- 在订阅者端创建一个订阅
CREATE SUBSCRIPTION my_subscription
CONNECTION 'host=192.168.1.100 port=5432 dbname=mydb user=myuser password=mypassword'
PUBLICATION my_publication;
3. 验证逻辑复制
在发布者端插入一条数据:
-- 在发布者端插入数据
INSERT INTO my_table1 (id, name) VALUES (1, 'Alice');
在订阅者端查询数据,确认数据已成功复制:
-- 在订阅者端查询数据
SELECT * FROM my_table1;
输出结果:
id | name
----+-------
1 | Alice
(1 row)