2021-05-14 kk日记,TBASE数据表更换shard key

2 篇文章 0 订阅

一、背景

由于前期在进行数据导入时没有特别指定shard key,系统etl工具自动选择,导致当前的shard key不符合系统设计需求,需要重新构建分布键。

 

二、问题

如何重新构建shard key?

 

三、思路如下

1、 查阅相关资料及咨询tbase 产品技术支持,当前tbase是不支持在线更换table 的shard key。 

2、 更换tbase 的shard key 采用离线方式进行,过程如下:

  •  按一定规则生成需要更换shard key的表
select
(select relname||(select description from pg_description where objoid=oid and objsubid=0) as comment from pg_class where oid=a.attrelid) as table_name
from pg_attribute a
where attstattarget=-1 and attrelid in (select oid from pg_class where relname in(select relname from pg_class where relkind ='r' and relname like 'sale%'))
and attname='sale_no'
order by table_name,a.attnum;

 

  • 导出表结构

        将上一步生成的表名放在一个txt文本里,然后通过sh 脚步导出结构。

export PGHOME=/work/tbase/user_1/tdata_01/wxj_poc_2/5.02.2/install/tbase_pgxz/

export LD_LIBRARY_PATH=$PGHOME/lib:{$LD_LIBRARY_PATH}

export PATH=$PGHOME/bin:$PATH

for t in  $(cat ./tablename.txt)

do

echo $t

pg_dump -h 192.168.0.1 -p 11379 -U tbase -d dev  -s  -t $t  >  /work/backup/$t.sql

done

备注: pg_dump 最后使用tbase自带的, -s 只导出表结构       -t 导出指定的表名

  • 替换表结构的关键字

     把新的表放在同一个库里不同的schema下,所以采用sed 方式快速更改建表信息。

#替换search path 方便导入
sed -i 's#SET search_path = sale, pg_catalog#SET search_path = public, pg_catalog# ' *.sql

#替换shard key
sed -i 's#SHARD (id)#SHARD (sale_no)#' *.sql

#替换主键和唯一索引
sed -i 's#PRIMARY KEY (id)#PRIMARY KEY (dealer_no,id)#' *.sql

#这里重复,我觉得可以去掉。
sed -i 's#btree (id)#btree (dealer_no,id)#' *.sql  
  • 创建表

替换完结构,就可以构建了。

export PGHOME=/work/tbase/user_1/tdata_01/wxj_poc_2/5.02.2/install/tbase_pgxz/

export LD_LIBRARY_PATH=$PGHOME/lib:{$LD_LIBRARY_PATH}

export PATH=$PGHOME/bin:$PATH

for t in  $(cat ./tablename.txt)

do

echo $t

psql -h 192.168.0.1 -p 11379 -U tbase -d dev   <   /work/backup/$t.sql

done

 

抽查是否已经按sale_no 分布

select n.nspname,c1.relname,a.attname
from 
    pg_attribute a
    join pgxc_class c on a.attrelid = c.pcrelid and a.attnum = c.pcattnum
    join pg_class c1 on c.pcrelid=c1.oid 
    join pg_namespace n on c1.relnamespace=n.oid
where 
   c1.relname='sale_master' 
   and n.nspname='public' 
  ;
  • 导出数据

导出数据

export PGHOME=/work/tbase/user_1/tdata_01/wxj_poc_2/5.02.2/install/tbase_pgxz/

export LD_LIBRARY_PATH=$PGHOME/lib:{$LD_LIBRARY_PATH}

export PATH=$PGHOME/bin:$PATH

for t in  $(cat ./tablename.txt)

do

echo "begin----"$t

pg_dump -h 192.168.0.1 -p 11379 -U cbs_dev -d dev  -a  -t $t  >   /work/backup/"$t"_data.sql

echo "finish-----"$t

done
  • 导入数据
修改search_path

sed -i 's#SET search_path = sale, pg_catalog#SET search_path = public, pg_catalog# '  sale*data.sql

export PGHOME=/work/tbase/user_1/tdata_01/wxj_poc_2/5.02.2/install/tbase_pgxz/

export LD_LIBRARY_PATH=$PGHOME/lib:{$LD_LIBRARY_PATH}

export PATH=$PGHOME/bin:$PATH

for t in  $(cat ./tablename.txt)

do

echo "begin----"$t

psql -h 192.168.0.1 -p 11379 -U tbase -d dev <  /work/backup/"$t"_data.sql

echo "finish-----"$t

done

数据导入后,记得要检查是否完整。

  • drop table

删除原来的tbale ,同样可以用上面对sql 语句拼凑脚步。

注意这里drop table 如果被视图引用了,是不能drop的。这时要备份好view, 然后drop table XX cascade;   这个设计不太好。

  • 更换原表的schema

最后把public下table采用如下命令,改一下schema就可以了。

alter table  public.sales set schema sale;

批量生成脚本,自行拼凑就可以了。

 

  • 补上drop掉的视图

四、结尾

到此为止,数据表重新完成shard key 的指定。

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值