搭建逻辑复制一般是为了迁移数据,所以并不要求从库只能只读,我们需只要搭建好两台 postgresql 就行了。

搭建逻辑复制需要把wal_level 修改成logical ,从库需要有主库配置要同步的表结构。

我们可以先把主库上的所有表结构导出来(不包括数据),然后去从库上执行。

pg_dump -U postgres -d postgres --schema-only --no-owner --no-privileges > $PGDATA/schema.sql
#把表结构导入从库
psql -h 从库IP -U postgres -d 数据库名 -f schema.sql
#两台都要
postgesql.conf 修改 wal_level = logical
pg_hba.conf 新增上 host    replication     all             0.0.0.0/0               md5

主库上执行

CREATE PUBLICATION alltables FOR ALL TABLES;

从库上执行

CREATE SUBSCRIPTION mysub CONNECTION 'host=10.20.0.6 port=5432 user=postgres dbname=postgres password=postgres' PUBLICATION alltables;

如果执行的时候发现从库没有主库的表结构,则会报错“SQL 错误 [42P01]: ERROR: relation "XXXXX" does not exist”

当创建完SUBSCRIPTION 之后主库的数据就会马上同步到从库,因为copy_data 默认为 true。接下来就是各种做实验了,在主库上插入更新删除各种数据,看看从库会不会同步到。

建立好逻辑复制后,pg 会自动帮我们建立一个逻辑复制槽

select * from pg_replication_slots ;
Name               |Value     |
-------------------+----------+
slot_name          |mysub     |
plugin             |pgoutput  |
slot_type          |logical   |
datoid             |5         |
database           |postgres  |
temporary          |false     |
active             |true      |
active_pid         |158       |
xmin               |          |
catalog_xmin       |1434      |
restart_lsn        |4/1700FB00|
confirmed_flush_lsn|4/1701D178|
wal_status         |reserved  |
safe_wal_size      |          |
two_phase          |false     |
conflicting        |false     |

逻辑复制槽和物理复制槽有什么区别吗?个人他们的工作原理还是一样,但是逻辑复制槽在从库启动后,IO 写并不像物理复制槽那么频繁。