今天这篇文章主要是实操,给大家演示如何利用SQL语句手工创建数据多活。
实验描述:
利用数据多活同步mc.public.test_repl到postgres.public.test_repl的数据。
实验步骤:
1 首先我们连接到CN节点,创建实验用的数据库mc和实验用的表test_repl,并向test_repl插入10000条数据。
[tbase@VM-64-14-centos ~]$ psql -h 172.21.64.4 -U tbase -d postgres -p 11345
psql (10.6, server 10.0 TBase V2)
Type "help" for help.
postgres=# create database mc;
CREATE DATABASE
postgres=# c mc
psql (10.6, server 10.0 TBase V2)
You are now connected to database "mc" as user "tbase".
mc=# create table test_repl(id int primary key,name varchar(20));
CREATE TABLE
mc=# insert into test_repl select generate_series(1,10000),'test';
INSERT 0 10000
2 连接到cn节点的postgres数据库,创建与test_repl表(与mc.test_repl表结构相同)
[tbase@VM-64-14-centos ~]$ psql -h 172.21.64.4 -U tbase -d postgres -p 11345
创建test_repl表。
create table test_repl(id int primary key,name varchar(20));
3 在postgres数据库中创建订阅。
注意: 有几个DN节点,就要创建几个subscription。因为数据是从DN上通过逻辑复制过来的。
CREATE TBASE SUBSCRIPTION sub_test_4
CONNECTION 'host = 172.21.64.4 port = 11000 user = tbase dbname = mc'
PUBLICATION p_mc_public_test_repl WITH
(connect=true, enabled=true, create_slot=true, copy_data=true, synchronous_commit=on,
ignore_pk_conflict = true, parallel_number= 4 );
CREATE TBASE SUBSCRIPTION sub_test_5
CONNECTION 'host = 172.21.64.5 port = 11000 user = tbase dbname = mc'
PUBLICATION p_mc_public_test_repl WITH
(connect=true, enabled=true, create_slot=true, copy_data=true, synchronous_commit=on,
ignore_pk_conflict = true, parallel_number= 4 );
1. 检验
查看postgres.public.test_repl表,1w条数据已经成功复制过来。
在mc.public.test_repl端做dm操作,验证是否同步到postgres.public.test_repl
--查询postgres.public.test_repl
数据均已经同步到postgres.public.test_repl。
问题整理:
1 新建发布,发布表,报错如下:
select c.relname from pg_class c where c.oid =
( select indexrelid from pg_index where indrelid = ( select x.oid from pg_class x, pg_namespace n where n.nspname = 'public' and x.relname = 't1' and c.relnamespace = n.oid) and (indisunique = true or indisprimary = true ))
原因:
--数据多活使用的是逻辑复制原理,要求发布的表上必须有主键或者唯一索引,或者定义复制键,为了性能考虑,最好发布表上带有主键。
2 postgres.public.test_repl数据不完整,只同步一部分数据过来。
检查是否为所有DN节点都创建了subscription。比如有2个节点,那么在第三步的时候,就应该创建2个subscription。