【DWS扩容】手动重分布表
步骤1:dump表定义,主要确定表的依赖和授权情况
执行命令:
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;
- 点赞
- 收藏
- 关注作者
评论(0)