【DWS扩容】手动重分布表

举报
金哲 发表于 2024/08/25 16:10:05 2024/08/25
【摘要】 在特殊场景下,对部分无法自动重分布的表进行手工重分布

步骤1dump表定义,主要确定表的依赖和授权情况

执行命令:

gs_dump database_name -p port -t schema.table -s --include-depend-objs > schema.table.sql

步骤2:根据dump结果获取手工重分步对象的定义和属主权限SQL

vim schema.table.sql

只需要create table和alter 权限部分。

如下示例:

步骤3:修改对象名称,创建临时对象

将SQL中对象的名称从schema.table修改为schema.table_temp

如下示例:

步骤4:导入数据

4.1 修改原表为只读

alter table schema.table set (append_mode=read_only);

4.2 临时表导入数据使用分区并发的方式

set session_timeout = 0;

set statement_timeout = 0;

set sql_use_spacelimit = -1;

set temp_file_limit = -1;

set enable_analyze_check = off;

set enable_cluster_resize = on;

SET enable_random_datanode=off;

SET max_query_retry_times=0;

SET autoanalyze=off;

SET ddl_lock_timeout=0;

-- SET behavior_compat_options = 'disable_including_all_mysql'; --注意保留原有参数

\parallel on 8

insert into schema.table_temp select * from schema.table PARTITION("p1");

insert into schema.table_temp select * from schema.table PARTITION("p2");

\parallel off

步骤5:创建索引、权限

vim schema.table.sql

从备份定义中获取到索引创建SQL,注意修改对象名称

如下示例:

修改后的SQL示例:

步骤6检查数据一致

select count(*) from schema.table;

select count(*) from schema.table_temp;

结果一致,执行后续步骤;结果不一致,truncate后重新导入。

步骤7修改定义名称

begin;

alter table schema.table rename to schema.table_old;

alter table schema.table_temp rename to schema.table;

alter table schema.table_old set (append_mode=off);

commit;

步骤8删除原始表

方案1直接删除原始表

drop table schema.table_old;

方案2:创建临时nodegroup将原始表迁移。后续确认数据正常后,直接删除nodegroup上的对象和nodegroup

生成创建nodegroup的语句并执行

SELECT 'CREATE NODE GROUP skip_nodegroup WITH (' || (SELECT pg_catalog.string_agg(node_name,',') || ');' FROM pg_catalog.pgxc_node n WHERE n.oid in (SELECT pg_catalog.unnest(group_members))) FROM pgxc_group WHERE in_redistribution='y';

执行生成的SQL:

SET xc_maintenance_mode=ON;

生成的创建SQL语句

导入buckets数据并赋权

获取原始nodegroup名称

SELECT group_name FROM pgxc_group WHERE in_redistribution='n' and group_name!='skip_nodegroup';

导入buckets数据并赋权

ALTER NODE GROUP skip_nodegroup COPY BUCKETS FROM xxxxx; -- xxxxx是原始node group名

GRANT ALL ON NODE GROUP skip_nodegroup TO PUBLIC;

切换老对象定义的nodegroup

SET enable_cluster_resize=ON;

ALTER TABLE schem.table_old TO GROUP skip_nodegroup;

SET enable_cluster_resize=OFF;

后续确认删除

drop table schema.table_old;

drop node group skip_nodegroup;

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。