同步原理
使用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中,然后之后也会实时同步数据。
pgsql数据库 数据复制