一、背景

由于前期在进行数据导入时没有特别指定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:$PATHfor t in  $(cat ./tablename.txt)doecho $tpg_dump -h 192.168.0.1 -p 11379 -U tbase -d dev  -s  -t $t  >  /work/backup/$t.sqldone

备注: 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:$PATHfor t in  $(cat ./tablename.txt)doecho $tpsql -h 192.168.0.1 -p 11379 -U tbase -d dev   <   /work/backup/$t.sqldone

抽查是否已经按sale_no 分布

select n.nspname,c1.relname,a.attname
from pg_attribute ajoin pgxc_class c on a.attrelid = c.pcrelid and a.attnum = c.pcattnumjoin 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:$PATHfor t in  $(cat ./tablename.txt)doecho "begin----"$tpg_dump -h 192.168.0.1 -p 11379 -U cbs_dev -d dev  -a  -t $t  >   /work/backup/"$t"_data.sqlecho "finish-----"$tdone
  • 导入数据
修改search_pathsed -i 's#SET search_path = sale, pg_catalog#SET search_path = public, pg_catalog# '  sale*data.sqlexport 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:$PATHfor t in  $(cat ./tablename.txt)doecho "begin----"$tpsql -h 192.168.0.1 -p 11379 -U tbase -d dev <  /work/backup/"$t"_data.sqlecho "finish-----"$tdone

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

  • 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 的指定。

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

  1. mysql 字段写入_MySQL为数据表的指定字段插入数据

    username not null 没有默认值/有默认值   insert不插入username字段 均不报错 2014年07月23日21:05    百科369 MySQL为数据表的指定字段插入数据 ...

  2. (二)QT5.14.2连接MySQL并使用QtableView显示数据表内容

    系列文章目录 第一章:(一)QT5.14.2+MSVC2017(32位/64位)+MySQL连接 第二章:(二)QT5.14.2连接MySQL并使用QtableView显示数据表内容 文章目录 系列文 ...

  3. 2021最新仿人人车汽车品牌分类数据表文件带图标MYSQL下载

    带拼音,关联,首字母,品牌图标,图片文件已经对应好表字段值. 数据表预览: 图标预览: 下载地址:https://download.csdn.net/download/wanmeifengfeng/1 ...

  4. 项目三,创建和管理数据表

    在继续学习之前,先创建一个库,创建表,导入数据,方便后续的继续学习. 复制以下代码直接运行,会得到一个db_shop的库,已经有相关数据了. 推荐在Navicat里创建运行 安装版,附上教程 链接:h ...

  5. 2021.05.27 发表自己第一篇技术文章

    从昨晚开始做家庭财经系统.不要以为有系统两个字就怎么复杂,都是大家都会的.建库.建表. 第一个使用软件是mysql 2021.05.26 数据库 lianxi 已建好. 表 members_basic ...

  6. ADODB类库操作查询数据表

    ADODB类库下载:http://sourceforge.net/projects/adodb/files/adodb-php-4-and-5/adodb-491-for-php/adodb491.z ...

  7. 如何在数据表中存取图片 - 回复 三足乌 的问题

    问题来源: http://www.cnblogs.com/del/archive/2009/05/28/1491186.html#1801853 准备工作: 1.在空白窗体上添加: ClientDat ...

  8. python数据表元素不为空值_python 填充空值失败_怎么用 Python 做数据分析实例

    01 生成数据表 第一部分是生成数据表,常见的生成方法有两种,第一种是导入外部数据,第二种是直接写入数据. Excel 中的文件菜单中提供了获取外部数据的功能,支持数据库和文本文件和页面的多种数据源导 ...

  9. mysql 用户表结构设计_MySQL数据表结构设计

    1表结构 每个表的内容: image image image image image image image image 2表关系 天蓝色代表表中有唯一索引. image 3数据表索引与时间戳 ima ...

  10. 某电商网站的数据库设计(2)——商品销售相关数据表的设计

    某电商网站的数据库设计(2)--商品销售相关数据表的设计 目录 某电商网站的数据库设计(2)--商品销售相关数据表的设计 四.销售信息表 1.非套装商品销售数据表 2.套装商品对应的单品销售数据表 3 ...

最新文章

  1. nyoj-138-找球号(二)----hash算法之除留余数法+vector
  2. for(;;)是什么,for(;;)的作用
  3. [收集]美女与野兽——萨尔和吉安娜的绯闻
  4. 百度吹过的牛实现了,你的呢?5本书带你搞定AI前沿技术
  5. redux-observable笔记
  6. bd3.1 Python 高级
  7. file_get_contents js没有渲染数据_浏览器渲染页面那些事
  8. oracle ola_Ola HallengrenSQL Server维护解决方案–索引和统计信息维护
  9. 基于Java的Selenium学习笔记——启动Chrome
  10. Access Modify Change 三种时间戳详解
  11. Easyui datebox单击文本框显示日期选择
  12. 二年级的女儿用计算机算算术,小学二年级算术练习题(三篇)
  13. SSM毕设项目车辆维修管理系统m97p7(java+VUE+Mybatis+Maven+Mysql)
  14. python画成绩正态分布图_R统计学(09): 正态分布 (二)
  15. yED Editor Getting Start
  16. 批处理文件rd \s\q **是什么意思?
  17. MM 固定汇率的使用在MIRO的问题
  18. 免费英文在线翻译-英文自动翻译
  19. python 修改excel 路径_python更改已存在excel文件的方法
  20. 爆款短视频是怎样练成的:视频发布技巧,首次公开

热门文章

  1. 【电商数仓】数仓即席查询之Kylin简介,安装和使用
  2. 永恒之蓝漏洞紧急应对方案
  3. Linux命令之文件与文件夹的拷贝
  4. 企业网络规划和设计方案(一)
  5. matlab里数据类型转换,Matlab数据类型及转换
  6. Matlab学习笔记(一)--数值数据
  7. 积水识别 工地积水识别
  8. IAST 初探:博采众长、精准定位、DevOps友好
  9. 百度网盘 海量资源链接
  10. [edu #63][div2 #554][div3 #555]