pglogical插件在postgresql12上的应用总结
pglogical插件的使用在网上的帖子里讲的步骤比较混乱 很难一次成功。本文将介绍完整的步骤,以及遇到的坑,防止其他人踩坑。
环境准备:
发布端:127.0.0.1 端口 5434
订阅端: 127.0.0.1 端口 5436
步骤:
1. 发布端和订阅端分别创建扩展:
CREATE EXTENSION pglogical;
2. 发布端创建node:
SELECT pglogical.create_node(node_name := 'provider1',dsn := 'host=127.0.0.1 port=5434 user=postgres dbname=postgres');
注意:如果要指定用户,user选项必须放在dbname的前边 其他位置不可以!
3. 发布端创建复制集:
SELECT pglogical.replication_set_add_all_tables('default', ARRAY['public']);
4. 订阅端创建node
SELECT pglogical.create_node(node_name := 'subscriber1', dsn := 'host=127.0.0.1 port=5436 user=postgres dbname=postgres');
5. 订阅端创建订阅
SELECT pglogical.create_subscription(subscription_name := 'subscription1',provider_dsn := 'host=127.0.0.1 port=5434 user=postgres dbname=postgres');
注意: 此处的provider_dsn必须写成发布端的ip和端口 否则逻辑复制会失败 报各种奇怪错误。 网上很多帖子未强调这一点
6. 在发布端和订阅端分别创建要复制的表
create table test(id int primary key, name text, reg_time timestamp);
注意:发布端和订阅端的表必须名字、结构一致
7. 在发布端给表插入数据
insert into test select generate_series(1,10000),'test',now();
8. 在发布端将表加入复制集
SELECT pglogical.replication_set_add_all_tables('default', ARRAY['public']);
注意: 这种是将所有的表加入到复制集 也可以只加指定的表:
select pglogical.replication_set_add_table( set_name := 'default', relation := 'test',synchronize_data := true);
9. 验证该表已经被加入到复制集
select * from pglogical.replication_set_table ;
10. 订阅端查询订阅状态
select * from pglogical.show_subscription_table('subscription1','test');
注意:如果在第八步中采用的是第一种方式加入的复制集 那么在订阅端还需要执行以下步骤将数据同步:
select pglogical.alter_subscription_synchronize('subscription1');
否则数据无法到达订阅端 订阅状态是unknown
如果采用的是第二种方式,则默认会自动同步
这也是一个大坑!!!
11. 订阅端查看表数据是否同步
select count(*) from test;
- 点赞
- 收藏
- 关注作者
评论(0)