一、背景
由于前期在进行数据导入时没有特别指定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 的指定。