pgsql数据库 数据复制


同步原理

使用pg数据库自带的逻辑复制,在主数据库中创建发布端,在从数据库中创建订阅端,这样就可以实现主数据的任何数据变化实时同步到从数据库。

 

主数据库操作流程

1.首先部署两个相同版本的pg数据库,一个叫主数据库,一个叫从数据库。

假如主数据库中包含一张名为cwgk_report_vb_cwys031的表。里面包含了很多数据,那从数据库也要包含一张名为cwgk_report_vb_cwys031的空表,记住一定要是空表(这里是防止在数据同步之前就有人修改主数据库的数据,导致产生历史数据)

 

2.在主数据库中,执行以下sql:

ALTER SYSTEM SET wal_level = 'logical';

ALTER SYSTEM SET max_replication_slots = 10;

 ALTER SYSTEM SET max_wal_senders = 10; #这里的10是取决于你想要几个逻辑复制,我这里是一张表一个逻辑复制,所以设置了10

SELECT pg_reload_conf();#看看是否生效,,如果是用容器制作的pg数据库,这样是不会生效的,要挂在目录,修改目录的配置文件才,然后重启才会生效。

 

如果你是容器的话,加上-v  /pg_data:/var/lib/postgresql/data,在pg_data里面修改配置信息即可。

 

3. SHOW max_wal_senders;#查看是否生效

 

CREATE PUBLICATION "发布1" FOR TABLE cwgk_report_vb_cwys031;#为一张表创建发布端,名字可以是英文,如果你想多张表共用一个发布端,

CREATE PUBLICATION "发布1" FOR TABLE cwgk_report_vb_cwys031,table;即可

 

4.这个时候,还需要开启表cwgk_report_vb_cwys031的REPLICA IDENTITY,来支持逻辑复制的功能。

如果你的表有主键,执行:

ALTER TABLE cwgk_report_vb_cwys031 REPLICA IDENTITY USING INDEX <your_primary_key_index>;

 

如果你的表没有主键,就像我的表一样,执行:

ALTER TABLE cwgk_report_vb_cwys031 REPLICA IDENTITY FULL;

 

这样就为一张表创建好了发布端,以后这张表的任何改动都会发送给订阅端。你可以执行

SELECT * FROM pg_publication;来看是否存在发布端

从数据库的操作流程

1.在从数据库中,执行:

ALTER SYSTEM SET wal_level = 'logical';

SELECT pg_reload_conf();

 

CREATE SUBSCRIPTION din_yue CONNECTION 'dbname= user= password= host= port=' PUBLICATION "发布1";#这里的数据需要自己根据实际情况填

 

2.执行SELECT * FROM pg_stat_subscription来看看是否创建成功。

 

此时,主数据的表cwgk_report_vb_cwys031  的数据会自动复制到从数据库的空表cwgk_report_vb_cwys031中,然后之后也会实时同步数据。

 

赵世杰 2025年1月14日
分析这篇文章

存档
登录 留下评论
Odoo性能优化实战(profiler)