搭建逻辑复制一般是为了迁移数据,所以并不要求从库只能只读,我们需只要搭建好两台 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 写并不像物理复制槽那么频繁。
评论