注册
DMDPC分区表数据迁移练习
培训园地/ 文章详情 /

DMDPC分区表数据迁移练习

2022/12/13 1206 0 0

1 系统架构
仅作为对象管理练习,使用DPC架构如下:
image.png
详情如下:
image.png
2 一些概念
DPC引入了一个分区组的概念,是将水平分区表创建时使用的分区规则提取成一个独立的逻辑概念。用于定义分区的类型、数量和字段类型等信息,可在创建分区表时引用。创建分区表时,引用相同分区组的分区表将拥有同样的分区方式,优化器可以使用这些信息构建优化的执行计划。不同分区组可以使用相同的分区定义,使用不同的存储项。表空间组可以理解为表空间上一层的逻辑管理概念。
image.png
BG称为BP组,是RAFT组的集合,一个BP组由一个或多个BP实例组成,这些实例可以来自不同的BP域,也可以来自同一BP域。各个BP组所包含的RAFT组互不相关。可作为DPC系统中所有RAFT组集合的全集或子集,甚至可以为空集。用于简化建表时对存储BP的指定,所以BG不是必须创建的。

指定BP组创建的分区表的数据,其数据按子表为单位分布在不同的组内BP上。一个子表的数据只能属于一个BP,一个BP可以管理多个子表。其具体分布方式按分区类型以及分区数量的不同,由系统确定。

3 数据迁移
基于分区的迁移方式将分区表中的一个子分区从一个表空间迁移到另一个表空间,注意如果使用基于分区的迁移方式,创建表时不允许使用分区组,并且分区迁移方式不支持整表迁移。
测试数据如下:

CREATE TABLESPACE TS_1 DATAFILE 'TS_1_01.DBF' SIZE 128 STORAGE( ON RAFT_1);
CREATE TABLESPACE TS_2 DATAFILE 'TS_2_01.DBF' SIZE 128 STORAGE( ON RAFT_2);
CREATE TABLESPACE TS_3 DATAFILE 'TS_3_01.DBF' SIZE 128 STORAGE( ON RAFT_3);

SP_TS_GROUP_CREATE('TSG_1', 'tablespace group1');
SP_TS_GROUP_ADD_TS('TSG_1', 'TS_1');
SP_TS_GROUP_ADD_TS('TSG_1', 'TS_2');

CREATE USER USER_1 IDENTIFIED BY 123456789 DEFAULT TABLESPACE GROUP TSG_1;
CREATE USER USER_2 IDENTIFIED BY 123456789 DEFAULT TABLESPACE TS_3;
GRANT DBA,RESOURCE,PUBLIC,SOI,VTI TO USER_1;
GRANT DBA,RESOURCE,PUBLIC,SOI,VTI TO USER_2;

CREATE PARTITION GROUP PG1 PARTITION BY HASH(BIGINT) PARTITIONS 8 STORAGE (ON TS_1,TS_2);
CREATE PARTITION GROUP PG2 PARTITION BY HASH(BIGINT) PARTITIONS 8 STORAGE (ON TS_2,TS_1);

CREATE TABLE USER_1.TEST11
        (       C1 VARCHAR(100),
                C2 FLOAT       ,
                C3 DOUBLE      ,
                C4 INT         ,
                C5 BIGINT      ,
                C6 INT )
PARTITION BY RANGE(C4, C5, C6) (
PARTITION P1 VALUES LESS THAN(10,10, 10) STORAGE(ON TS_1),	
PARTITION P2 VALUES EQU OR LESS THAN(10,10, 100) STORAGE(ON TS_2),
PARTITION P3 VALUES LESS THAN(10,10,170) STORAGE(ON TS_1),
PARTITION P4 VALUES LESS THAN(10,10, 330) STORAGE(ON TS_2),
PARTITION P5 VALUES LESS THAN(MAXVALUE,MAXVALUE,MAXVALUE) STORAGE(ON TS_1)) ;

CREATE TABLE USER_1.TEST12(C1 VARCHAR(100),C2 FLOAT,C3 DOUBLE, C4 INT, C5 BIGINT , C6 INT) USING PARTITION GROUP PG1  BY (C5);

CREATE TABLE USER_2.TEST21 (ID INT,NAME VARCHAR(10));


INSERT INTO USER_1.TEST11 SELECT LEVEL,LEVEL,LEVEL,LEVEL,LEVEL,LEVEL FROM DUAL CONNECT BY LEVEL < 1000;

INSERT INTO USER_1.TEST12 SELECT LEVEL,LEVEL,LEVEL,LEVEL,LEVEL,LEVEL FROM DUAL CONNECT BY LEVEL < 10000;

INSERT INTO USER_2.TEST21 VALUES(1, 'YU');

COMMIT;

3.1 基于分区的迁移
将分区表中的一个子分区从一个表空间迁移到另一个表空间。如果使用基于分区的迁移方式,创建表时不允许使用分区组,并且分区迁移方式不支持整表迁移。
将TEST11表的P5子分区从TS_1组快速迁移到TS_2组,然后再迁移回RAFT_1组。

--将P5子分区从当前组(TS_1组)快速迁移到TS_2组
ALTER TABLE USER_1.TEST11 MOVE PARTITION P5 TO TS_2 FAST; 
--将P5子分区从当前组(TS_2组)迁移到RAFT_1组
ALTER TABLE USER_1.TEST11 MOVE PARTITION P5 TO TS_1;

尝试迁移TEST12报错,因为该表是创建在PG上的。
image.png
3.2 基于分区组的迁移
基于分区组的迁移方式是将整个分区表从一个分区组迁移到另外一个分区组。通过改变分区组的方式达到改变RAFT组的目的。基于分区组方式的迁移仅支持整表迁移。

--将TEST12表从当前组(PG1)快速迁移到PG2组
alter table USER_1.TEST12 move to pg2 fast;
--将TEST12表从当前组(PG2)迁移到PG1组
alter table USER_1.TEST12 move to pg1;

尝试迁移TEST11报错,因为该分区表没有使用PG创建。
image.png

3.3 基于表空间的迁移
相比于前述的两种分区方式的表级迁移方案,基于表空间的迁移效率更高,对系统正常运行影响更小。
使用READ ONLY只读方式(默认方式),将表空间TS_1迁移到RAFT_2上。

alter tablespace ts_1 move to raft_2;
--或者
alter tablespace ts_1 move to raft_2 read only;

例如,使用NOT READ ONLY读写方式,将表空间TS_1迁移回RAFT_1上。

alter tablespace ts_1 move to raft_1 not read only;

3.3.1 脱机方式
所有节点正常退出的情况下,可以直接手动拷贝表空间文件到目标BP上,然后通过辅助步骤修改字典/控制文件以及更新系统表。
3.3.1.1 状态确认
查看当前表空间路径信息,当前TS_3表空间位于BP3节点:

SELECT PATH FROM V$DATAFILE WHERE PATH LIKE '%TS%' ORDER BY PATH;

image.png

3.3.1.2 变更MP配置
实测通过SP、MP节点均可以正常发起变更命令,无需单独登录MP执行。手册要求先退出所有BP,可能是防止存在操作用户表空间的情况。个人推荐的操作顺序是停SP,登录MP发起变更命令,再停各节点,再进行后续操作。

[dmdba@test-64 ~]$ /opt/dmdbms/bin/DmServiceDMDPC_MP1 start
[dmdba@test-64 ~]$ /opt/dmdbms/bin/disql SYSDBA/SYSDBA@192.168.23.64:5238
SQL> SP_DPC_MOVE_TS_OFFLINE('TS_3','RAFT_2');

3.3.1.3 正常退出所有节点

[dmdba@test-61 ~]$ /opt/dmdbms/bin/DmServiceDMDPC_SP1 stop
[dmdba@test-62 ~]$ /opt/dmdbms/bin/DmServiceDMDPC_BP1 stop
[dmdba@test-63 ~]$ /opt/dmdbms/bin/DmServiceDMDPC_BP2 stop
[dmdba@test-65 ~]$ /opt/dmdbms/bin/DmServiceDMDPC_BP3 stop
[dmdba@test-64 ~]$ /opt/dmdbms/bin/DmServiceDMDPC_MP1 stop

3.3.1.4 拷贝目标表空间文件

[dmdba@test-65 ~]$ scp /opt/dmdbms/data/BP3/TS_3_01.DBF 192.168.23.63:/opt/dmdbms/data/BP2/TS_3_01.DBF

3.3.1.5 修改源库控制文件

[dmdba@test-65 ~]$ /opt/dmdbms/bin/dmctlcvt TYPE=1 SRC=/opt/dmdbms/data/BP3/dm.ctl DEST=/opt/dmdbms/data/BP3/dmctl.txt

[dmdba@test-65 ~]$ cp /opt/dmdbms/data/BP3/dmctl.txt /opt/dmdbms/data/BP3/dmctl.txt.bak

[dmdba@test-65 ~]$ vi /opt/dmdbms/data/BP3/dmctl.txt

删除TS3表空间相关的内容(以下内容)

#===============================================

# table space name
ts_name=TS_3
 # table space ID
ts_id=17
# table space status
ts_state=0
# table space cache
ts_cache=NORMAL
# DSC node number
ts_nth=0
# DSC optimized node number
ts_opt_node=0
# table space create time
ts_create_time=DATETIME '2022-8-26 8:15:58'
# table space modify time
ts_modify_time=DATETIME '2022-8-26 8:15:58'
# table space encrypt flag
ts_encrypt_flag=0
# table space copy num
ts_copy_num=0
# table space region size flag
ts_size_flag=0
# table space region huge size flag
ts_huge_size_flag=0

#-----------------------------------------------

# file path
fil_path=/opt/dmdbms/data/BP3/TS_3_01.DBF
# mirror path
mirror_path=
# file id
fil_id=0
# whether the file is auto extend
autoextend=1
# file create time
fil_create_time=DATETIME '2022-8-26 8:15:58'
# file modify time
fil_modify_time=DATETIME '2022-8-26 8:15:58'
# the max size of file
fil_max_size=0
# next size of file
fil_next_size=0


#===============================================

转回控制文件

[dmdba@test-65 ~]$ /opt/dmdbms/bin/dmctlcvt TYPE=2 SRC=/opt/dmdbms/data/BP3/dmctl.txt DEST=/opt/dmdbms/data/BP3/dm.ctl

3.3.1.6 修改目标库控制文件

[dmdba@test-63 ~]$ /opt/dmdbms/bin/dmctlcvt TYPE=1 SRC=/opt/dmdbms/data/BP2/dm.ctl DEST=/opt/dmdbms/data/BP2/dmctl.txt

[dmdba@test-63 ~]$ cp /opt/dmdbms/data/BP2/dmctl.txt /opt/dmdbms/data/BP2/dmctl.txt.bak

[dmdba@test-63 ~]$ vi /opt/dmdbms/data/BP2/dmctl.txt

添加上一步骤删除的部分(注意变更next_ts_id以及路径的修改)

#===============================================

# table space name
ts_name=TS_3
 # table space ID
ts_id=17
# table space status
ts_state=0
# table space cache
ts_cache=NORMAL
# DSC node number
ts_nth=0
# DSC optimized node number
ts_opt_node=0
# table space create time
ts_create_time=DATETIME '2022-8-26 8:15:58'
# table space modify time
ts_modify_time=DATETIME '2022-8-26 8:15:58'
# table space encrypt flag
ts_encrypt_flag=0
# table space copy num
ts_copy_num=0
# table space region size flag
ts_size_flag=0
# table space region huge size flag
ts_huge_size_flag=0

#-----------------------------------------------

# file path
fil_path=/opt/dmdbms/data/BP2/TS_3_01.DBF
# mirror path
mirror_path=
# file id
fil_id=0
# whether the file is auto extend
autoextend=1
# file create time
fil_create_time=DATETIME '2022-8-26 8:15:58'
# file modify time
fil_modify_time=DATETIME '2022-8-26 8:15:58'
# the max size of file
fil_max_size=0
# next size of file
fil_next_size=0


#===============================================

转回控制文件

[dmdba@test-63 ~]$ /opt/dmdbms/bin/dmctlcvt TYPE=2 SRC=/opt/dmdbms/data/BP2/dmctl.txt DEST=/opt/dmdbms/data/BP2/dm.ctl

3.3.1.7 正常启动各节点

[dmdba@test-64 ~]$ /opt/dmdbms/bin/DmServiceDMDPC_MP1 start
[dmdba@test-61 ~]$ /opt/dmdbms/bin/DmServiceDMDPC_SP1 start
[dmdba@test-62 ~]$ /opt/dmdbms/bin/DmServiceDMDPC_BP1 start
[dmdba@test-63 ~]$ /opt/dmdbms/bin/DmServiceDMDPC_BP2 start
[dmdba@test-65 ~]$ /opt/dmdbms/bin/DmServiceDMDPC_BP3 start

3.3.1.8 验证结果

经测试,能够正常查询原表空间上的数据,脱机迁移成功。
3.4 问题处理
3.4.1 脱机迁移目标库启动报错

[dmdba@test-63 bin]$ /opt/dmdbms/bin/DmServiceDMDPC_BP2 start
Starting DmServiceDMDPC_BP2:                               [ FAILED ]
[ERROR] database P0000016881 T0000000000000016881  ctl_read_from_file fail: invalid next ts id. path: '/opt/dmdbms/data/BP2/dm.ctl', id: (17, 17)
[FATAL] database P0000016881 T0000000000000016881  ctl file info get failed

报错信息显示next_ts_id无效,检查发现刚才拷贝过来的表空间文件的id占用了该值,将next_ts_id值加1,重新转换控制文件,实例正常启动。

3.4.2 脱机迁移源库启动报错

[dmdba@test-65 bin]$ /opt/dmdbms/bin/DmServiceDMDPC_BP3 start
Starting DmServiceDMDPC_BP3:                               [ FAILED ]
[FATAL] database P0000017275 T0000000000000017275  nsvr_check_ts_raft_id_valid_with_ctl failed, local tablespace not exist, ts_name[TS_3] ts_id[17] ts_raft_id[2] code = -3419
[FATAL] database P0000017275 T0000000000000017275  nsvr_check_ts_raft_id_valid_with_ctl failed, code = -3419

这里可以看到报错信息中的ts_raft_id仍然为修改之前的,说明MP上的命令没有在该BP节点生效。
将MP执行SP_DPC_MOVE_TS_OFFLINE的命令放在停止各节点服务之前,报错消失,迁移正常完成。

3.4.3 脱机迁移后实例启动OK但连接不正常
MP查询不正常:

SQL> SELECT PATH FROM V$DATAFILE WHERE PATH LIKE '%TS%' ORDER BY PATH;
未选定行

已用时间: 14.844(毫秒). 执行号:1500.

客户端工具连接SP不正常
image.png
检查BP2实例日志,发现以下报错:

[ERROR] database P0000009055 T0000000000000009055  os_file_open_low_real error! desc: No such file or directory, path: /opt/dmdbms/data/BP3/TS_3_01.DBF, code: 2

原来是这次操作忘记改控制文件中的路径了。修改后重新生成控制文件,重启BP2实例,MP查询以及客户端连接均恢复正常。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服